運用方法によるかと思いますが、一般ユーザーで「sp_configure」を実行したい場合などの対応として。
Cannot create login in stored procedure with EXECUTE AS OWNER?
の対応と近い内容です。
一般ユーザーで sp_configure を実行するために、sysadmin のログインで、master データベースに対して、以下のようなストアドを作成して、その後一般ユーザーで実行させてみます。
CREATE PROCEDURE set_configuration @parametername nvarchar(255), @parametervalue int WITH EXECUTE AS OWNER AS BEGIN EXECUTE sp_configure @parametername, @parametervalue END GO GRANT EXECUTE ON OBJECT::dbo.set_configuration TO TestUser
「TestUser」は、一般ユーザーなのですが、このユーザーで以下のクエリを実行してもエラーとなります。
EXEC set_configuration 'show advanced options', 0
メッセージ 15247、レベル 16、状態 1、プロシージャ sp_configure、行 106
ユーザーにはこの操作を実行する権限がありません。
これですが、冒頭で紹介した stackoverflow の以下の記述に合致しているためですね。
A login is a server level object and therefore requires server level permissions.
EXECUTE AS <database-user>
is a database-scoped security context.
sp_configure のような操作は、データベースレベルではなく、サーバーレベルのパーミッションでの制御となります。
パーミッションについては、SQL Server Database Engine Permission Posters が参考になります。
一般ユーザーで sp_configure を実行したい場合は、
モジュール署名 (データベース エンジン)
チュートリアル:証明書を使用したストアド プロシージャへの署名
の情報を参考にするとよいかと。
ストアドプロシージャを介して実行させるために、
CREATE PROCEDURE set_configuration @parametername nvarchar(255), @parametervalue int -- WITH EXECUTE AS OWNER は不要 (つけると動作しない) AS BEGIN EXECUTE sp_configure @parametername, @parametervalue END GO GRANT EXECUTE ON OBJECT::dbo.set_configuration TO TestUser GO CREATE CERTIFICATE ImpersonateCert ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y' WITH SUBJECT = 'Impersonate Access', EXPIRY_DATE = '12/05/2100' GO ADD SIGNATURE TO set_configuration BY CERTIFICATE ImpersonateCert WITH PASSWORD = 'pGFD4bb925DGvbd2439587y' GO CREATE LOGIN ImpersonateLogin FROM CERTIFICATE ImpersonateCert GO GRANT ALTER SETTINGS TO ImpersonateLogin GO
のようなクエリを使用して、ストアドに署名をして、権限偽装のような形で実行させると良いのかと。