【问题标题】:How to Grant REFERENCES permission to all tables如何授予对所有表的 REFERENCES 权限
【发布时间】:2016-09-29 00:54:55
【问题描述】:

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

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

GRANT REFERENCES ON Mytable TO sql_login

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

【问题讨论】:

    标签: sql sql-server sql-grant


    【解决方案1】:

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

    GRANT REFERENCES TO [sql_login];

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

    • 聚合
    • 组装
    • 非对称密钥
    • 证书
    • 合同
    • 数据库
    • 全文目录
    • 全文停止列表
    • 功能
    • 消息类型
    • 程序
    • 队列
    • 规则
    • 架构
    • 搜索物业清单
    • 序列对象对称密钥
    • 同义词
    • 表格
    • 类型
    • 查看和
    • XML 架构集合

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

    【讨论】:

    • 我只想要它单独用于表格。感谢您的帮助。
    【解决方案2】:

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

    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) 
    

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

    【讨论】:

      猜你喜欢
      • 2014-08-10
      • 2017-07-06
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2015-12-09
      • 2012-07-06
      • 2014-08-16
      相关资源
      最近更新 更多