如何向所有表授予 REFERENCES 权限

Pரத*_*ீப் 4 sql sql-server grant

我必须授予REFERENCES登录权限说sql_login

我可以授予REFERENCES单个表的权限,例如

GRANT REFERENCES ON Mytable TO sql_login
Run Code Online (Sandbox Code Playgroud)

有什么方法可以授予REFERENCES我登录所有表的权限,或者有任何错误

Ben*_*hul 8

事实证明,GRANT语句中不需要显式安全对象。也就是说,你可以说:

GRANT REFERENCES TO [sql_login];

请注意,这不仅仅是 REFERENCES 权限适用的表。从文档中,它也适用于:

  • 总计的
  • 集会
  • 不对称键
  • 证书
  • 合同
  • 数据库
  • 全文目录
  • 全文停止列表
  • 功能
  • 消息类型
  • 程序
  • 队列
  • 规则
  • 架构
  • 搜索房产清单
  • 序列对象对称键
  • 代名词
  • 桌子
  • 类型
  • 查看和
  • XML 架构集合

我这么说只是为了让您意识到您可能会授予对您不打算使用这种方法的对象的权限。但好处是您将不再需要管理这些权限。也就是说,如果/当您向数据库添加新表时,您的用户将自动获得它的 REFERENCES 权限。


Pரத*_*ீப் 4

我自己找到了一种方法来做到这一点

DECLARE @sql VARCHAR(max) = ''

SET @sql =(SELECT distinct Concat('GRANT REFERENCES ON ', TABLE_NAME, ' TO sql_login; ')
           FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
           WHERE  CONSTRAINT_TYPE IN ( 'PRIMARY KEY', 'UNIQUE' )
                  AND table_name IS NOT NULL
           FOR xml path(''))

--print @sql
EXEC (@sql) 
Run Code Online (Sandbox Code Playgroud)

sys.tables版本

DECLARE @sql VARCHAR(max) = ''

SET @sql =(SELECT Concat('GRANT REFERENCES ON ', name, ' TO sql_login; ')
           FROM   sys.tables
           WHERE  Objectproperty(OBJECT_ID, 'TableHasPrimaryKey') = 1
                  AND type = 'u'
           FOR xml path(''))

--print @sql
EXEC (@sql) 
Run Code Online (Sandbox Code Playgroud)

不确定这是实现这一目标的理想方法