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