首页 > 解决方案 > 授予自身 EXECUTE 权限的 SQL Server 存储过程

问题描述

试图搜索这个但找不到任何东西。我在生产数据库中有一些存储过程,开发人员最后添加了一个

GRANT EXECUTE ON [ProcName] to [USER1] AS [dbo]

我的敏锐感觉告诉我不应该这样做,因为所有用户访问都应该(并且是)在 SSMS 中以适当的级别进行管理。如果数据库开始真的很忙并且每次都不断地授予此访问权限,这也可能会引入死锁。

除了确保用户可能在开发过程中获得许可之外,我一生都想不出为什么需要这样做的正当理由。我打算删除它,但我只是想知道我是否遗漏了什么?

标签: sql-serverstored-proceduresaccess-controlgrant

解决方案


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]

推荐阅读