0

テーブルが変化しているため、トリガー内のSQLステートメントを変化するテーブルに対して実行できないと思われるため、次のトリガーは機能しませんが、11gを使用していないため、複合トリガーを作成できません。宣言セクションに含めようとPRAGMA AUTONOMOUS TRANSACTION;しましたが、これはコンパイルされません。誰かが私に最善の解決策を提供できますか?

create or replace 
trigger fb_pers_id_check2_tr
  --after insert on ifsapp.person_info_tab
  before insert on ifsapp.person_info_tab      
for each row
begin
  declare
--  pragma autonomous_transaction;
    v_pid_ person_info_tab.person_id%type;
    format_name_ person_info_tab.name%type;
  begin

  v_pid_ := :new.person_id;

  select regexp_replace(upper(:new.name), '\W')
    into format_name_
  from ifsapp.person_info_tab
  where person_id = v_pid_;

  if length(v_pid_) < 3 and (length(format_name_) < 21 and v_pid_ <> format_name_) then
    raise_application_error(-20001, 'Person ID: ' || v_pid_ || 'is not valid, please enter a valid     Person ID, e.g. "' || format_name_ || '".');
  end if;
end;
end fb_pers_id_check2_tr;

注意: 平易な英語では、このトリガーは、ユーザーが 3 文字未満の長さの個人 ID を設定することを停止することを目的としています。21 文字未満の場合、変数 'format_name_' と等しくありません。

4

1 に答える 1

2

Oracle では、行トリガーがトリガーが定義されているテーブルを読み取ったり変更したりすることは許可されていません。ただし、PERSON_ID が PERSON_INFO_TAB の PRIMARY キーまたは UNIQUE キーである場合 (シングルトン SELECT で使用されている場合は、そのように思われます)、実際にはテーブルを読み取る必要はありません。必要に応じて OLD または NEW 値を使用するだけです。

create or replace trigger fb_pers_id_check2_tr
  before insert on ifsapp.person_info_tab
  for each row
declare
  v_pid_ person_info_tab.person_id%type;
  format_name_ person_info_tab.name%type;
begin
  v_pid_ := :new.person_id;

  format_name_ := REGEXP_REPLACE(UPPER(:new.name), '\W');    

  if length(v_pid_) < 3 and
     length(format_name_) < 21 and
     v_pid_ <> format_name_
  then
    raise_application_error(-20001, 'Person ID: ' || v_pid_ ||
                            ' is not valid, please enter a valid' ||
                            ' Person ID, e.g. "' || format_name_ || '".');
  end if;
end fb_pers_id_check2_tr;

ここで、コードは NAME の NEW 値をチェックしています (入力を検証しているように見えるので、これは正しいと思います) が、意図が OLD 値をチェックすることであった場合、 REGEXP_REPLACE 呼び出しで :NEW を :OLD に変更するのは簡単です.

共有してお楽しみください。

于 2013-07-24T11:11:08.250 に答える