次のセットアップがあります。
トリガーが設定されている (履歴データを収集する) いくつかのテーブルを持つ SQL Server DB があります。これらのトリガーは、EXECUTE AS 'HistoryUser'
. HistoryUser
ユーザーは、ログインのないデータベース内の単純なユーザーです。すべてのテーブルから読み取り、履歴テーブルに書き込むのに十分な権限があります。
DB をバックアップしてから別のマシン (この場合は仮想マシンですが、問題ありません) に復元すると、トリガーが機能しなくなります。実際、ユーザーのなりすましは機能しなくなりました。こんな簡単な一言でも
exec ('select 3') as user='HistoryUser'
エラーが発生します:
プリンシパル "HistoryUser" が存在しないか、このタイプのプリンシパルを偽装できないか、権限がないため、データベース プリンシパルとして実行できません。
DB所有者がドメインユーザーである場合にこれが発生する可能性があることをMSDNで読みましたが、そうではありません。そして、それを他のものに変更しても(推奨される解決策)、この問題は残ります。
ログインせずに別のユーザーを作成すると、偽装に問題なく使用できます。つまり、これは問題なく機能します。
create user TestUser without login
go
exec ('select 3') as user='TestUser'
これらすべてのトリガーを再作成したくないので、既存のHistoryUser
機能を作成する方法はありますか?