私の (C#) アプリケーションが実行され、アプリケーション ロールを使用して SQL サーバー データベースに接続します。
ただし、実行するにはそれが必要ですDBCC CHECKDB
が、例外が発生します。
ユーザー 'MyAppRole' には、データベース 'MyDatabase' に対して DBCC checkdb を実行する権限がありません。
このコマンドを実行するには、このアクションを実行する権限をアプリケーション ロールに付与するだけではなく、ロールのメンバーである必要があることがわかりましたdb_owner
。
私が試したこと:
1: SQL Management Studio で、このデータベースの MyAppRole のプロパティで db_owner ボックスにチェックを入れます。ただし、同じ例外が発生します。
2: db_owner ロールを追加します。
exec sp_addrolemember 'db_owner', 'MyAppRole'
しかし、アプリケーションを実行すると、DBCC CHECKDB を実行する時点で次の例外が発生します。
サーバー プリンシパル "MYDOMAIN\MyWindowsUsername" は、現在のセキュリティ コンテキストではデータベース "MyDatabase" にアクセスできません。
SQL Managment Studio では、Windows 認証を使用してログインした後、コマンドを簡単に実行できるため、これは特に混乱を招きます。
3: 所有者として実行するストアド プロシージャの作成
CREATE PROCEDURE sp_dbcccheck WITH EXECUTE AS OWNER
AS
BEGIN
DBCC CHECKDB (MyDatabase) WITH TABLERESULTS
END
GO
...そして私のMyAppRole
実行許可が与えられました。しかし、私はまだ例外を受け取ります:
サーバー プリンシパル "MYDOMAIN\MyWindowsUsername" は、現在のセキュリティ コンテキストではデータベース "MyDatabase" にアクセスできません。
...これは、SQL Management Studio からこのストアド プロシージャを実行しようとした場合にも発生します。
4: アプリケーション ロールに "CONTROL" パーミッションを付与します (これらのいくつかは、アプリケーション ロールの目的を無効にしているように見えますが、とにかく、ストローをつかみます)
GRANT CONTROL ON DATABASE::MyDatabase TO MyAppRole
ただし、アプリケーションがチェックを実行しようとすると、元のエラーが発生します。
ユーザー 'MyAppRole' には、データベース 'MyDatabase' に対して DBCC checkdb を実行する権限がありません
このチェックを実行する権限をアプリケーション ロールに正しく付与するにはどうすればよいですか?