在我的SQL Server 2005数据库中,用户属于某个角色,该角色已被授予对所有存储过程的执行权限。其中一个存储过程将数据插入名为tableA
的表中。
用户已在tableA
上明确拒绝了DENY权限。但是,用户仍然可以执行存储过程来插入新数据。
有没有办法防止用户将新数据插入表中(除了将用户从具有执行权限的角色中删除)
create table tableA
(id int identity(1,1), data varchar(20)
)
create proc uspInsertTableA
(@data varchar(20))
with execute as caller
as
begin
insert into tableA
values (@data)
end
DENY INSERT On tableA TO BrianG
GRANT EXECUTE on uspInsertTableA to BrianG
BrianG,仍然可以插入数据
exec uspInsertTableA 'yada'
答案 0 :(得分:1)
有两个相关因素:
“执行”作为存储过程。
所有权链接。
“EXECUTE as CALLER”已经是默认值(CREATE PROCEDURE ... WITH EXECUTE AS CALLER ...)
此外,存储过程必须具有与TableA不同的所有者,以防止所有权链接。存储过程的所有者必须无权插入表中。
或者,您可以使用存储过程中的HAS_PERMS_BY_NAME函数来明确检查用户是否具有该权限。
if HAS_PERMS_BY_NAME('TableA','OBJECT','INSERT') = 0
raiserror ('User is not allowed to insert into TableA',16,1)
答案 1 :(得分:0)
您可以更改sproc的数据库架构吗?即。从dbo更改。插入到protected.Insert?
然后你可以拒绝exec反对这个架构?