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