9

次のセットアップがあります。

トリガーが設定されている (履歴データを収集する) いくつかのテーブルを持つ 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機能を作成する方法はありますか?

4

4 に答える 4

5

孤立したユーザーを検出し、ログインにリンクして解決します。

検出:

<データベース名> を使用します。
行く;
sp_change_users_login @Action='Report';
行く;

解決:
次のコマンドは、<login_name> で指定されたサーバー ログイン アカウントを <database_user> で指定されたデータベース ユーザーに再リンクします


GO
sp_change_users_login @Action='update_one',
@UserNamePattern='<データベース ユーザー>',
@LoginName='<ログイン名>';
行く

https://msdn.microsoft.com/en-us/library/ms175475.aspx

于 2015-04-01T10:55:06.543 に答える
5

トリガーを実行するユーザー アカウント。

そのユーザーに、ユーザー アカウント HistoryUser の IMPERSONATE 特権を付与する必要があります。

 GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser

詳細はこちら

http://msdn.microsoft.com/en-us/library/ms181362.aspx

于 2009-04-28T14:44:48.733 に答える
4

データベースをあるマシンから別のマシンに移動した後に発生するこのような問題には、通常、SID の不一致が関係していますが、それがあなたのケースに当てはまるかどうか、またはどのように当てはまるかはわかりません。データベース ユーザーを削除して再作成し、それらのテーブルに対する権限を元に戻してください。

于 2009-04-28T22:24:08.253 に答える
1

それは「孤立したユーザー」です。うまくいきません。ドキュメントには、これが明確に記載されています。:-(「孤立したユーザー」状態を修正すると、再び機能します

于 2010-01-31T17:09:22.880 に答える