【问题标题】:How to GRANT SELECT permission to all procedures如何 GRANT SELECT 对所有程序的权限
【发布时间】:2013-07-05 12:18:53
【问题描述】:

为了确保数据库交互的安全,我创建了一个只能执行存储过程的受限用户。他无权查询任何表。

这个场景我实现得很好!现在的问题是,我的一个存储过程涉及动态 SQL 执行,它说我没有权限在表 X 上运行 SELECT 查询,从而导致执行失败。

为避免这种情况,我需要为此类过程 NOT TO USERS 提供明确的 SELECT 权限。

请帮帮我!

【问题讨论】:

  • 您使用的是哪个 DBMS?甲骨文? Postgres?

标签: sql-server-2008 tsql


【解决方案1】:

没有内置函数可以让用户执行。

创建具有执行权限的角色并将该角色添加到用户。

CREATE ROLE db_executer
GRANT EXECUTE to db_executer
EXEC sp_addrolemember N'db_executer', N'<username>'

【讨论】:

  • 我不想授予用户权限。而是我想授予存储过程的权限。
【解决方案2】:

MNagel 有正确的链接,但重申一下,你想看看使用类似的东西:

CREATE PROC dbo.MyProc
WITH EXECUTE AS 'SomeUser'
AS
BEGIN --Proc
 --Do Stuff
END --Proc
GO

“执行为”在此过程中还有一些其他问题。您必须允许其他人模拟指定的用户,并且该用户需要对基础表具有适当的选择权限。

如果您想批量授予权限,您可以在架构级别而不是对象级别执行此操作 - 类似于:

GRANT SELECT, EXEC ON Schema::dbo TO MyRole;

我以前用它来大大简化我们角色的许多授权语句。对于更一般的角色,我们几乎没有覆盖,所以这很有帮助。

【讨论】:

    【解决方案3】:

    定义要以具有适当权限的用户身份执行的存储过程:

    http://msdn.microsoft.com/en-us/library/ms188354.aspx

    【讨论】:

    • 您的回答只是一个网站链接,这不是回答而是评论。根据我的经验,SO 上的人们想要一个答案而不是答案的链接。请修改,我将删除 -1。
    【解决方案4】:

    这是你想要的吗?

    USE DatabaseName
    GO
    -- 1 - db_executestoredprocedures
    -- 1a - Create role
    CREATE ROLE db_executestoredprocedures
    GO
    -- 1b - Grant permissions
    GRANT EXECUTE TO db_executestoredprocedures
    GO
    
    -- 2 - db_selecttablevaluedfunctions
    -- 2a - Create role
    CREATE ROLE db_selecttablevaluedfunctions
    GO
    -- 2 - Create permissions
    DECLARE @Function_Name nvarchar(250);
    DECLARE @CMDEXEC1 nvarchar(2000);
    DECLARE db_cursor CURSOR FOR  
    SELECT [name]
    FROM sys.objects
    WHERE Type = 'TF'
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @Function_Name
    WHILE @@FETCH_STATUS = 0   
    BEGIN
    
     SET @CMDEXEC1 = 'GRANT SELECT ON [' + @Function_Name + '] TO db_selecttablevaluedfunctions;'
     --- SELECT @CMDEXEC1 
     EXEC(@CMDEXEC1)
     FETCH NEXT FROM db_cursor INTO @Function_Name
    END
    CLOSE db_cursor   
    DEALLOCATE db_cursor
    GO
    

    【讨论】:

    • 最好用一个角色来做,而不是一个一个地设置。例如,一旦有新员工加入公司,您就必须再次运行此程序,因为您不必成为一个角色。最后,看到你的光标,我嘴里吐了一点。 :) 但是,您的答案是问题中问题的功能解决方案。
    【解决方案5】:

    在 sql 抱怨您没有权限在表 X 上运行 SELECT 查询的 SP 上,您的特定 SP 和表的所有权链是否损坏?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2013-07-30
      • 2012-03-08
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多