SQL Server:如何限制ddladmin成员建表权限及是否需自定义角色?
SQL Server ddladmin角色权限管控的解决方案
一、限制ddladmin成员仅能在指定架构执行CREATE TABLE
ddladmin作为SQL Server的固定数据库角色,默认自带ALTER ANY SCHEMA和数据库级CREATE TABLE权限,这意味着成员可以在任意架构下创建表。要把这个操作范围缩小到指定架构(比如Sales),咱们可以通过权限的 deny/grant 组合来精准控制:
- 先在数据库层面 deny 该用户的全局
CREATE TABLE权限,阻止其默认在所有架构建表:
USE YourDatabaseName; -- 替换成你的目标数据库和实际用户名 DENY CREATE TABLE TO [RestrictedUser];
- 然后在指定架构上授予该用户
CREATE TABLE权限——因为用户是ddladmin成员,已经拥有ALTER ANY SCHEMA权限(对所有架构有修改权限),所以不需要额外授予架构的ALTER权限,直接授权即可:
GRANT CREATE TABLE ON SCHEMA::Sales TO [RestrictedUser];
完成后,用户依然保有ddladmin的其他DDL权限,但只能在Sales架构下创建表,其他架构会因全局CREATE TABLE被deny而无法操作。
二、限制现有ddladmin成员无法在dbo架构建表:可行,无需自定义角色
这个需求完全可以实现,而且不需要创建自定义角色——利用SQL Server权限的优先级规则(DENY权限会覆盖从角色继承的GRANT权限)就能轻松搞定。
直接对目标用户执行deny操作,禁止其在dbo架构创建表:
USE YourDatabaseName; DENY CREATE TABLE ON SCHEMA::dbo TO [TargetUser];
执行后,哪怕用户是ddladmin成员,拥有数据库级CREATE TABLE和ALTER ANY SCHEMA权限,也无法在dbo架构下执行CREATE TABLE,但其他架构的建表操作不受影响。如果后续要取消限制,执行REVOKE CREATE TABLE ON SCHEMA::dbo TO [TargetUser];即可。
几点注意事项:
- 如果用户同时是
db_owner角色成员,CONTROL权限会覆盖DENY,这种情况该方法不适用,但单纯的ddladmin成员没问题。 - 操作前建议在测试环境验证,确保不会影响用户的其他必要业务权限。
内容的提问来源于stack exchange,提问作者Sachin Jawalkar




