SQL Server 2005 で偽装とデータベース リンクを組み合わせると、奇妙な動作が発生します。最初に、単純な SQL Server 認証を使用して Login 'John'でデータベース サーバーに接続します。このサーバーでは、サーバー リンクremote_sqlserverが定義されています。このサーバーのmydbに対する SELECT 権限を既に持っています。このサーバー リンクで DB のテーブルを単純にクエリすると、次のようになります。
SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable -- Works!
その後、同じログインで偽装を試みます (なぜそうするのかは聞かないでください。実験しているだけです ;) )
EXECUTE AS LOGIN = 'John'
SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable -- Error: "Login failed for user: 'John'"
元に戻すと、再び機能します。
REVERT
SELECT count(*)
FROM remote_sqlserver.mydb.dbo.mytable -- Works!
同じログインで偽装なしでテーブルをクエリできるのに、偽装でエラーが発生する理由はわかりますか?
ところで:「自己偽装」の後、ローカルデータベースにクエリを実行しても(もちろん、十分な権限があります)、エラーは発生しません。サーバーリンクを介してリモートDBにクエリを実行した場合にのみ発生します。