使用对存储过程具有执行权限的 SQL 用户插入 SQL 动态查询

Posted

技术标签:

【中文标题】使用对存储过程具有执行权限的 SQL 用户插入 SQL 动态查询【英文标题】:SQL Dynamic Query Insertion with SQL user which has execute permission on stored procedure 【发布时间】: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 这也可以,除此之外还有什么方法吗?安全的。

谢谢

【问题讨论】:

【参考方案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) ... 我得到错误

以上是关于使用对存储过程具有执行权限的 SQL 用户插入 SQL 动态查询的主要内容,如果未能解决你的问题,请参考以下文章

如何找到自定义角色具有执行权限的存储过程? SQL SEVER

MS SQL 批量给存储过程/函数授权

存储过程和权限 - EXECUTE 是不是足够?

通过oracle dblink,怎么执行远程数据库的存储过程。或者说可以执行吗?怎么弄?

存储过程权限和执行

如何在 SQL Developer 中执行 SQL Server 存储过程?