这是情况。我正在编写一个自动化测试,它遍历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中调用的函数是否会继承调用过程的权限,除非执行权限被明确拒绝?我的代码太烂了吗?
什么?如果我创建一个proc并且不授予执行权限给你,你将不能执行它,除非你是dbo授予ProcNAme执行到UserName ...试试它创建一个proc然后尝试作为一个用户执行只读访问。当然,您可以在proc中使用EXECUTE AS,但这是另一个故事 – SQLMenace 2010-05-26 15:30:05
因此,如果DBA修改存储的proc,那么数据读取器用户运行proc,proc将以DBA的权限运行。这就是你说的,如果我正确地阅读它。这听起来很明显是错误的。 – jcollum 2010-05-26 15:32:14
是的,存储过程将在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