【问题标题】:Grant execute to stored procedure without SELECT permissions to underlying table向存储过程授予对基础表没有 SELECT 权限的执行
【发布时间】:2017-08-12 10:37:59
【问题描述】:

我认为这是不可能的,但我希望我遗漏了一些东西。假设我在 SQL Server 2012 SP3 中有这个存储过程:

CREATE PROCEDURE [dbo].[myproc] 
AS 
    SELECT * FROM [dbo].[mytable]

我想授予数据库主体执行[myproc] 的权限,而不授予SELECT 对基础表的权限。

我尝试了各种GRANT 语句,但都没有运气。当我执行myproc 时,我仍然得到错误

在 mytable 上选择权限被拒绝

数据库主体不是数据库所有者,我不想让他成为数据库所有者。

我正在尝试做的事情可能吗?

谢谢。

【问题讨论】:

  • 问题是:谁拥有表,谁拥有程序?如果两者不同,您可能正在与所有权链接发生冲突。

标签: sql-server stored-procedures sql-server-2012 permissions


【解决方案1】:

如果您不想将 DB 原则设为所有者,那么您需要使用“Grant With”授予它权限,以便进一步传递它们。

假设“dbo”是所有者,“ElevatedUser”是具有选择权限的新用户

GRANT EXECUTE ON [dbo].[myproc] TO ElevatedUser 
WITH GRANT OPTION  AS [dbo]

GRANT EXECUTE ON [dbo].[myproc] TO MyUser AS ElevatedUser

或者如果你真的被卡住了,你可以把它放在存储过程本身中

CREATE PROCEDURE [dbo].[myproc] 
WITH EXECUTE AS 'dbo' 
AS
BEGIN

【讨论】:

    【解决方案2】:
    GRANT EXECUTE ON SPNAME TO DBUSER
    

    【讨论】:

      【解决方案3】:

      威彻, 除非基础表上有特定的拒绝,否则此授权语句应该有效:

      GRANT Exec [dbo].[myproc] TO MyUser;
      GO
      

      用这样的代码测试它:

      EXECUTE AS USER = 'MyUser';
      GO
      EXEC [dbo].[myproc]; -- should work
      GO
      SELECT id FROM [dbo].[table]; -- should fail
      GO
      REVERT;
      

      当我以六种方式将代码更改为星期天时,我喜欢从头开始,以确保我没有无意中把某些东西搞砸了,并且很有目的性。步。经过。一步。

      1. 制作一个测试表,授予 MyUser 读取权限 - 你能运行一个选择 使用作为用户代码执行?
      2. 删除读取权限,选择是否有效? 如果没有,世界仍然是理智的(在某种程度上)。现在尝试使用新的存储过程
      3. 向 MyUser 授予执行权限 - 是否有效?

      如果是,则对实际表进行相同的测试 - 您是否可以授予读取权限,然后可以删除读取权限。如果是这样,请重新创建 SP 并重试。

      对不起,如果这太简单了,没有冒犯的意思,只是想确保我们在同一页面上进行明智的测试。

      如果不起作用,请发布测试结果,我会尽力提供帮助。

      【讨论】:

        猜你喜欢
        • 2011-05-07
        • 2020-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2011-07-22
        • 2011-03-23
        • 1970-01-01
        相关资源
        最近更新 更多