如何授予对所有表的 REFERENCES 权限

How to Grant REFERENCES permission to all tables

我必须授予 REFERENCES 登录权限,比如 sql_login

我可以授予 REFERENCES 个人 table 的权限,比如

GRANT REFERENCES ON Mytable TO sql_login

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

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

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) 

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) 

不确定这是实现此目标的理想方式

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

GRANT REFERENCES TO [sql_login];

请注意,REFERENCES 权限不仅仅适用于 tables。来自the documentation,也适用于:

  • 汇总
  • 组装
  • 非对称密钥
  • 证书
  • 合同
  • 数据库
  • 全文目录
  • 全文停用列表
  • 函数
  • 消息类型
  • 程序
  • 队列
  • 规则
  • 架构
  • 搜索属性列表
  • 序列对象对称密钥
  • 同义词
  • TABLE
  • 类型
  • VIEW 和
  • XML 架构集合

我这么说只是为了让您了解您可能会授予您不打算使用此方法的对象的权限。但好处是您不必再管理这些权限。也就是说,if/when 你添加一个新的 table 到你的数据库,你的用户将自动获得它的 REFERENCES 权限。