2017-07-02 2 views
0

ストアドプロシージャの実行権限を持つユーザーがSQLデータベースにあります。ストアの手順では、私はしてテーブルに挿入しようとしています:EXEC(@insertQuery) が、私はエラーストアドプロシージャの実行権限を持つSQLユーザーによるSQL動的クエリの挿入

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

以下の私も、これは動作します句 AS にEXECUTE見ている取得し、任意の方法がそばにありますこの ?安全なもの

はあなたが

答えて

0

私はあなたがストアドプロシージャを作成するときにWITH EXECUTE AS句を使用したいと思いますありがとうございました。あなたはそれについてhereを読むことができます。

ストアドプロシージャのOWNERとして実行するストアドプロシージャを定義できます。これは非常に便利です。ユーザーがテーブルを直接変更できないようにすることができます。ただし、テーブルを変更できるストアドプロシージャにアクセスできるようにすることができます。

0

EXECUTE ASの代わりに、モジュール署名があります。これにはEXECUTE ASよりも多くの設定が必要ですが、ユーザーに直接アクセス許可を与えることなく呼び出し元のIDを保持するという利点があり、データベース間アクセスのために拡張することができます。

以下は、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 
+0

私は実行許可を持っているprocを持っています。 procの中には、挿入クエリと他の多くのクエリがあります。 他のクエリは正常に動作しますが、動的クエリ(insert one)を実行しようとすると、By:exec(@insertQuery)...エラーが発生します –

関連する問題