【问题标题】:When trigger failed to write in remote server, write to local server当触发器无法写入远程服务器时,写入本地服务器
【发布时间】:2013-05-11 06:29:53
【问题描述】:

首先对不起我的英语。

当接收到特定表中的更新时,我有一台服务器,我也想写入远程服务器,但是如果远程服务器不可用,我希望触发器在另一个临时表中写入本地服务器。

写入远程服务器的示例代码:

-- REMOTO is remote server
CREATE TRIGGER insertin
ON mangas
AFTER INSERT 
AS
    BEGIN
    DECLARE @serie varchar(max), @capitulo int 

    SELECT @serie = serie ,@capitulo = capitulo
    FROM inserted

    INSERT INTO [REMOTO].[Gest].[dbo].[MARCA] (Codigo, Descripcion)
    VALUES (@capitulo, @serie)
END

例如,我需要TRY...CATCH 或类似的东西。我不知道我该怎么做。

感谢您的回答,再次为我的英语感到抱歉。

【问题讨论】:

  • 最好从触发器写入本地表,然后让其他东西(例如 SQL 作业、SQL 代理等)执行远程访问.远程连接可能需要 很长 时间才能失败,这会阻止运行 INSERT 的本地事务实际提交。此外,您的触发器已损坏 - inserted 可以包含 0、1 或 许多 行。

标签: sql-server tsql triggers insert


【解决方案1】:

如果使用 SQL Server 2005 或更高版本,您可以在 INSERT 语句周围放置一个 TRY...CATCH 块。见 MSDN:http://msdn.microsoft.com/en-US/library/ms175976(v=sql.90).aspx

BEGIN TRY

    INSERT INTO [REMOTO].[Gest].[dbo].[MARCA]
        (Codigo, Descripcion)
         VALUES
           (   @capitulo, @serie ) 

END TRY
BEGIN CATCH
    INSERT INTO [dbo].[MyTemporaryTable]
        (Codigo, Descripcion)
         VALUES
           (   @capitulo, @serie ) 
END CATCH

【讨论】:

  • 如果我尝试这样做,不工作,触发器进入 catch 但不做第二次插入。
【解决方案2】:

我使用此代码并运行良好。 如果有人有更好的解决方案,请发帖,我现在正在学习 t-sql。 任何建议都很好

begin 


declare
@serie varchar(max),
@capitulo int,
@maxMarca int


select @serie = serie
from inserted
select @maxMarca =max(Codigo) from [REMOTO].[Gest].[dbo].[MARCA]      

set @maxMarca = @maxMarca+1
commit -- save transaction insert which generates this trigger work.
begin TRANSACTION
    BEGIN TRY   
        INSERT INTO [REMOTO].[Gest].[dbo].[MARCA]  (Codigo, Descripcion)   VALUES   ( @maxMarca, @serie)             
        commit transaction --save transaction and finish, if remote server work
    END TRY    
    BEGIN CATCH                

    IF @@trancount > 0
        begin           
        rollback transaction   --remote transaction is  go back
            INSERT INTO [mangas].[dbo].[mangasTemp]  VALUES  (@maxMarca, @serie)        
        commit transaction   -- save transaction in local temporal table.
        end
    END CATCH


   end

       go

【讨论】:

  • 这个触发器在远程服务器方面仍然被破坏,因为它正在使用它来获取@maxMarca。此触发器仍然存在问题,因为 inserted 可以包含 0、1 或多行。通过假设MAX(Codigo) 的值在SELECTINSERT 之间保持不变和/或并行性,此触发器可能被破坏。
  • 不,真的没有。您还没有解决我在之前的 cmets 中提出的任何问题。
猜你喜欢
  • 2023-02-14
  • 1970-01-01
  • 2015-12-05
  • 2016-01-07
  • 2018-03-21
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多