使用对存储过程具有执行权限的 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