2010-05-26 75 views
0

这是情况。我正在编写一个自动化测试,它遍历proc的依赖列表并确定acct是否拥有所有依赖对象的权限。做功能在sql server中有不同的权限规则吗?

我的代码如下所示:

exec sp_depends 'the_proc_name' 

-- run this query on the results of sp_depends: 

select 
case       
when exists (         
select * 
from sys.database_permissions dp 
where grantee_principal_id=USER_ID('TheAccount')          
    and major_id=object_id('dbo.theDependentObject')          
    and minor_id=0 
    and state_desc = 'GRANT') 
then 'true' 
else 'false'         
end; 

这一切似乎是做工精细,但有当它遇到一个函数一个打嗝。我有一个案例,其中TheAccount没有权限(上述查询返回false)。但是,在TheAccount下运行时,调用该函数的proc运行正常。因此,我的测试代码可能有问题,或者函数在SQL-Server中有特殊权限行为,我不知道。

我应该将代码更改为仅搜索'DENY'而不是'GRANT'吗?在proc中调用的函数是否会继承调用过程的权限,除非执行权限被明确拒绝?我的代码太烂了吗?

回答

1

从存储过程运行静态SQL时,存储过程以最后创建/修改存储过程的id的权限运行;而不是运行存储过程的人员的ID。

例如,这是一种相同的功能,允许您使用存储过程运行Insert语句,而无需在基础表上运行存储过程插入权限。

请注意 - 当您使用动态SQL(使用exec语句)时,这不适用。在这种情况下,运行存储过程的人员必须拥有该SQL语句的必要权限。

因此,我不确定您的单元测试是否会为您提供所需的内容,因为依赖对象的权利在某种程度上由SQL Server处理Stored Proc安全性的方式来处理。

+0

什么?如果我创建一个proc并且不授予执行权限给你,你将不能执行它,除非你是dbo授予ProcNAme执行到UserName ...试试它创建一个proc然后尝试作为一个用户执行只读访问。当然,您可以在proc中使用EXECUTE AS,但这是另一个故事 – SQLMenace 2010-05-26 15:30:05

+0

因此,如果DBA修改存储的proc,那么数据读取器用户运行proc,proc将以DBA的权限运行。这就是你说的,如果我正确地阅读它。这听起来很明显是错误的。 – jcollum 2010-05-26 15:32:14

+0

是的,存储过程将在DBA的权限下运行。但只有存储过程中包含的静态SQL。并且只有当您赋予存储过程的EXEC权限时才行。 这允许你创建一个存储过程,它不需要给每个人赋予插入权限;相反,你可以在存储过程中发出Exec。以下是一个示例链接,http://www.sql-server-performance.com/articles/dba/security_sp_p1.aspx。此示例适用于SQL Server 2000,但它也适用于2005和2008。 – 2010-05-26 20:39:23