【问题标题】:SQL Dynamic Query Insertion with SQL user which has execute permission on stored procedure使用对存储过程具有执行权限的 SQL 用户插入 SQL 动态查询
【发布时间】:2017-07-02 12:52:54
【问题描述】:

我在 sql 数据库中有一个用户,该用户对存储过程具有执行权限。在存储过程中,我试图通过 EXEC (@insertQuery) 插入表中 但我收到以下错误

System.Data.SqlClient.SqlException (0x80131904): The INSERT permission was denied on the object ''table_name'', database ''db name'', schema ''dbo''.Unexpected error occurred!

我已经研究了 EXECUTE AS Clause 这也可以,除此之外还有什么方法吗?安全的。

谢谢

【问题讨论】:

    标签: sql sql-server database


    【解决方案1】:

    我认为您想在创建存储过程时使用WITH EXECUTE AS 子句。你可以阅读它here

    您可以将要执行的存储过程定义为存储过程的OWNER。这非常非常方便。您可以阻止用户直接修改表。但是,您可以让他们访问可以修改表的存储过程。

    【讨论】:

      【解决方案2】:

      EXECUTE AS 的替代方案是模块签名。这需要比EXECUTE AS 更多的配置,但优点是保留调用者身份而不授予用户直接权限,并且可以扩展为跨数据库访问。

      以下是从 Erland Sommarskog 在 Giving Permissions through Stored Procedures 上的出色而详尽的文章中收集的示例脚本。

      CREATE TABLE dbo.testtbl (a int NOT NULL,
                            b int NOT NULL);
      INSERT dbo.testtbl (a, b) VALUES (47, 11);
      GO
      CREATE PROCEDURE example_sp AS
         SELECT SYSTEM_USER, USER, name, type, usage FROM sys.user_token;
         EXEC ('SELECT a, b FROM testtbl');
      GO
      -- Create the certificate.
      CREATE CERTIFICATE examplecert
         ENCRYPTION BY PASSWORD = 'All you need is love'
         WITH SUBJECT = 'Certificate for example_sp',
         START_DATE = '20020101', EXPIRY_DATE = '20200101';
      GO
      -- Create the certificate user and give it rights to access the test table.
      CREATE USER examplecertuser FROM CERTIFICATE examplecert;
      GRANT SELECT ON dbo.testtbl TO examplecertuser;
      GO
      -- Sign the procedure.
      ADD SIGNATURE TO dbo.example_sp BY CERTIFICATE examplecert
          WITH PASSWORD = 'All you need is love';
      GO
      
      --users need proc execute permissions but not table permissions
      GRANT EXECUTE ON dbo.example_sp TO YourUserOrRole;
      GO
      

      【讨论】:

      • 我有执行权限的proc。在 proc 中有插入查询和其他许多查询。其他查询效果很好,但是当我尝试运行动态查询(插入一个)时: By : exec (@insertQuery) ... 我得到错误
      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多