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"中执行的操作的权限.
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,则会失败.在这种情况下,需要授予对表的直接许可.
小智 5
也许你可以用
“以所有者身份执行”
创建存储过程时,如下所示:
create procedure XXX
with execute as owner
as
begin
...
end
go
Run Code Online (Sandbox Code Playgroud)
然后您只需要授予用户EXECUTE存储过程的权限XXX。