-1
OracleデータベースをSQL Serverに移行したいと考えました。 データベースの変換にSQL Server移行アシスタントを使用しましたが、トリガーが正しく機能していません。次のOracleトリガーを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;
何をあなたがこれまでに試してみましたかあなたは私たちがあなたのために仕事をするために期待していましたか? – WhatsThePoint
3つのトリガー(挿入、削除、更新ごとに1つ)を作成し、sqlstateシグナルを二重引用符で囲みます。 –
ヒント: 'inserted'と' deleted'はテーブルであり、set操作の結果を表すことができます。常に正確に1つの行を処理するという前提でトリガーを設計するのは、一般的には悪い計画です。もしあなたが絶対に確実であれば、複数の行が存在することはありません。そして、行数のチェックを追加し、 'RaIsError'または' Throw'を使って、後に来て、容認できない文を実行しようとしたことを明示します。 ( 'if(select from Count(*)from insert)> 1 RaIsError( 'FooTable_Insert:複数行は処理できません'、25,42)with log') – HABO