2009-04-28 10 views
7

私は次のセットアップ持っている:問題は、「AS EXECUTE」

SQL ServerのDBがそれらに設定されたトリガを(履歴データを収集することを)持っているいくつかのテーブルにあります。これらのトリガーは、EXECUTE AS 'HistoryUser'のCLRストアドプロシージャです。 HistoryUserユーザーは、ログインせずにデータベース内のシンプルなユーザーです。すべてのテーブルから読み取り、履歴テーブルに書き込むための十分な権限を持っています。

DBをバックアップして別のマシン(この場合は仮想マシンですが、問題ではありません)に復元すると、トリガーはもう機能しません。実際には、ユーザーの偽装はこれ以上行われません。そのようなこの

exec ('select 3') as user='HistoryUser' 

などであっても、簡単な文がエラーを生成します。

Cannot execute as the database principal because the principal "HistoryUser" does not exist, this type of principal cannot be impersonated, or you do not have permission.

私は、DBの所有者がドメインユーザーであれば、これが発生する可能性があることread in MSDNが、そうではありません。そして、たとえそれを他のもの(彼らの推奨される解決策)に変更しても、この問題は残っています。

ログインせずに別のユーザーを作成した場合は、偽装に使用できます。つまり、これはうまく動作します:

create user TestUser without login 
go 
exec ('select 3') as user='TestUser' 

私はすべてのそれらのトリガーを再作成する必要はありませんので、私は既存のHistoryUser作業を行うことができますどのようにどのような方法はありますか?

バンプ:申し訳ありませんが、これはちょっと急務となっている...

答えて

4

トリガーとしてどのようなユーザーアカウントを実行しません。

ユーザーアカウント履歴ユーザー​​の権限をIMPERSONATE許可する必要があります。ここ

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

+0

Nopに、助けにはなりません。 –

4

GRANT IMPERSONATE ON USER:: YourUser TO HistoryUser 

詳細私がもしわからないか、それが適用されるかが、あるマシンから別のマシンにデータベースを移動した後に生じるこのような問題は通常、不一致SIDさんを伴いますあなたの場合。データベースユーザーを削除して再作成し、そのテーブルへのアクセス許可を元に戻してください。

+0

これは単なるポイントです。このユーザーはログインしたことがありません。 SIDは何ですか? そして、私が上記の質問で述べたように、私はユーザーを再作成したくないと思います。なぜなら、トリガーの全体を再作成する必要があるからです。 –

+0

これは私のために働いた。別のサーバーからデータベースを移行しなければならず、この問題が発生しました。 – ahwm

3

「孤立したユーザー」です。それは動作しません。ドキュメンテーションはこれを明確に述べている。 :-( "孤立したユーザー"状態を修正して再び動作します。

+2

どのドキュメント - リンクを提供できますか?ありがとう – doza

5

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

はDETECT:

使用<データベース名>。
GO;
sp_change_users_login @ Action = 'レポート';
GO;

RESOLVE:
次のコマンドを実行すると、<DATABASE_USER>で指定されたデータベースのユーザーと<のlogin_name >で指定されたサーバーのログインアカウント再リンク:

使用<データベース名>を。
GO
sp_change_users_loginをする@アクション= ' update_one '、
LoginNameに= ' <のlogin_name > ' @ UserNamePattern = ' <DATABASE_USER> '、
@;
GO

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

関連する問題