我对执行存储过程所需的权限有点困惑。例如,如果你有2个表和一个从Table1读取数据并将数据插入Table2的存储过程,那么对存储过程的执行权限和对表的选择权限就足够了吗?理论上,我发现这是作为解决方案给出的,但实际上我发现用户需要对存储过程的执行权限、对表的选择权限和对 Table2 的插入权限。
我对执行存储过程所需的权限有点困惑。例如,如果你有2个表和一个从Table1读取数据并将数据插入Table2的存储过程,那么对存储过程的执行权限和对表的选择权限就足够了吗?理论上,我发现这是作为解决方案给出的,但实际上我发现用户需要对存储过程的执行权限、对表的选择权限和对 Table2 的插入权限。
不,您不需要对 Table1 和 Table2 授予显式权限,这是在存储过程中嵌入代码的目标之一,也是封装功能生效的地方。
请检查以下来自 Microsoft 的链接:
在 SQL Server 中使用存储过程管理权限
使用以下代码授予执行权限:
以上希望有所帮助。
我知道Learning_DBAdmin 的正确答案至少有一个例外:动态 SQL
想象一下
usp_Proc1
,看起来像这样:如果您对 具有“执行”权限
usp_Proc1
,则调用EXEC dbo.usp_Proc1
将正常工作。但是,如果您将执行过程更改为使用动态 SQL:
EXEC dbo.usp_Proc1;
除非您还授予用户SELECT
权限,否则调用将失败并出现权限错误dbo.TableA
。像这样使用 sp_executesql 或 EXECUTE 运行代码会在执行存储过程的上下文之外创建一个新的“批处理”。
通常,这是因为所有权链接的工作方式,这里很好地描述了这一点:破碎的所有权链 - 动态 SQL