什么是最好的方式来实现一个SQL脚本,将授予权限的数据库作用的所有用户表在一个数据库?

StackOverflow https://stackoverflow.com/questions/44780

什么是最好的方式来实现一个SQL脚本,这将给予选择,参考资料,插入、更新和删除的权限的数据库作用的所有用户表在一个数据库?

理想的情况是,这个脚本可以运行多次,作为新的表格加入该数据库。SQL服务器的管理工作室脚本生成用于各个数据库对象,但是我在寻找更多的"火和忘记"脚本。

有帮助吗?

解决方案

齐默曼博士是在正确的轨道在这里。我会写一个存储的过程,有一个标循环,通过用户使用对象的执行直接影响的授权。事情是这样的:

 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

其他提示

我肯定有一个更简单的方式,但你可以通过回对象的表中的数据库,并授予的权限的任何用户表对象的存在。然后您可以运行,多次,每当新的表格加入。

有没有证件的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;'

有点玩弄它也许可以把角色的名字成为一个参数。

我们用类似的东西,我的工作。循环,通过每一表格、观点、存储程序的系统。

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
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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top