1

私は小さな独自のレプリケーションを作成します-別のサーバーへの DTC INSERT を起動するトリガー (私自身の "レプリケーション" の 1 つの理由: トリガーの実行中にデータを計算し、別の理由: 高速バージョンから高速バージョンまで動作します)。

Windows認証を使用して同じホストから最初の挿入を行うと、正常に機能します。ただし、別のホストに Web サーバーがあり、sqlserver ログインを使用します (sa のテスト用)。このホストが最初の挿入を行うと、DTCTransaction EventClass (プロファイラー) での登録および作成フェーズの後に、内部アボートが発生します。

魔法は次のとおりです。Windows認証を使用して同じホストから最初に起動すると、Webサーバーから起動でき、正常に動作します。しかし、私は数分待たなければならず、うまくいきません。

推論のどこに誤りがありますか?

これが私の最初のサーバースクリプトです:

 EXEC master.dbo.sp_addlinkedserver @server = @Servername, @srvproduct=N'SQL Server' 

 EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @Servername, @locallogin = NULL , @useself = N'False', @rmtuser = @Serverlogin, @rmtpassword = @Serverpwd

アップデート:

ある SQL サーバーから別の SQL サーバーにいくつかの統計テーブルを供給したいと考えています。これを行うために同じトリガーを書きました。同時に、トリガーでいくつかの追加データを呼び出し、それを 2 番目のデータベースに書き込むので、標準のレプリケーションは使用できません。

このコードを使用してリンク サーバーを作成しました。

EXEC master.dbo.sp_addlinkedserver @server = @Servername, @srvproduct=N'SQL Server'

EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @Servername、@locallogin = NULL、@useself = N'False'、@rmtuser = @Serverlogin、@rmtpassword = @Serverpwd

私のトリガーは次のようになります。

CREATE TRIGGER <schema>.<name> ON <schema>.<table> AFTER INSERT, UPDATE
-- some code
SET xact_abort ON 
BEGIN DISTRIBUTED TRANSACTION
  -- calculate some additional data before insert
  INSERT INTO <servername>.<database>.<schema>.<table> (<columns>) VALUES (<values>)
COMMIT TRANSACTION
RETURN

トリガーを起動する挿入のイニシエーターが「Windows 認証」を使用する場合、これはうまく機能します。

「SQLサーバー認証」を使用すると問題が発生します。これは、Apache Tomcat Webサーバーに必要です。

OLE DB provider "SQLNCLI10" for linked server "<server>" returned message "Login timeout expired".
OLE DB provider "SQLNCLI10" for linked server "<server>" returned message "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.".
Could not open a connection to SQL Server [5].

SQL Server プロファイラーを調べると、DTCTransaction EventClass が返されます

7 - Enlisting in a DTC transaction
6 - Creating a new DTC transaction
10 - Internal abort
16 - Transaction is aborting

「Windows認証」を最初に実行すると、次の数分で「SQLサーバー認証」を使用して挿入を正常に実行できます。少し待つと、同じエラーが発生します。

したがって、私の最初の解決策は、トリガーを WITH EXECUTE AS OWNER に変更することでした

Alter database <database> Set trustworthy ON
ALTER TRIGGER <schema>.<name> ON <schema>.<table> WITH EXECUTE AS OWNER AFTER INSERT, UPDATE

「SQLサーバー認証」を使用してローカルマシンから挿入を実行すると、これは機能しますが、別のサーバーからは機能しません。ただし、別のサーバーからも機能するはずです。

4

1 に答える 1

0

これが私自身の解決策です:

WITH EXECUTE AS を使用して、トリガーの実行コンテキストを定義できます。

ALTER TRIGGER <triggername> ON <tablename> WITH EXECUTE AS OWNER AFTER ...

これを行ってトリガーを起動するクエリを実行すると、「現在のセキュリティ コンテキストが信頼されていないため、リモート サーバーへのアクセスが拒否されました。(エラー 15274)」というエラーが表示されます。

ただし、有効にできるサーバーオプションがあります。

Alter database robot5 Set trustworthy ON

...そしてそれは機能します。読んでくれてありがとう...

于 2010-06-18T07:58:51.480 に答える