【问题标题】:convert oracle trigger to ms sql trigger将 oracle 触发器转换为 ms sql 触发器
【发布时间】:2013-07-16 20:38:59
【问题描述】:

我有一个预言机触发器:

CREATE OR REPLACE TRIGGER  "BI_Info" 
BEFORE INSERT ON "Info" FOR EACH ROW
 WHEN (NEW."Id" IS NULL OR NEW."Id" = 0) BEGIN
    SELECT NVL(MAX("Id")+1, 1) INTO :NEW."Id" FROM "Info";
END;

现在我想将它转换为 ms sql 触发器。

我知道 [Id] [int] IDENTITY(1,1) 可以类似地实现这个触发器

但我不希望 Id 自动添加一个。

谢谢。

【问题讨论】:

  • 函数NVL有什么作用?
  • 检查“Id”是否为空

标签: sql-server oracle triggers


【解决方案1】:
  1. MS SQL 不支持BEFORE 触发器。您应该使用INSTEAD OF 触发器。
  2. MS SQL 触发器是基于集合而不是基于行的触发器,因此应该考虑到这一点

你可以试试

CREATE TRIGGER tg_BI_Info_insert ON BI_Info
INSTEAD OF INSERT AS
BEGIN
  DECLARE @max INT

  SET @max = (SELECT COALESCE(MAX(id), 0) FROM BI_Info WITH (TABLOCKX, HOLDLOCK))

  INSERT INTO BI_Info (id, column1, ...)
  SELECT @max + ROW_NUMBER() OVER (ORDER BY (SELECT 1)), column1, ...
    FROM INSERTED
END

这里是SQLFiddle演示

如果您想模拟 WHEN (NEW."Id" IS NULL OR NEW."Id" = 0) 允许插入显式分配的 id 的部分

CREATE TRIGGER tg_BI_Info_insert ON BI_Info
INSTEAD OF INSERT AS
BEGIN
  DECLARE @max INT

  INSERT INTO BI_Info
  SELECT * 
    FROM INSERTED
   WHERE COALESCE(id, 0) <> 0

  SET @max = (SELECT COALESCE(MAX(id), 0) FROM BI_Info WITH (TABLOCKX, HOLDLOCK))

  INSERT INTO BI_Info (id, column1)
  SELECT @max + ROW_NUMBER() OVER (ORDER BY (SELECT 1)), column1
    FROM INSERTED
   WHERE COALESCE(id, 0) = 0
END

这里是 SQLFiddle 该案例的演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-15
    • 2019-04-08
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多