混合モード認証を使用して、Microsoft SQL Server 2008 Express インスタンスに MyDB というデータベースがあります。データベース MyDB を使用するアプリケーションは、現在、現在のユーザーの Windows 資格情報を使用して、Windows 認証を使用して接続します。このログインは「パブリック」サーバー ロールのメンバーであり、MyDB データベースでユーザーがマップされています。このデータベース ユーザーは、db_datareader および db_datawriter データベース ロールのメンバーです。
私が望むのは、アプリケーションが接続すると、MyDB で読み書きする権限があることです。ただし、別のアプリケーションが同じログインを使用して接続する場合は、読み取りのみを許可する必要があります。
私が考えたのは、接続文字列のアプリケーション名の部分をチェックするログオン トリガーを作成し、それに基づいて実行コンテキストを切り替えるかどうかを決定することでした。(記録として、接続文字列のアプリケーション名に依存することは決して安全ではなく、回避するのは非常に簡単であることを知っています。ここでの目的は、データベースを保護することではなく、ユーザーが変更を回避できるようにすることです。 Microsoft Excel などの別のアプリケーションを使用して接続した場合のデータ)
db_datareader のメンバーである MyDB データベースのユーザーにマップされた「myapp_reader」という新しいログインを作成しました。
次に、次の TSQL を使用してログオン トリガーを作成してみました。
CREATE TRIGGER CheckUser
ON ALL SERVER
AFTER LOGON AS
BEGIN
IF APP_NAME() <> 'My Application Name'
BEGIN
EXECUTE AS LOGIN = 'myapp_reader' WITH NO REVERT
END
END
しかし残念ながら、それはうまくいきません。接続しようとすると、次のエラーが表示されます。
トリガーの実行により、ログイン 'MyComputer\MyWindowsUsername' のログオンに失敗しました。
データベース コンテキストを「master」に変更しました。
言語設定を us_english に変更しました。(Microsoft SQL Server、エラー: 17892)
そして、エラーログを見ると、次のように書かれています:
エラー: 15590、重大度: 16、状態: 1。
アドホック レベルの 'Execute As' ステートメントでは、'No Revert' または 'Cookie' オプションのみを使用できます。
エラー: 17892、重大度: 20、状態: 1。
トリガーの実行により、ログイン 'MyComputer\MyWindowsUsername' のログオンに失敗しました。[クライアント: xxx.xxx.xxx.xxx]
このエラーは、ログオン トリガーの実行コンテキストを永続的に変更できないということですか?