0

こんにちは皆さん、私はトリガーに関しては少し初心者なので、フォロートリガーを実行する方法についてアドバイスを探しています。

営業時間中に誰かがレコードを削除した場合にエラー メッセージをスローするトリガーを作成しましたが、SYSDATE を使用する別のトリガーを作成して、今日および将来の日付からレコードを削除しないようにしたいと考えています。

>=SYSDATE を使用することを考えていましたが、それが有効な SQL ステートメントであるかどうかはわかりません。

CREATE OR REPLACE TRIGGER records_delete 
BEFORE DELETE 
ON RECORDS FOR EACH ROW 
BEGIN 
    IF TO_CHAR(SYSDATE, 'HH24MI') NOT >= sysdat 
       RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records'); 
    END IF; 
END records_delete;

ありがとう、レプレジョン

4

1 に答える 1

1

ここでの問題は、削除元のテーブルのどのフィールドも参照していないことです。

テーブルに record_date という列がある場合、これを次のように書き換えることができます。

CREATE OR REPLACE TRIGGER records_delete 
BEFORE DELETE 
ON RECORDS FOR EACH ROW 
BEGIN 
    IF (:old.record_date >= SYSDATE) THEN
       RAISE_APPLICATION_ERROR(-20669, 'You can not delete current or future records'); 
    END IF; 
END records_delete;

構文:old. および : 新しい。:old を使用して、トリガーによって処理されている現在のレコードの列を参照する方法です。トリガーが値に作用する前に値を検査するためのプレフィックスであり、:new. トリガーが完了した後の値です。この構文を使用すると、トリガーがデータを更新する前後の値を確認できますが、レコードを削除しているため、この場合は問題になりません。

日付フィールドの時間、分、秒を無視する場合は、IF ステートメントでこれを使用します。

trunc(:old.record_date) >= trunc(SYSDATE)

record_date が実際には日付ではなく文字列として格納されている場合は、比較する前に日付に変換します。

to_date(:old.record_date, 'DDMMYYYY') >= trunc(SYSDATE)

フォーマット マスク 'DDMMYYYY" を、日付が実際に格納されているフォーマットに更新します。to_date および日付フォーマット モデルの説明については、Oracle のドキュメントを確認してください。

これを試してみて、それが機能するかどうかを確認してください。

于 2015-04-10T19:22:32.540 に答える