如何单语句撤销用户所有表权限?解析两类撤销语句差异
撤销SQL Server表权限:两种语句的差异解析
你的推测完全在点子上!这两种撤销权限语句的核心区别,就是它们作用的范围边界——一个是精准针对dbo架构下的单张表,另一个则可以覆盖更大范围的对象(比如整个架构甚至所有架构)。下面详细拆解:
第一种:精准撤销单表权限(仅针对指定架构的特定表)
这种写法是最常用的“精准打击”,只收回用户在dbo架构下某一张特定表的指定权限:
REVOKE SELECT, UPDATE, DELETE, INSERT, EXECUTE, REFERENCES, VIEW DEFINITION ON dbo.[目标表名] TO [你的用户名];
- 适用场景:你只需要收回用户对某一张表的权限,不想影响他对其他表或其他架构对象的正常操作。
- 注意:如果你的表不在
dbo架构下,一定要替换成对应的架构名(比如sales.订单表),否则SQL Server会在当前会话的默认架构里找这张表,找不到就会报错。
第二种:批量撤销架构级权限(覆盖架构下所有对象)
如果你的第二种语句是类似下面这种,那它就是一次性撤销用户对整个架构下所有对象的权限:
REVOKE SELECT, UPDATE, DELETE, INSERT, EXECUTE, REFERENCES, VIEW DEFINITION ON SCHEMA::dbo TO [你的用户名];
这种写法会把用户在dbo架构下所有表、视图、存储过程、函数等对象的指定权限全部收回,范围比第一种大得多。
要是你需要覆盖所有架构下的对象,SQL Server没有直接的SCHEMA::*语法,得用动态SQL循环所有架构来执行:
DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += N' REVOKE SELECT, UPDATE, DELETE, INSERT, EXECUTE, REFERENCES, VIEW DEFINITION ON SCHEMA::' + QUOTENAME(s.name) + N' TO [你的用户名];' FROM sys.schemas s; EXEC sp_executesql @sql;
关于SSMS权限查看的几个关键提醒
在SSMS里右键表→属性→权限,选中用户后看到的权限,容易踩几个坑:
- 权限来源:这里显示的权限可能是直接授予的,也可能是通过数据库角色继承的(比如用户属于
db_datareader角色,就会自动有所有表的SELECT权限)。如果你用REVOKE只撤销了直接授予的权限,继承的权限还会存在,这时候要么用DENY强制拒绝(优先级高于所有授予权限),要么把用户从对应的角色里移除。 REVOKEvsDENY:REVOKE是“收回之前给的权限”,相当于回到没授权的初始状态;DENY是“强制禁止”,哪怕用户通过角色有相关权限也会失效。- 刷新视图:修改权限后,记得刷新SSMS的权限界面(或者重新打开表属性窗口),不然可能看到的还是旧的权限状态。
内容的提问来源于stack exchange,提问作者Chad
相关产品推荐
相关产品推荐

