我在兩個表(table_a,table_b)中有三列數據(A,B,C),我希望使用觸發器來更新列連接列值爲table_a
的列從table_a
和table_b
任何時候在table_a中更新記錄。如何使用觸發器進行交叉表更新
CREATE TABLE 'table_a'
(
'id' BIGINT(50) NOT NULL,
'A' VARCHAR(5) NULL,
'B' VARCHAR(5) NULL,
'C' VARCHAR(5) NULL,
PRIMARYKEY ('id')
)
CREATE TABLE 'table_b'
(
'id' BIGINT(50) NOT NULL,
'A' VARCHAR(5) NULL,
'B' VARCHAR(5) NULL,
'C' VARCHAR(5) NULL,
PRIMARYKEY ('id')
)
INSERT INTO table_a (A, B, C) VALUES (1, 2, 3)
INSERT INTO table_b (A, B, C) VALUES (4, 5, 6)
沒有觸發器,我會用這個語句來更新表-A
UPDATE Table_a
SET table_a.A = COALESCE(table_a.B, 0) + ’,’ + COALESCE(table_b.A, 0)
FROM table_a
INNER JOIN table_b ON table_a.id = table_b.id
WHERE table_a.id = 1
更新後
表-A:
| A | B | C |
|------+----+----+
| 2, 4 | 2 | 3 |
這是我在觸發嘗試
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER update_table_a
ON table_a
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @id as BIGINT
SELECT @id = id FROM updated
UPDATE table_a
SET table_a.A = COALESCE(table_a.B, 0) + ‘,’ + COALESCE(table_b.A, 0)
FROM Table_a
INNER JOIN table_b ON table_a.id = table_b.id
WHERE table_a.id = @id
END
GO
我的問題是,當我嘗試更改該列中的值並使用此觸發器時,table_a.A中的值恢復爲其原始值。
第一件事情,千萬不要用下面的語句,因爲插入表(有沒有更新的表)可以有多個記錄: 選擇@id = ID從更新 – HLGEM
你觸發了** **主要缺陷因爲你似乎認爲它會被稱爲**每行**一次 - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,因此如果觸發此觸發器的'UPDATE'語句插入25行,則觸發器將觸發**一次**,但隨後會出現'Inserted'和'Deleted僞表每個將包含25行。您的代碼在這25行中選擇哪一個? 'SELECT @Id ='只選擇一個非確定性行,而你將**忽略所有其他行**。你需要重寫你的觸發器來考慮這個問題! –