0

テーブルに次のトリガーがあります。直面している問題はmy_hist、条件が になると、古い値と新しい値の両方がテーブルに挿入されることupdated = 'Y'です。

条件が になったときに、古い値を my_hist テーブルに効率的に挿入するにはどうすればよいですかupdated = 'Y'

ありがとう

CREATE OR REPLACE TRIGGER mytrig
    AFTER UPDATE
    ON mytab
    FOR EACH ROW
WHEN (
new.updated = 'Y'
      )
BEGIN
    INSERT INTO my_hist
      VALUES   (
                        :old.id,
                        :old.no,                        
                        :old.start_date,
                        :old.end_date,
                        SYSDATE
                  );
END mytrig;
/

更新 1

更新updated = 'Y'している場合、記録がある場合

id = 3、start_date='01-Jan-2014' および end_date='31-Jan-2014' でデータを更新すると id = 3, start_date=='01-Jan-2014' and end_date='31-Mar-2014'、my_hist テーブルに 2 つのレコードが作成されます。

id = 3 and start_date='01-Jan-2014' and end_date='31-Jan-2014'

id = 3 and start_date='01-Jan-2014' and end_date='31-Mar-2014'

理想的には、新しいデータid = 3 and start_date='01-Jan-2014' and end_date='31-Jan-2014'であるため、2 行目ではなく、my_hist テーブルにのみ含める必要があります。end_date='31-Mar-2014'

4

1 に答える 1

2

あなたの説明に欠けているものがあります。あなたが言っていることを実行すると、履歴テーブルには1行しかなく、古いデータが含まれます。新しいデータを含む履歴行もある場合は、トリガーが投稿したもの以外のことを行っているか、履歴テーブルに書き込みを行っている別の何か (つまり、別のトリガー) があります。

2 つのテーブルを作成する

SQL> ed
Wrote file afiedt.buf

  1  create table my_tab (
  2    id number,
  3    start_date date,
  4    end_date date,
  5    no number,
  6    updated varchar2(1)
  7* )
SQL> /

Table created.

SQL> ed
Wrote file afiedt.buf

  1  create table my_hist (
  2    id number,
  3    start_date date,
  4    end_date date,
  5    no number,
  6    updated varchar2(1),
  7    update_date date
  8* )
SQL> /

初期データの入力

SQL> ed
Wrote file afiedt.buf

  1  insert into my_tab
  2*   values( 3, date '2014-01-01', date '2014-01-31', 1, 'Y' )
SQL> /

1 row created.

トリガーを作成する

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER mytrig
  2      AFTER UPDATE
  3      ON my_tab
  4      FOR EACH ROW
  5  WHEN (
  6  new.updated = 'Y'
  7        )
  8  BEGIN
  9      INSERT INTO my_hist( id,
 10                           no,
 11                           start_date,
 12                           end_date,
 13                           update_date )
 14        VALUES   (
 15                          :old.id,
 16                          :old.no,
 17                          :old.start_date,
 18                          :old.end_date,
 19                          SYSDATE
 20                    );
 21* END mytrig;
SQL> /

Trigger created.

今、行を更新すると

SQL> update my_tab
  2     set end_date = date '2014-03-31'
  3   where id = 3;

1 row updated.

MY_HISTテーブルには 1 つの行しかなく、その行には の行からの古い値が含まれます。MY_TAB

SQL> select * from my_hist;

        ID START_DAT END_DATE          NO U UPDATE_DA
---------- --------- --------- ---------- - ---------
         3 01-JAN-14 31-JAN-14          1   27-MAY-12

2 つの行が表示される場合、別の何かが 2 番目の行を書き込んでいます。私の推測では、別のトリガーが定義されていると思います。

于 2012-05-27T16:10:19.447 に答える