代码之家  ›  专栏  ›  技术社区  ›  jcollum

SQL Server中的函数是否具有不同的权限规则?

  •  0
  • jcollum  · 技术社区  · 14 年前

    情况就是这样。我正在编写一个自动测试,该测试将遍历进程的依赖项列表,并确定acct是否对所有依赖对象都具有权限。

    我的代码如下:

    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)。但是,调用相关函数的过程在运行时运行良好 帐目 . 所以我的测试代码有问题,或者函数在SQL Server中有我不知道的特殊权限行为。

    我是否应该将代码更改为只搜索“拒绝”而不是“授予”?在procs中调用的函数是否继承调用proc的权限,除非显式拒绝执行权限?我的代码糟糕吗?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Jeff Siver    14 年前

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

    例如,这与允许您使用存储过程运行insert语句而不授予运行基础表上存储过程insert权限的人员的功能相同。

    一个注意事项-这不适用于使用动态SQL(与exec语句一起使用)的情况。在这种情况下,运行存储过程的人员必须具有该SQL语句所需的权限。

    所以我不确定您的单元测试是否会提供您正在寻找的东西,因为依赖对象的权限在某种程度上是通过SQL Server处理存储过程安全性的方式来处理的。