【发布时间】:2017-12-15 10:55:29
【问题描述】:
我想将 Oracle 数据库迁移到 SQL Server。 我已使用 SQL Server 迁移助手转换数据库,但触发器无法正常工作。
如何将以下 oracle 触发器转换为 SQL Server 触发器?
create or replace TRIGGER "PEXLATEST".TRG_TCM_BEF_INS_UPD BEFORE INSERT OR UPDATE OR DELETE ON TYPE_CODE_MASTER REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
L_COUNT NUMBER:=0;
BEGIN
IF(INSERTING) THEN
SELECT COUNT(1) INTO L_COUNT FROM TYPE_CODE_MASTER
WHERE TCM_TYPE=:NEW.TCM_TYPE
AND (TCM_NAME_E=:NEW.TCM_NAME_E OR TCM_NAME_A=:NEW.TCM_NAME_A);
IF L_COUNT>0 THEN
raise_application_error( -20001, 'Duplicate Name');
END IF;
END IF;
IF (UPDATING) THEN
SELECT COUNT(1) INTO L_COUNT FROM TYPE_CODE_MASTER
WHERE TCM_TYPE=:NEW.TCM_TYPE
AND (TCM_NAME_E=:NEW.TCM_NAME_E OR TCM_NAME_A=:NEW.TCM_NAME_A)
AND TCM_ID<>:NEW.TCM_ID;
IF L_COUNT>0 THEN
raise_application_error( -20001, 'Duplicate Name');
END IF;
END IF;
IF (DELETING) THEN
IF :OLD.TCM_TYPE='ICTG' THEN
SELECT COUNT(1) INTO L_COUNT FROM ITEM
WHERE ITM_CATEGORY_TYPE_ID=:OLD.TCM_ID;
IF L_COUNT>0 THEN
raise_application_error( -20002, 'Item Category referred in Items');
END IF;
END IF;
END IF;
END;
【问题讨论】:
-
到目前为止您尝试过什么,或者您希望我们为您完成这项工作?
-
创建 3 个触发器(每个插入、删除、更新 1 个),删除双引号。阅读信号 sqlstate。
-
提示:
inserted和deleted是表,因此它们可以表示集合操作的结果。假设触发器总是只处理一行,而设计触发器通常是一个糟糕的计划。如果您绝对确定不会超过一排,那么请添加对行数的检查,并使用RaIsError或Throw明确告知以后来的人他们有试图执行不可接受的语句。 (if ( select Count(*) from inserted ) > 1 RaIsError( 'FooTable_Insert: No more than one row may be processed.', 25, 42 ) with log)
标签: sql-server tsql database-trigger