存储过程和权限 - EXECUTE足够吗?

web*_*orm 35 sql-server permissions stored-procedures

我有一个SQL Server 2008数据库,其中对基础表的所有访问都是通过存储过程完成的.某些存储过程只是从表中SELECT记录,而其他存储过程则是UPDATE,INSERT和DELETE.

如果存储过程更新表,那么执行存储过程的用户是否还需要对受影响的表具有UPDATE权限,或者他们对存储过程具有EXECUTE权限这一事实呢?

基本上我想知道是否给用户EXECUTE权限的存储过程是否足够,或者我是否需要为表提供SELECT,UPDATE,DELETE和INSERT权限以使存储过程正常工作.谢谢.

[编辑]在我的大多数存储过程中,确实看起来EXECUTE就足够了.但是,我确实发现在使用"执行sp_Executesql"的存储过程中,EXECUTE是不够的.涉及的表需要具有在"sp_Executesql"中执行的操作的权限.

gbn*_*gbn 24

如果表和proc具有相同的所有者,则不会检查表的权限(包括DENY).只要模式具有相同的所有者,它们也可以在不同的模式中.

请参阅MSDN上的所有权链接

根据已删除答案的评论进行编辑.

除非EXECUTE AS已使用,否则上下文始终是当前登录:仅检查引用的对象DML权限.在存储过程中尝试OBJECT_ID(可引用),其中没有权限分配给referencedtable.它给出了NULL.如果由存储过程的所有者执行,那么它将给出一个值,因为owener拥有referencetable的权限


Noe*_*ams 12

对存储过程的执行权限就足够了.

CREATE TABLE dbo.Temp(n int)

GO
DENY INSERT ON dbo.Temp TO <your role>
GO
CREATE PROCEDURE dbo.SPTemp(@Int int)
AS

INSERT dbo.Temp
SELECT  @Int 

GO

GRANT EXEC ON dbo.SPTemp TO <your role>

GO
Run Code Online (Sandbox Code Playgroud)

然后(非db_owner)用户将拥有以下权限:

EXEC dbo.SPTemp 10
GO

INSERT dbo.Temp --INSERT permission was denied on the object 'Temp'
SELECT  10
Run Code Online (Sandbox Code Playgroud)

但是,如果dbo.SPTemp中存在尝试插入dbo.Temp的动态SQL,则会失败.在这种情况下,需要授予对表的直接许可.

  • 这至少是误导性的,如果没有错的话.您的示例仅起作用,因为过程的所有者和表的所有者是相同的,并且所有权链接会跳过访问检查.如果程序的所有者*不*是表的所有者,但只是拥有对它的CONTROL权限(即具有*all*权限,但不是所有者),则您的示例将失败. (7认同)

小智 5

也许你可以用

“以所有者身份执行”

创建存储过程时,如下所示:

create procedure XXX
with execute as owner
as
begin
...
end
go
Run Code Online (Sandbox Code Playgroud)

然后您只需要授予用户EXECUTE存储过程的权限XXX

  • 这对我有用。正在寻求仅通过存储过程向用户提供对表的访问,并且这有效。该表不必与存储过程属于同一架构。 (2认同)