0

我对 SQL Server 安全性感到有些困惑

  • 我们有一个登录名和一个用户test

  • 我们有一张桌子dbo.tblSessionFilter

用户测试对此表没有选择和删除权限(我测试过这个!!)

  • 然后我们有一个程序

    create procedure dbo.procFilter_Clear with execute as caller 
    as
       delete from dbo.tblSessionfilter 
       where spid = @@SPID
    

用户测试对此过程有执行权。

现在,用户 test可以调用此过程并可以从表中删除条目;虽然他没有直接删除表的权限,而且程序是execute as caller

这怎么可能?

可能是因为过程和表在同一个模式中吗?

4

1 回答 1

1

请参阅所有权链

当多个数据库对象按顺序相互访问时,该顺序称为链。尽管此类链并不独立存在,但当 SQL Server 遍历链中的链接时,SQL Server 评估对组成对象的权限的方式与单独访问对象时不同。

和,

当通过链访问对象时,SQL Server 首先将对象的所有者与调用对象的所有者进行比较。这是链条中的前一个环节。如果两个对象具有相同的所有者,则不会评估对所引用对象的权限。

我的重点

于 2013-08-13T10:54:07.247 回答