0

同じスキーマを持つ2つのテーブルと、両方のnocとしての主キーがあります。

表1で挿入を行う場合は常に、そのnocをTABLE2でチェックする必要があります。存在する場合は、行全体を比較し、違いがある場合は例外を発生させる必要があります。また、nocがTABLE2に存在しない場合は、単純な挿入が続く必要があります

これが私のトリガー機能です

          CREATE OR REPLACE FUNCTION ac_val()
           RETURNS trigger AS
           $BODY$

            BEGIN

           IF NEW.acop IS NULL THEN

                           INSERT INTO exception_detail( noc,exception) 
    VALUES (new.noc,'number cannot be empty');


    END IF;


    RETURN NEW;
           END;
   $BODY$
       LANGUAGE plpgsql VOLATILE

これが私の引き金です

             CREATE TRIGGER acut_val
           AFTER INSERT OR UPDATE
             ON acut
          FOR EACH ROW
         EXECUTE PROCEDURE ac_val();

これは1つのテーブルで完全に問題ありませんが、すべての挿入の要件に従って、nocが他のテーブルに存在するかどうかを確認する必要があります。TABLE2、存在する場合は比較を行う必要があります。そうでない場合は挿入します。

acuitに挿入されるデータはcsvからコピーされるため、挿入ごとにそのチェックを実行できないと思います。これにはcsvからのコピーが必要であり、コピーするとエラーが発生します。uはスーパーユーザーである必要がありますが、iコンソールからそのOKをコピーします。したがって、acuitでデータがコピーされた後、行ごとにチェックを行うようなことを行うことができますか?

             SELECT q1.* FROM acut q1
             INNER JOIN TABLE2 q2 ON (q1.noc = q2.noc);

TABLE2に存在するacutのレコードを提供します

その後

              foreach row of above output{

      if (q1.name != q2.name)
      Do something ;

    if (q2.address < q1.address)
     Do something ;

     } 
4

1 に答える 1

0

私が考えることができる最も簡単な解決策は、でトリガーを使用することtable1です。

他のユーザーからのコミットされていないデータを表示できないため、トリガーを使用して一意性を確認しないでください。

INSERT代わりに、データへのトリガーを使用しtable2てください。これには、チェックするすべての列に一意の制約が必要です。

table2にすでに存在するデータをtable1に挿入すると、table2の一意の制約に違反し、フロントエンドでキャッチできる例外が発生します。

このアプローチの大きな利点は、トランザクションがテーブル2のコミットされていないデータを認識できないマルチユーザーの状況でも正しく機能するが、DBMSは挿入の続行を阻止することです(トランザクションは、他のトランザクションcommitがまたはrollbacks)。

于 2012-10-29T13:08:21.577 に答える