实施将对数据库中所有用户表的数据库角色授予权限的SQL脚本的最佳方法是什么?
时间:2020-03-05 18:47:54 来源:igfitidea点击:
实现SQL脚本的最佳方法是什么,该脚本将授予数据库角色对数据库中所有用户表的选择,引用,插入,更新和删除权限?
理想情况下,此脚本可以运行多次,因为新表已添加到数据库中。 SQL Server Management Studio会为单个数据库对象生成脚本,但是我正在寻找更多的"即发即弃"脚本。
解决方案
回答
我敢肯定有一种更简单的方法,但是我们可以遍历数据库中的sysobjects表并向存在的任何用户表对象授予权限。然后,每当添加新表时,我们都可以多次运行该命令。
回答
齐默尔曼博士在这里是正确的方向。我希望编写一种存储过程,该过程具有游标,通过使用立即执行影响授予的方式遍历用户对象。像这样的东西:
IF EXISTS ( SELECT 1 FROM sysobjects WHERE name = 'sp_grantastic' AND type = 'P' ) DROP PROCEDURE sp_grantastic GO CREATE PROCEDURE sp_grantastic AS DECLARE @object_name VARCHAR(30) ,@time VARCHAR(8) ,@rights VARCHAR(20) ,@role VARCHAR(20) DECLARE c_objects CURSOR FOR SELECT name FROM sysobjects WHERE type IN ('P', 'U', 'V') FOR READ ONLY BEGIN SELECT @rights = 'ALL' ,@role = 'PUBLIC' OPEN c_objects WHILE (1=1) BEGIN FETCH c_objects INTO @object_name IF @@SQLSTATUS <> 0 BREAK SELECT @time = CONVERT(VARCHAR, GetDate(), 108) PRINT '[%1!] hitting up object %2!', @time, @object_name EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role) END PRINT '[%1!] fin!', @time CLOSE c_objects DEALLOCATE CURSOR c_objects END GO GRANT ALL ON sp_grantastic TO PUBLIC GO
然后,我们可以开火并忘记:
EXEC sp_grantastic
回答
在我工作的地方,我们会使用类似的东西。遍历系统的每个表,视图,存储过程。
CREATE PROCEDURE dbo.SP_GrantFullAccess @username varchar(300) AS DECLARE @on varchar(300) DECLARE @count int SET @count = 0 PRINT 'Granting access to user ' + @username + ' on the following objects:' DECLARE c CURSOR FOR SELECT name FROM sysobjects WHERE type IN('U', 'V', 'SP', 'P') ORDER BY name OPEN c FETCH NEXT FROM c INTO @on WHILE @@FETCH_STATUS = 0 BEGIN SET @count = @count + 1 EXEC('GRANT ALL ON [' + @on + '] TO [' + @username + ']') --PRINT 'GRANT ALL ON [' + @on + '] TO ' + @username PRINT @on FETCH NEXT FROM c INTO @on END CLOSE c DEALLOCATE c PRINT 'Granted access to ' + cast(@count as varchar(4)) + ' object(s).' GO
回答
我们可以使用未记录的MS过程sp_MSforeachtable,该过程肯定在2000年和2005年。
要授予选择权限,用法是:
EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName'
要授予其他权限,请为每个权限添加一条新语句,或者仅将其添加到命令中,如下所示:
EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName; Grant Delete on ? to RoleName;'
进行一些操作后,也可以将角色名称转换为参数。
回答
use [YourDb] GO exec sp_MSforeachtable @command1= "GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON ? TO Admins, Mgmt", @whereand = " and o.name like 'tbl_%'" GO use [YourDb] GO exec sp_MSforeachtable @command1= "GRANT REFERENCES, SELECT ON ? TO Employee, public", @whereand = " and o.name like 'tbl_%'" GO