SQL 服务器触发器验证以插入或更新
SQL Server trigger validation to insert or update
我必须为包含两列 Article_C
(主键)和 Status_C
的 Change_Table
开发多值更新触发器。当 Status_C
列更新时触发器激活,它需要插入或更新 Target_Table
列是 Article_T
(主键)和 Status_T
.
两个 table 的状态列都是 NOT NULL int
对于 insert
验证:将不存在的所有 Change_Table
值(文章和状态)插入 Target_Table
。
对于update
条件:如果文章存在于Target_Table
,将更新后的状态值传递给table。
状态值为 1 或 2。
我当前的实现:
CREATE TRIGGER [dbo].[Article_Trigger]
ON [dbo].[Change_Table]
AFTER UPDATE
NOT FOR REPLICATION
AS
IF UPDATE (Status_C)
BEGIN
INSERT INTO Target_Table (Article_T, Status_T)
SELECT Article_C, Status_C
FROM Change_Table
WHERE NOT EXISTS (SELECT * FROM Target_Table
WHERE Change_Table.Article_C = Target_Table.Article_T
AND Change_Table.Status_C = Target_Table.Status_T)
END
这是插入的粗略想法,但它仅在 Change_Table
首次更新且目标 table 为空时起作用一次。之后,由于插入条件,在第二次更新状态后,由于主键重复,我收到错误“违反 PRIMARY KEY 约束”。
第二次执行后出错的查询:
update Change_Table set status_c = 1 where Article_C in (1000,1003)
我如何修改这个查询来实现这个触发器的更新状态条件?
我认为您可以使用 deleted
或 inserted
table。这 2 个虚拟 tables 与触发器配合得很好。在您的示例中,您可能不需要 deleted
table,因为您没有记录历史更改。
CREATE TRIGGER [dbo].[Article_Trigger]
ON [dbo].[Change_Table]
AFTER UPDATE
NOT FOR REPLICATION
AS
IF UPDATE (Status_C)
BEGIN
--insert if not exist
INSERT INTO Target_Table
SELECT A.Article_C, A.Status_C
FROM inserted as A --the updated records from the source table will exist in the inserted virtual table
LEFT JOIN Target_Table as B
ON B.Article_T = A.Article_C
WHERE B.Article_T IS NULL
--update if exist
UPDATE A
SET A.Status_T = B.Article_C
FROM Target_Table as A
INNER JOIN inserted as B --the updated records from the source table will exist in the inserted virtual table
ON B.Article_C = A.Article_T
END
我必须为包含两列 Article_C
(主键)和 Status_C
的 Change_Table
开发多值更新触发器。当 Status_C
列更新时触发器激活,它需要插入或更新 Target_Table
列是 Article_T
(主键)和 Status_T
.
两个 table 的状态列都是 NOT NULL int
对于 insert
验证:将不存在的所有 Change_Table
值(文章和状态)插入 Target_Table
。
对于update
条件:如果文章存在于Target_Table
,将更新后的状态值传递给table。
状态值为 1 或 2。
我当前的实现:
CREATE TRIGGER [dbo].[Article_Trigger]
ON [dbo].[Change_Table]
AFTER UPDATE
NOT FOR REPLICATION
AS
IF UPDATE (Status_C)
BEGIN
INSERT INTO Target_Table (Article_T, Status_T)
SELECT Article_C, Status_C
FROM Change_Table
WHERE NOT EXISTS (SELECT * FROM Target_Table
WHERE Change_Table.Article_C = Target_Table.Article_T
AND Change_Table.Status_C = Target_Table.Status_T)
END
这是插入的粗略想法,但它仅在 Change_Table
首次更新且目标 table 为空时起作用一次。之后,由于插入条件,在第二次更新状态后,由于主键重复,我收到错误“违反 PRIMARY KEY 约束”。
第二次执行后出错的查询:
update Change_Table set status_c = 1 where Article_C in (1000,1003)
我如何修改这个查询来实现这个触发器的更新状态条件?
我认为您可以使用 deleted
或 inserted
table。这 2 个虚拟 tables 与触发器配合得很好。在您的示例中,您可能不需要 deleted
table,因为您没有记录历史更改。
CREATE TRIGGER [dbo].[Article_Trigger]
ON [dbo].[Change_Table]
AFTER UPDATE
NOT FOR REPLICATION
AS
IF UPDATE (Status_C)
BEGIN
--insert if not exist
INSERT INTO Target_Table
SELECT A.Article_C, A.Status_C
FROM inserted as A --the updated records from the source table will exist in the inserted virtual table
LEFT JOIN Target_Table as B
ON B.Article_T = A.Article_C
WHERE B.Article_T IS NULL
--update if exist
UPDATE A
SET A.Status_T = B.Article_C
FROM Target_Table as A
INNER JOIN inserted as B --the updated records from the source table will exist in the inserted virtual table
ON B.Article_C = A.Article_T
END