在 SQL 服务器中插入后更改数据的触发器
Trigger for changing data after insert in SQL Server
这是我的第一个问题。我绝对是 DML 的初学者。
目的是为网络中的后期下拉框实现层次结构 ui。
原始代码适用于 oracle,我尝试将其翻译成 SQL 服务器。在 Oracle 中,他们用 "before insert" 和 "for each row".
解决了它
到目前为止,这是我的代码:
CREATE TRIGGER dbo.test
ON dbo.TOPOLOGY
AFTER INSERT
AS
BEGIN
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON
IF INSERTED.HIERARCHY_LEVEL = 0
BEGIN
SET INSERTED.L0 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = NULL
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 1
BEGIN
SET INSERTED.L1 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L0
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 2
BEGIN
SET INSERTED.L2 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L1
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 3
BEGIN
SET INSERTED.L3 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L2
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 4
BEGIN
SET INSERTED.L4 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L3
END
END
数据库丢弃错误消息:“.”附近的语法错误对于包含 INSERTED.Lx.
的所有行
我试图弄清楚为什么它现在几个小时都不起作用...
哪里 is/are 我的 mistake/s?
此致
汤姆
您必须更新 table 而不是 INSERTED
table。试试这个方法:
UPDATE T
SET T.L0 = CASE T.HIERARCHY_LEVEL WHEN 0 THEN T.TOPOLOGY_ID ELSE T.L0 END
,T.L1 = CASE T.HIERARCHY_LEVEL WHEN 1 THEN T.TOPOLOGY_ID ELSE T.L1 END
,T.L2 = CASE T.HIERARCHY_LEVEL WHEN 2 THEN T.TOPOLOGY_ID ELSE T.L2 END
,T.L3 = CASE T.HIERARCHY_LEVEL WHEN 3 THEN T.TOPOLOGY_ID ELSE T.L3 END
,T.L4 = CASE T.HIERARCHY_LEVEL WHEN 4 THEN T.TOPOLOGY_ID ELSE T.L4 END
,T.PARENT = CASE T.HIERARCHY_LEVEL WHEN 0 THEN NULL
WHEN 1 THEN T.L0
WHEN 2 THEN T.L1
WHEN 3 THEN T.L2
WHEN 4 THEN T.L2 ELSE T.PARENT END
FROM TOPOLOGY AS T
INNER JOIN INSERTED AS I
ON T.KEY = I.KEY -- Your Primary Key
由于 INSERTED
是 table,您不能像以前那样使用 IF
。您必须将 table 与 INSERTED
table 结合起来才能仅更新插入的行。
这是我的第一个问题。我绝对是 DML 的初学者。
目的是为网络中的后期下拉框实现层次结构 ui。 原始代码适用于 oracle,我尝试将其翻译成 SQL 服务器。在 Oracle 中,他们用 "before insert" 和 "for each row".
解决了它到目前为止,这是我的代码:
CREATE TRIGGER dbo.test
ON dbo.TOPOLOGY
AFTER INSERT
AS
BEGIN
IF @@ROWCOUNT = 0
RETURN
SET NOCOUNT ON
IF INSERTED.HIERARCHY_LEVEL = 0
BEGIN
SET INSERTED.L0 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = NULL
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 1
BEGIN
SET INSERTED.L1 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L0
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 2
BEGIN
SET INSERTED.L2 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L1
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 3
BEGIN
SET INSERTED.L3 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L2
END
ELSE
IF INSERTED.HIERARCHY_LEVEL = 4
BEGIN
SET INSERTED.L4 = INSERTED.TOPOLOGY_ID
SET INSERTED.PARENT = INSERTED.L3
END
END
数据库丢弃错误消息:“.”附近的语法错误对于包含 INSERTED.Lx.
的所有行我试图弄清楚为什么它现在几个小时都不起作用...
哪里 is/are 我的 mistake/s?
此致
汤姆
您必须更新 table 而不是 INSERTED
table。试试这个方法:
UPDATE T
SET T.L0 = CASE T.HIERARCHY_LEVEL WHEN 0 THEN T.TOPOLOGY_ID ELSE T.L0 END
,T.L1 = CASE T.HIERARCHY_LEVEL WHEN 1 THEN T.TOPOLOGY_ID ELSE T.L1 END
,T.L2 = CASE T.HIERARCHY_LEVEL WHEN 2 THEN T.TOPOLOGY_ID ELSE T.L2 END
,T.L3 = CASE T.HIERARCHY_LEVEL WHEN 3 THEN T.TOPOLOGY_ID ELSE T.L3 END
,T.L4 = CASE T.HIERARCHY_LEVEL WHEN 4 THEN T.TOPOLOGY_ID ELSE T.L4 END
,T.PARENT = CASE T.HIERARCHY_LEVEL WHEN 0 THEN NULL
WHEN 1 THEN T.L0
WHEN 2 THEN T.L1
WHEN 3 THEN T.L2
WHEN 4 THEN T.L2 ELSE T.PARENT END
FROM TOPOLOGY AS T
INNER JOIN INSERTED AS I
ON T.KEY = I.KEY -- Your Primary Key
由于 INSERTED
是 table,您不能像以前那样使用 IF
。您必须将 table 与 INSERTED
table 结合起来才能仅更新插入的行。