sql-server - 授予自身 EXECUTE 权限的 SQL Server 存储过程
问题描述
试图搜索这个但找不到任何东西。我在生产数据库中有一些存储过程,开发人员最后添加了一个
GRANT EXECUTE ON [ProcName] to [USER1] AS [dbo]
我的敏锐感觉告诉我不应该这样做,因为所有用户访问都应该(并且是)在 SSMS 中以适当的级别进行管理。如果数据库开始真的很忙并且每次都不断地授予此访问权限,这也可能会引入死锁。
除了确保用户可能在开发过程中获得许可之外,我一生都想不出为什么需要这样做的正当理由。我打算删除它,但我只是想知道我是否遗漏了什么?
解决方案
99.999% 的机会这是一个错误。存储过程仅在批处理结束时结束。开发人员可能使用这样的 DDL 批处理创建了该过程:
create procedure foo
as
begin
print 'foo'
end
grant execute on foo to User1 as dbo --this is still part of the procedure!
go
默认情况下,存储过程作为调用者执行,调用者在没有管理员身份的情况下将无法运行该 GRANT。
在 DDL 脚本中包含 GRANT 是一种很好的做法,但是对于每个对象使用单独的 GRANT 是一种可以追溯到好的工具(如 SSDT)之前和用户模式分离之前的做法。
今天,在架构级别进行 GRANT 是一种更好的做法,因此无需为每个对象设置权限。虽然 GRANT 应该是模式设计的一部分,并且在不同环境中是相同的,但这些授权通常应该是对 SCHEMA 上的角色的 GRANT。然后在不同的环境中,ROLE 可能有不同的成员,但 GRANT 永远不会改变。
所以生产 DBA 可能会运行
ALTER ROLE APP_FRONT_END ADD MEMBER [MyDomain\AppPoolIdentity]
但不是
GRANT EXECUTE ON FOO TO [MyDomain\AppPoolIdentity]
推荐阅读
- python - 有没有办法使用余弦相似度找到 BallTree 或 KDTree 的最近邻居?
- javascript - 在 JavaScript 数组中将连续数字分组为“from~to”字符串
- php - 在函数内逐行读取 .txt 文件 - 优化 PHP 脚本以获得更好的性能
- javascript - 从一组按钮转移到另一组按钮
- angular - Angular 服务调用测试
- swiftui - 您可以将 UIViewRepresentable (UISearchBar) 添加为 navigationBarItem 吗?- 斯威夫特用户界面
- amazon-web-services - 如何通过powershell创建AWS New-Scprovisionedproduct
- java - 无论手机的屏幕尺寸如何,如何缩放粉红色框以使其完美地适合电子表格的网格?安卓工作室
- c# - 如何在基类中使用派生类属性?C#
- windows - 将批处理文件移动到具有相似名称的文件夹