2017-12-15 26 views
-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; 
+2

何をあなたがこれまでに試してみましたかあなたは私たちがあなたのために仕事をするために期待していましたか? – WhatsThePoint

+0

3つのトリガー(挿入、削除、更新ごとに1つ)を作成し、sqlstateシグナルを二重引用符で囲みます。 –

+0

ヒント: 'inserted'と' deleted'はテーブルであり、set操作の結果を表すことができます。常に正確に1つの行を処理するという前提でトリガーを設計するのは、一般的には悪い計画です。もしあなたが絶対に確実であれば、複数の行が存在することはありません。そして、行数のチェックを追加し、 'RaIsError'または' Throw'を使って、後に来て、容認できない文を実行しようとしたことを明示します。 ( 'if(select from Count(*)from insert)> 1 RaIsError( 'FooTable_Insert:複数行は処理できません'、25,42)with log') – HABO

答えて

0

私が書いたコードをチェックするためにそれは非常に困難であるが、それはこのようなものが考えられます。

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TRIGGER [PEXLATEST].[TRG_TCM_BEF_INS_UPD] 
    ON TYPE_CODE_MASTER 
    AFTER INSERT,DELETE,UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 


    IF EXISTS(SELECT 1 FROM inserted) 
     BEGIN 
      -- insert or update, check same condition in your code 
      -- new rows are already inserted or updated because trigger execute always AFTER 
      IF EXISTS(SELECT 1 FROM TYPE_CODE_MASTER 
         WHERE TCM_TYPE IN (SELECT TCM_TYPE FROM inserted) 
         GROUP BY TCM_NAME_E 
         HAVING COUNT(*) > 1) 
       OR EXISTS(SELECT 1 FROM TYPE_CODE_MASTER 
         WHERE TCM_TYPE IN (SELECT TCM_TYPE FROM inserted) 
         GROUP BY TCM_NAME_A 
         HAVING COUNT(*) > 1)  

       BEGIN 
        RAISERROR('Duplicate Name', 16, 1); 
        ROLLBACK TRAN; 
        RETURN; 
       END 
     END 
    ELSE 
     BEGIN 
     -- delete 
     IF EXISTS(SELECT 1 FROM deleted AS D 
       INNER JOIN ITEM AS I ON I.ITM_CATEGORY_TYPE_ID = D.TCM_ID 
      ) 
      BEGIN 
        RAISERROR('Item Category referred in Items', 16, 1); 
        ROLLBACK TRAN; 
        RETURN; 
      END 
     END 
END 
GO 
関連する問題