在 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 结合起来才能仅更新插入的行。