none
SQL Server存储过程使用execute as子句权限问题 RRS feed

  • 问题

  • 数据库版本为 sql server 2012

    近期在使用过程中发现定义存储过程使用execute as子句会出现权限异常的问题,execute as指定的用户在没有相关权限的情况下,执行存储过程也能进行一些无权限的操作。

    以下为测试过程:

    1. 创建了一个存储过程,其中使用了execute as子句指定了一个用户agent_user,这个存储过程对库中的一张表执行一些增删改查语句,用户agent_user对这张表没有任何权限;
    2. 再用一个对该表操作无权限的用户exector_user授予执行存储过程的权限,执行存储过程后该表被修改了,没有任何权限不足的错误。

    agent_user、exector_user用户直接操作该表是没有权限的,为何执行存储过程可以进行无权限的操作?




    2020年11月18日 7:16

答案

  • 你好,

    在MS文档-EXECUTE AS 子句 (Transact-SQL)有以下注解

    不论模块中指定的执行上下文如何,以下操作始终适用:
     执行模块时,数据库引擎首先验证执行模块的用户是否拥有对模块的 EXECUTE 权限。
     所有权链规则继续应用。 这意味着如果调用和被调用对象的所有者相同,则不检查对基础对象的权限。


    我使用SQL Server 2012和2019都进行了您的测试,得出的结果与您的测试结果相同。这是设计行为而不是错误。原因如上。

    所以在将存储过程与其引用的表放在不同的schema下面之后,在运行测试,将报出229错误:对对象“ ”,数据库“”,模式“ ”的SELECT权限被拒绝。

    另外也请参考这篇博客

    -----------------------------------------------------------------------------------------------------------如果您已解决问题,请将有用的答复标记为答案。 这可能对其他遇到类似问题的社区成员有帮助。
    此外,如果您还有其他问题,请随时提出。

    • 已标记为答案 ryanyu_abc 2020年11月19日 7:29
    2020年11月19日 3:01