我的公司有活动目录,我有一些在server (2014)级别创建的登录用户,我需要将这些用户传播到服务器上的所有数据库。我想在sql服务器上创建一个只读用户和一个读写用户。因此,我创建了一个与域用户匹配的用户USER_R和另一个USER_RW,在我的USER_R上,我希望分配db_datareader和db_denydatawriter,然后在用户映射部分选择所有dbs,然后单击OK,这将在我的所有dbs中创建USER_R。
问题1,如果我在服务器上恢复了一个新的数据库,并且我想分配用户USER_R,那么如何自动管理这个问题呢?
问题2,现在我有了用户USER_R,一个用户A想连接到management,他没有看到任何表或存储过程,为了让他们看到所有的对象,除了只读之外,还缺少什么呢?
发布于 2019-03-20 21:00:33
问题1,如果我在服务器上恢复了一个新的数据库,并且我想分配用户USER_R,那么如何自动管理这个问题呢?
正如所描述的这里,您可以将用户添加到模型数据库中,以便自动添加到其他已创建的数据库中。
但是对还原的数据库不起作用。
USE [model]
GO
CREATE USER [testlogin] FOR LOGIN [testlogin]
GO
USE [model]
GO
ALTER ROLE [db_datareader] ADD MEMBER [testlogin]
GO
恢复的数据库很难跟踪,艾瑞克·达林( Erik )提供的更多关于为什么生活在这篇文章中困难的信息。
不幸的是,触发器不能直接在还原的数据库上工作。
如果您在SQL Server 2016
上的位置,您可以尝试用backup_restore_progress_trace
上的扩展事件来制作一些东西,但这对您这里没有帮助。
在这种情况下,我只需将用户创建添加到还原过程中即可。
如果必须,则使用动态SQL的Either
DECLARE @SQL nvarchar(max)
SET @SQL =
'
USE ' + QUOTENAME(@RestoredDatabaseName) + '
IF NOT EXISTS (
SELECT * FROM sys.sysusers where name = ''testlogin'')
BEGIN
CREATE USER [testlogin] FOR LOGIN [testlogin];
ALTER ROLE [db_datareader] ADD MEMBER [testlogin];
END
'
EXEC(@SQL);
(只在需要时使用动态sql )
没有动态SQL的<#>Or (如果它不需要)
USE NewlyRestoredDatabase
GO
IF NOT EXISTS (
SELECT * FROM sys.sysusers where name = 'testlogin')
BEGIN
CREATE USER [testlogin] FOR LOGIN [testlogin];
ALTER ROLE [db_datareader] ADD MEMBER [testlogin];
END
此外,还可以运行作业计划,以检查用户是否存在于所有数据库中。
在执行所有这些操作时,如果用户已经存在于数据库中,则必须注意孤儿用户,并采取相应的措施。
If用户已经存在于还原的数据库中
Use NewlyRestoredDatabase
ALTER USER testlogin WITH LOGIN = testlogin
问题2,现在我有了用户USER_R,一个用户A想连接到management,他没有看到任何表或存储过程,为了让他们看到所有的对象,除了只读之外,还缺少什么呢?
我猜这个用户需要能够看到所有的对象,以及它们是什么?就像存储过程中的the语句一样?
要做到这一点,GRANT VIEW ANY DEFINITION
到登录userA
USE master
GO
GRANT VIEW ANY DEFINITION TO userA;
登录仍然需要将用户映射到它需要访问的数据库,并将其添加到public
角色(默认)。
https://dba.stackexchange.com/questions/232648
复制相似问题