在不知道每天有哪些表的情况下授予所有表(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):可能只有几个人使用内部应用程序,因此它是一个快速补丁,或者被全球范围内可访问的一大堆服务所使用,这将是一场噩梦。