1

私の (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 を実行する権限がありません

このチェックを実行する権限をアプリケーション ロールに正しく付与するにはどうすればよいですか?

4

2 に答える 2