我需要将 db_owner 分配给实例中的所有用户。实例中有几百个登录名和相同数量的数据库。我希望每个用户都能在该用户所在的数据库中获取 db_owner。我知道如何为单个用户执行此操作,但我不知道如何同时为所有用户执行此操作。
我很清楚将 db_owner 提供给每个人并不是一个好主意,但是……我们正在安装一个非常具体的应用程序。每个想要使用此应用程序的用户都需要 db_owner。我们已经尝试过绕行,但是 aplicaton 本质上是相当原始的,所以在更改应用程序代码之前,我们将不得不容忍 db_owners 的疯狂数量。无论如何,这个特定实例没有敏感数据,所以我们得到了管理层的批准。
我会使用两个游标。第一个运行所有数据库 - 除了 sys dbs。对于每个数据库,登录名将被提取并添加到 db_owner 角色中。
如果您有数百个 dbs/登录名,我会将其编写为带有一些事务处理和/或日志记录的 db,如果在执行时发生崩溃,您可以在崩溃点继续。
我无法测试下面的代码,这应该是一种如何开发自己的程序的方法
Use master
GO
DECLARE @dbname VARCHAR(50)
DECLARE @SQL_statement varchar(max)
DECLARE @chng_role NVARCHAR(MAX)
DECLARE db_cursor CURSOR
LOCAL FAST_FORWARD
FOR
SELECT name
FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL_statement = 'Declare users_cursor CURSOR FOR SELECT name FROM '+ @dbname +'.sys.database_principals where (type='''S''' or type = '''U''')'
EXEC sp_executesql @sqlstatement
OPEN users_cursor
FETCH NEXT FROM users_cursor INTO @UserName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @chng_role = 'use [' + @dbname + ']; exec sp_addrolemember @rolename = ''db_owner'', @membername = ''' + @userName + ''''
EXECUTE sp_executesql @chng_role
FETCH NEXT FROM users_cursor INTO @UserName
END
CLOSE users_cursor
DEALLOCATE users_cursor
FETCH NEXT FROM db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor
Run Code Online (Sandbox Code Playgroud)
我首先要说这是一个糟糕的、糟糕的、糟糕的主意。实例上的每个人都需要删除他们想要的任何数据库的能力吗?(可能没有备份)或截断表?或加密/解密列?等 DB_OWNER
属于行政许可,需要严格控制。老实说,我反对DB_OWNER
除了 DBA 之外的任何人都不想提供SYSADMIN
. 话虽如此,我想知道如何做事,所以这里有一个稍微简单的方法来处理它。
首先,我正在使用CONTROL database
权限。这大致相当于DB_OWNER
主要区别在于您不能向DB_OWNER
角色添加成员。接下来我将它授予PUBLIC
角色。每个人都有,PUBLIC
所以每个人都会一举获得许可。这样你只需要一个循环。仅供参考,我在此演示中使用 sp_msforeachdb,即使您不应该使用它。对于实际代码,请使用Aaron Bertrand 的替换代码。
EXEC sp_msforeachdb 'USE [?]; GRANT CONTROL ON database::[?] TO public'
Run Code Online (Sandbox Code Playgroud)
这将涵盖所有新 ID 和新数据库(也在模型中授予权限)。最好的一点是,您可以同样轻松地将其反转。
如果你因为政治原因被迫这样做,那么我会要求一些书面的东西,让你免除将要发生的不可避免的问题。
我在这里谈到不是系统管理员。我意识到它是 sysadmin 而不是 db_owner 但同样的论点也适用。
归档时间: |
|
查看次数: |
3310 次 |
最近记录: |