1

挿入、削除、および更新操作の後にテーブル内のデータを更新する方法を知っている人はいますか? 私は単純なテーブルを持っています:

create table EV_JOURNAL (EVENT_TO_TASK_ID NUMBER(3)
NOT NULL Check(EVENT_TO_TASK_ID>0), EVENT_TIME TIMESTAMP WITH TIME ZONE NOT NULL);

// テーブルが作成されました トリガーに関する情報を見つけて、挿入、削除、および更新後のトリガーを作成しました。

    create or replace 
TRIGGER AFT_INS_UPD_DEL_TRIG
   AFTER Insert or Delete or Update ON EV_JOURNAL   
   For Each Row
  DECLARE 
  BEGIN 
  INSERT INTO EV_JOURNAL(EVENT_TO_TASK_ID,EVENT_TIME)
   VALUES(:NEW.EVENT_TO_TASK_ID, :NEW.EVENT_TIME); 
  END AFT_INS_UPD_DEL_TRIG;

しかし、テーブルにデータを挿入しようとすると、次のようになります。

Insert into ev_journal (event_time,event_to_task_id) values(systimestamp,2);

次のエラーがあります: SQL エラー: ORA-04091: テーブル EV_JOURNAL が変化しています。ORA-04088: トリガーの実行中にエラーが発生しました。誰かがこの状況で私を助けてくれますか? テーブルを更新するだけで十分ですが、これを行う方法がわかりません。

指定されたテーブルから更新されたデータを使用する必要がある C# アプリのコード:

public static List<EventTrigger> FillEventTriggerList (List<EventTrigger> list)
        {            
            using (OracleConnection connection = new OracleConnection (connectionString))
            {
                connection.Open ();
                string sqlText = "Select * From EV_JOURNAL";
                OracleCommand command = new OracleCommand (sqlText, connection);
                OracleDataReader reader = command.ExecuteReader ();
                while (reader.Read ())
                {                               
                    list.Add (new EventTrigger (int.Parse(reader [ "EVENT_TO_TASK_ID" ].ToString()),(DateTime)(reader [ "EVENT_TIME" ])));
                }
            }
            return list;
        } 

したがって、EV_JOURNAL からいくつかの行を削除するとしましょう。この Select クエリの後、既に削除されているはずの古いデータが取得されますが、データベースでテーブルの更新をクリックした後にのみ削除されます。

ありがとう

4

1 に答える 1

2

これは意味がありません。テーブルへの変更を検出し、同じ行を同じテーブルに挿入して対応しようとしています。

おそらく、テーブルを「更新」することの意味を説明できるでしょう。

編集:データベースで更新をクリックしているのではなく、データベースにアクセスしているツールで更新をクリックしています。データの変更が行われましたが、使用しているどのツールでも、このクリックを介して、新しいバージョンに移動して読み取るように指示する必要があります。

于 2013-09-18T09:08:37.967 に答える