在一个语句中删除所有用户对所有表的权限

时间:2018-02-16 18:23:56

标签: sql-server sql-server-2012

我正在尝试从用户删除桌面上的所有以下权限:

选择,更新,删除,插入,执行,引用,查看定义

我试过了:

REVOKE select,update,delete,insert,execute,references,view definition on schema::DBO to [user]

和此:

REVOKE select,update,delete,insert,execute,references,view definition to [user]

我并没有真正理解这种差异。我假设第一个仅适用于dbo模式中的对象,后者引用所有模式中的对象。

无论如何,如果我在SSMS中选择表并查看属性,选择“权限”,然后在顶部网格中选择用户,我会看到用户对该表的权限。 SELECT和VIEW DEFINITION行每个在底部网格中出现两次,一次使用GRANTOR为“DBO”而一次没有。

不幸的是,在我运行上述两个语句之后,用户仍然拥有GRANTOR行为dbo的权限。以下REVOKE语句将清除这些剩余权利:

REVOKE VIEW DEFINITION ON [dbo].[TableNAME] TO [USER] AS [dbo]
REVOKE SELECT ON [dbo].[TableNAME] TO [USER] AS [dbo]

但我也想删除这些权利,而不必为他的所有表单独删除。

我认为可以删除所有用户对所有表的访问权限。我如何在一个声明中这样做?

我试图避免阅读元数据和动态sql,但我尝试了这个:

DECLARE @GRANTOR        varchar(255)
DECLARE @GRANTEE        varchar(255)
DECLARE @TABLE_CATALOG  varchar(255)
DECLARE @TABLE_SCHEMA   varchar(255)
DECLARE @TABLE_NAME     varchar(255)
DECLARE @PRIVILEGE_TYPE     varchar(255)
DECLARE @SQL varchar(255)

DECLARE MyCursor CURSOR FOR

SELECT
    GRANTOR
   ,GRANTEE
   ,TABLE_CATALOG
   ,TABLE_SCHEMA
   ,TABLE_NAME
   ,PRIVILEGE_TYPE
FROM
    INFORMATION_SCHEMA.TABLE_PRIVILEGES

OPEN MyCursor

FETCH NEXT FROM MyCursor INTO     
    @GRANTOR
   ,@GRANTEE
   ,@TABLE_CATALOG
   ,@TABLE_SCHEMA
   ,@TABLE_NAME
   ,@PRIVILEGE_TYPE;

WHILE @@FETCH_STATUS = 0
BEGIN

    SET @SQL = 'REVOKE ' + @PRIVILEGE_TYPE + ' ON [' + @TABLE_SCHEMA + '].[' + @TABLE_NAME + '] TO [' + @GRANTEE + '] AS [' + @GRANTOR + ']';

            PRINT (@SQL)
    EXECUTE (@SQL)

    FETCH NEXT FROM MyCursor INTO
      @GRANTOR
    , @GRANTEE
    , @TABLE_CATALOG
    , @TABLE_SCHEMA
    , @TABLE_NAME
    , @PRIVILEGE_TYPE;


END


CLOSE MyCursor
DEALLOCATE MyCursor

我运行它没有任何错误,它留下了许多SELECT和VIEW DEFINITION权限。看起来TABLE_PRIVILEGES的查询没有返回某些特权。

1 个答案:

答案 0 :(得分:0)

这应该为你做的工作:

`deny SELECT, INSERT, DELETE, UPDATE on SCHEMA::SchemaName to user1,user2,user3

希望它能满足您的需求:)