2015-09-09 49 views
1

我有兩個不同的SQL 2008服務器,我沒有權限在其中任何一個創建鏈接服務器。 我創建了一個觸發器上server1.table1插入相同的記錄使用OPENROWSET觸發每個插入的行插入到遠程表

我創建了一個存儲過程中插入此記錄的遠程服務器server2.table1,和我沒有問題,當我執行存儲過程。它將記錄插入遠程服務器。

問題是當我從觸發器調用存儲過程時,我收到一條錯誤消息。

誰能幫助我,請解決這個問題

存儲過程:

USE [DB1] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

alter PROCEDURE [dbo].[InsertIntoRemoteTable] 
     @Description nvarchar(50) 
     AS 

     insert into 
        OPENROWSET(
        'SQLNCLI', 'Server=Server2;UID=MySRV2user;PWD=MySRV2Password', 
        'SELECT Description FROM [RemoteDB].[dbo].[Table_1]') 
     SELECT @Description 

觸發:

ALTER TRIGGER [dbo].[InsertTable1] 
    ON [DB1].[dbo].[Table_1] 
    for insert 
AS 

BEGIN 
    SET NOCOUNT ON; 
    DECLARE @Desc nvarchar(50) 
    Select @Desc = i.Descr from INSERTED i; 
    EXEC InsertIntoRemoteTable @Desc 
END 

當我嘗試插入我得到了表的新描述值以下錯誤消息:

"No row was updated 
the data in row 1 was not committed 
Error source .Net SqlClient Data provider. 
Error Message: the operation could not be performed because OLE DB 
provider "SQLNCLI10" for linked server "(null)" returned message "The partner transaction manager has disabled its support for remote/network transaction.". 

correct the errors entry or press ESC to cancel the change(s). 

任何人都可以幫助請在此 謝謝

+0

您的觸發器有重大缺陷。它假定只會插入一行。您需要編寫觸發器來處理數據集。在這種情況下,最可能的含義是修改過程InsertIntoRemoteTable以接收表值參數而不是標量值。至於錯誤信息...你嘗試研究它嗎?搜索錯誤消息提供了成千上萬的解釋該消息以及如何解決該消息的鏈接。 –

+0

我真的沒有仔細看看你的程序。那裏的參數是什麼?你傳入它,然後在最後選擇它。另一個有趣的部分是,您只需將Table_1中的所有行插入到遠程表中即可。這將產生重複出wazoo,因爲它只是反覆插入相同的行。我認爲你需要分析你的過程並找出你想要在這裏做什麼。 –

+0

該參數是新插入的字段值,所以當新記錄插入到table1中時,觸發器調用該過程併發送字段值,將這些值插入到遠程表中 – Mohamed

回答

0

我想你已經過了複雜的。這裏真的不需要存儲過程來做到這一點。您可以使用簡單的插入語句直接在觸發器中插入另一個數據庫。這消除了很多複雜性,並且基於此設置。

ALTER TRIGGER [dbo].[InsertTable1] 
    ON [DB1].[dbo].[Table_1] 
    for insert 
AS 

BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO RemoteDB].[dbo].[Table_1](Description) 
    Select i.Descr 
    from INSERTED i; 
END 
+0

謝謝你的代碼,如果我有鏈接服務器,你的代碼可以工作。我真的沒有權限創建一個新的鏈接服務器,這就是爲什麼我使用OPENROWSET在運行時發送服務器,用戶ID和密碼。再次感謝您的幫助 – Mohamed

+0

還有一件事,我能夠執行該過程並路徑參數,並且該記錄已成功插入到遠程表中。唯一的,當我從觸發器中調用它時,我得到了這個消息 – Mohamed

+0

但是當你從你的觸發器調用你將得到Table_1的所有行,除非你添加一個where子句。正如我之前所說的那樣,搜索你的EXACT消息,你將會得到答案數千次。 –