我会尝试这样的事情:
CREATE TRIGGER InsertProducts
ON dbo.Products
FOR INSERT
AS
INSERT INTO dbo.LabelPrint(upc, itemcode, description, price, labelprint)
SELECT
upc, itemcode, description, price, labelprint
FROM Inserted
WHERE labelprint = 1
每当您将数据插入 table 时,都会触发第一个触发器dbo.Products
,如果labelprint
column 设置为1
,那么这些行也会插入dbo.LabelPrint
。
UPDATE
有点棘手:
CREATE TRIGGER UpdateProducts
ON dbo.Products
FOR UPDATE
AS
INSERT INTO dbo.LabelPrint(upc, itemcode, description, price, labelprint)
SELECT
i.upc, i.itemcode, i.description, i.price, i.labelprint
FROM Inserted i
INNER JOIN Deleted d ON i.itemcode = d.itemcode
WHERE i.labelprint = 1 AND d.labelprint <> 1
在这里,我检查该行是否已更新(不是 100% 确定是否itemcode
是用于链接旧值和新值的最佳列 - 如果不是,则根据需要进行调整),并确保旧值(来自Deleted
伪表)不是1
,而新值(来自Inserted
)是1
- 在这种情况下,列LabelPrint
已更新为 1,并且该行将被复制到LabelPrint
表中。
提醒一句:您需要注意 SQL Server 不会为正在插入和/或更新的每一行触发触发器。触发器将为每个语句触发一次- 一个语句可以很好地更新 50 行 - 在这种情况下,触发器会触发一次Inserted
,并且触发器 ( , )内的伪表Deleted
每个将包含 50 行。只是永远不要假设Inserted
只包含一行 - 这种假设是完全错误的。