繁体   English   中英

将oracle触发器转换为ms sql触发器

[英]convert oracle trigger to ms sql trigger

我有一个oracle触发器:

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自动添加一个。

谢谢。

  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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM