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

时间:2017-07-02 12:52:55

标签: sql sql-server database

我在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 这也行,这旁边有什么方法吗?安全的。

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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