可以允许 SET IDENTITY_INSERT 的权限低于 db_ddladmin 吗?

sep*_*pic 5 security sql-server permissions identity sql-server-2014

我继承了一个应用程序在sysadmin帐户下运行的系统。我限制该帐户db_datareader+ db_datawriter+EXECUTE上的所有数据库和一套extended events会议赶permission errors在服务器上。即使用户是其中的成员并且对表没有应用细粒度限制
,看到一些inserts失败也让我感到非常惊讶db_datawriter

然后我注意到只有该集合的插入IDENTITY_INSERT失败。有问题的数据库是满的identity,有太多SET IDENTITY_INSERT在他们的代码。代码不仅意味着modules存储在服务器上,还意味着C#代码。

要能够设置identity_insert用户必须拥有该表对该表具有ALTER权限。但事实是你不能ALTER只授予表,我被迫授予ALTER整个数据库的权限(user 我会让这个用户的db_ddladmin角色成员添加42 个权限(!!!) vs 51 个可以通过授予ALTER数据库添加到用户权限)

我对重构数据库不感兴趣sequence(服务器版本是2014这样我理论上可以做到)而且我不能只是添加execute as dbo到每个使用的 sp 中,identity_insert因为还有应用程序代码要重写,我只是想知道为什么微软会做出如此奇怪的事情db_datawriter无法设置的权限设计identity_insert

是否有其他方法可以使用户能够设置identity_insert将添加的权限少于db_ddladmin


更新

我试图通过提供的解决LowlyDBAsynonyms

create table dbo.t(id int identity);
go

alter schema sch transfer dbo.t;
go

create synonym dbo.t for sch.t;
go

set IDENTITY_INSERT dbo.t on;
Run Code Online (Sandbox Code Playgroud)

这导致错误

消息 1088,级别 16,状态 11,第 1 行 找不到对象“dbo.t”,因为它不存在或您没有权限。

在此处输入图片说明


仅在模式上Antoine Hernandez授予用户ALTER的解决方案似乎是邪恶的,所以我接受它

Ant*_*dez 6

我建议您通过右键单击数据库角色文件夹来创建自定义数据库角色。

在此处输入图片说明

这将调出您可以自定义的数据库角色。在第一个屏幕上,您可以为角色指定您选择的名称和所有者。您还可以添加要成为此角色成员的用户。在此处输入图片说明

完成后,您可以单击 Securables,然后您可以选择授予的内容。 在此处输入图片说明

添加对象将出现,我建议选择“所有类型的对象...”选项并单击确定。 在此处输入图片说明

在“选择对象类型”中,向下滚动以查找“架构”,选中该框,然后单击“确定”。 在此处输入图片说明

现在您将看到一个架构列表,因此选择具有您要授予权限的对象的架构,它将在下方显示该架构的权限。 在此处输入图片说明

对于本示例,我选择了 dbo 架构。我调整了默认屏幕的大小以一次显示更多。在此处输入图片说明

在这种情况下,我很可能会选择授予 Alter,因为根据Microsoft 的说法,“当授予范围时,ALTER 还赋予了更改、创建或删除(强调我的)包含在该范围内的任何安全性的能力。” 根据有关数据库权限的信息图,位于此处和下方的架构上授予更改将授予聚合、默认、函数、过程、队列、规则、同义词、表和视图上的更改:微软链接 https://aka.ms/sql-permissions-poster由于我处于这个阶段,对于同一个角色,我可能也会授予 Execute 权限,这样角色成员也可以执行任何存储过程,因此当新表或存储过程添加到数据库时,我不必修改任何允许新对象像现有对象一样工作的安全性。因此,一旦完成,选择将如下所示:在此处输入图片说明

我本可以更进一步,并授予 Select、Insert、Update 和 Delete 权限,它很可能涵盖角色读取、插入、删除和更新任何表以及执行任何存储过程所需的所有内容无需授予 db_ddladmin 角色授予的所有其他权限。通过在模式级别执行此操作,它可以在某些方面简化安全管理,尤其是当特定用户需要在模式级别拥有大量(如果不是全部)访问权限,但也满足不授予整体更改权限的要求时数据库。如果此配置授予角色不需要的其他权限,则您可以根据需要添加 DENY 权限。