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