【问题标题】:Copy from one table in a database, to an exact copy of the table on another database on the same SQL server using a trigger使用触发器从数据库中的一个表复制到同一 SQL 服务器上另一个数据库上的表的精确副本
【发布时间】:2018-01-11 05:35:43
【问题描述】:

对 SQL 相当陌生。我正在尝试使用 on insert 触发器将表数据从一个数据库复制到同一 SQL Server 实例中另一个数据库上完全相同的表。

如果我将其作为独立查询运行:

SET NOCOUNT ON;

DECLARE @IDTSMAX AS INT 

SET @IDTSMAX = (SELECT MAX(IDTS)
                FROM [LabReports].[dbo].[TruckQualityLAB])

INSERT INTO [DryPlant].[dbo].[TruckQualityLAB] (BOL, Quality, Location, Product, Date, IDTS)
    SELECT 
        BOL, Quality, Location, Product, Date, IDTS 
    FROM 
        [LabReports].[dbo].[TruckQualityLAB] 
    WHERE
        @IDTSMAX = IDTS

它工作得很好,但如果我将它创建为触发器,它会失败并且不会插入到任一表。 LabReports 上的主表由来自其他表的 8 个插入触发器填充。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[TruckQualityLABUPDATE] 
ON [LabReports].[dbo].[TruckQualityLAB]
AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @IDTSMAX AS INT
    SET @IDTSMAX = (SELECT MAX(IDTS)
                    FROM [LabReports].[dbo].TruckQualityLAB])

    INSERT INTO [DryPlant].[dbo].[TruckQualityLAB](BOL, Quality, Location, Product, Date, IDTS)
        SELECT 
            BOL, Quality, Location, Product, Date, IDTS 
        FROM 
            [LabReports].[dbo].[TruckQualityLAB] 
        WHERE
            @IDTSMAX = IDTS
END

我需要复制这些数据,以便我可以更新具有正确质量的卡车记录以进行报告等。

任何想法为什么这不能作为触发器?我读到的所有内容都说它应该可以工作。

编辑。 TruckQualityLAB 表是使用 Web 界面从 2 个不同的实验室随机更新的,因此可以在几秒钟内输入 2 或 3 条记录,因为该表是由其他 8 个产品表上的插入触发器填充的。(在在 truckqualitylab 表中插入创建行)。然后我想在另一个数据库中使用这个合并表来更新具有质量值的记录。这些必须是实时的,网页才能按需报告。

【问题讨论】:

  • 您需要检查Inserted 伪表 - 其中包含新插入的行 - 这些需要存储到另一个表中
  • 更新的行怎么样??
  • @marc_s,正确,我的错,删除:)

标签: sql-server tsql


【解决方案1】:

您需要检查 Inserted 伪表 - 其中包含新插入的行 - 这些需要存储到另一个表中

ALTER TRIGGER [dbo].[TruckQualityLABUPDATE] 
ON [LabReports].[dbo].[TruckQualityLAB]
AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [DryPlant].[dbo].[TruckQualityLAB](BOL, Quality, Location, Product, Date, IDTS)
        SELECT 
            BOL, Quality, Location, Product, Date, IDTS 
        FROM 
            Inserted
END

【讨论】:

  • 那么,这应该取最新插入的信息,并插入另一个表而不取所有记录或不需要MAXID条件吗?当我尝试这个时,它做了同样的事情,并且在触发器处于活动状态时无法更新所有表,包括从 Web 门户更新的原始产品表。 (删除了 IDTS,因为它也是一个标识符,但没有用)
  • @AdrianWalker:是的,完全正确 - 此触发器仅复制您的 INSERT 语句的所有行(无论是 1 行还是 1000 行)并将这些值插入到 DryPlant 数据库中
  • 注意到在表上,如果我启用了触发器,每个插入触发器都会失败,但是在 truckqualitylab 表上,标识符每次都会增加,即使作业失败并且没有记录记录。 BOL 质量 位置 产品 日期 IDTS P181315 94.8 矿井 100M-AZ 2018-01-10 08:33:51.310 1 P181308 96.4 矿井 100M-AZ 2018-01-10 08:34:47.533 2 P181252 94.9 矿井 1220-AZ 201-8 10 08:47:51.047 3 P181359 95.2 矿井 4070-AZ 2018-01-10 09:16:20.490 5 P181340 98.1 矿井 3050-AZ 2018-01-10 13:43:55.340 12
  • 注意到在表上,如果我启用了触发器,每个插入触发器都会失败,但是在 truckqualitylab 表上,标识符每次都会增加,即使作业失败并且没有记录记录。甚至尝试制作另一个先更新列的触发器,然后在更新而不是插入时触发此触发器。同样的问题,没有创建记录,但标识符增加了 1。
  • 谢谢。这些解决方案工作得很好。由于尝试将 Nvarchar 转换为 int,触发器失败。这么简单的事情。
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2017-07-03
相关资源
最近更新 更多