我们的数据仓库中的每一天(将动态变化)都会删除并重建表。我们组织中的某些开发人员也可能在该数据库中创建更多表。 因此我无法授予持久性数据库的权限。
问题: 我想做一些每天运行的工作,它列出了数据库中的所有表名(当时存在的表名),例如' Select * FROM sys.tables' 然后我希望表名作为脚本的输入值,该脚本运行所有表名并将它们放在如下脚本中:
GRANT SELECT TO [Tablename1] TO [ROLE_READALLTABLES Except 1 table],
GRANT SELECT TO [Tablenaam2] TO [ROLE_READALLTABLES Except 1 table]
然后继续循环,直到所有现有表都可读。
因此,整个数据库中的所有表(1表除外)都应获得GRANT SELECT
权限。
我已经查看了所有相关的答案,但我似乎无法知道如何让它发挥作用。 我希望有人可以帮助我。
更新 我使用Microsoft SQL Server 2014,并通过SQL Management Studio 2014工作 更新2 : 有一个例外。该表有schema [dbo]。像所有其他表一样
答案 0 :(得分:0)
您可以使用db_datareader角色一般授予对所有表的访问权限,然后使用DENY规则授予对具有异常的一个表的访问权限的特定角色。
步骤大致如下:
1)创建“阅读除1个角色以外的所有人”:
CREATE ROLE [ROLE_READALLEXCEPT1]
2)像这样创建你的“拒绝”角色:
CREATE ROLE [ROLE_DENY]
GO
DENY SELECT, INSERT, UPDATE, DELETE ON myTable TO [ROLE_DENY]
GO
3)然后将“除1”角色添加到其中:
EXEC sp_addrolemember @rolename = 'ROLE_DENY', @membername = 'ROLE_READALLEXCEPT1'
4)将您的角色添加到db_datareader:
EXEC sp_addrolemember @rolename = 'db_datareader', @membername = 'ROLE_READALLEXCEPT1'
deny角色应覆盖db_datareader,最终效果是您的角色现在可以访问所有表(包括新表),但明确拒绝的表除外。
然后,您可以将用户添加到“ROLE_READALLEXCEPT1”,他们可以访问除一个例外表之外的所有内容。
答案 1 :(得分:0)
没有关于排除表的信息,所以我假设总是相同的。
我还假设所有其他表都在模式dbo
上;这不是相关的约束或限制,因为逻辑可以很容易地应用于多个模式。
最简单的解决方案是授予permission at the schema level。
将单个表移动到具有受限权限的单独模式上,并在用户表所在的整个模式上授予完全读取权:
GRANT SELECT ON SCHEMA::dbo TO [relevant role/user];
现在,开发人员可以在模式dbo
上创建他们感觉到的所有表,并且该模式会继承权限。
如果您需要授予对多个架构的访问权限,则可以轻松应用一次权限,然后每个新表都将获得适当的权限。
这个解决方案的巨大优势在于它是火和忘记:一旦到位,就没有维护,没有工作,没有每天/每周/无论什么运行的脚本。
这个优势是针对被排除表的移动进行评估和加权(或者反过来:移动用户表):可能仅被几个内部应用程序使用,因此它是一个快速补丁或被使用通过全球可访问的一大堆服务,这将是一场噩梦。