通过存储过程阻止数据修改

时间:2012-02-26 13:56:41

标签: sql-server

在我的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'

2 个答案:

答案 0 :(得分:1)

有两个相关因素:

  1. “执行”作为存储过程。

  2. 所有权链接。

  3. “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反对这个架构?