2017-04-17 22 views
0

私はテーブルを持っていて、このテーブルは最大で1000行ある必要があります。ユーザーが1001行目を追加したい場合、エラーがなければなりません。私は挿入トリガーを使用する必要があります知っている。私はあなたが私を助けることができるSQLの新しい人ですか?更新トリガを挿入トリガの前に変更するにはどうすればよいですか?

私のコードは次のとおりです。

create or replace trigger update_ext_app_serv 
before update on EXTERNAL_APP_SERVICE 
for each row 

declare 
    row_count number; 
    old_service_id number; 
    new_service_trigger varchar(30); 
    old_service_trigger varchar(30); 
begin 
    row_count := 0; 
    new_service_trigger := :NEW.TRIGGER_NAME; 
    old_service_trigger := :OLD.TRIGGER_NAME; 
    old_service_id := :OLD.SERVICE_ID; 

    select count(*) into row_count 
    from EXTERNAL_APP_PROFILE 
    where ORIG_ID = old_service_id 
    or TERM_FAILURE_RESP_ID = old_service_id 
    or TERM_ID = old_service_id; 

    if (row_count > 0) and (new_service_trigger not like old_service_trigger) 
    then 
     raise_application_error(-20706, 'Unable to update Trigger. The service is referenced at least External Application Profile.'); 
    end if; 
end; 
+0

問題 –

+0

で構文に基づいて 'oracle'と' plsql'で再タグ付けされた私が最初にあなたがしたときにエラーメッセージをしたいすべての後insert'前に 'のためのあなたのトリガーを変更する必要があり、すべてのことを考えます誰かが行を挿入しようとします。 – winter

+0

このトリガーが何をしなければならないのか分かりませんが、外部キーを強制しているようですが、そうするには外部キー制約を使用する必要があります。トリガーは効率が悪く、並行環境では機能しません。 – APC

答えて

1

これを行う方法は、AFTERトリガとし、文ではなく、行レベルです。

SQL> create or replace trigger t1000_trg 
    2 after insert on t1000 
    3 declare 
    4  n pls_integer; 
    5 begin 
    6  select count(*) into n 
    7  from t1000; 
    8  if n > 1000 then 
    9   raise_application_error(-20999, 'No more than 1000 records!'); 
10  end if; 
11 end; 
12/

Trigger created. 
SQL> 

ここにテストデータがあります。

SQL> select count(*) from t1000; 

    COUNT(*) 
---------- 
     999 

SQL> 

1000番目の記録大丈夫...

SQL> insert into t1000 values (1000); 

1 row created. 

SQL> 

...しかし、1001番目のレコードは拒否されます:複数行の挿入ステートメントのため

SQL> insert into t1000 values (1001); 
insert into t1000 values (1001) 
      * 
ERROR at line 1: 
ORA-20999: No more than 1000 records! 
ORA-06512: at "FOX.T1000_TRG", line 7 
ORA-04088: error during execution of trigger 'FOX.T1000_TRG' 

SQL> 

作品をあまりにも。

SQL> roll 
Rollback complete. 
SQL> select count(*) from t1000; 

    COUNT(*) 
---------- 
     999 

SQL> insert into t1000 select 1000 + level from dual connect by level <= 5; 
insert into t1000 select 1000 + level from dual connect by level <= 5 
      * 
ERROR at line 1: 
ORA-20999: No more than 1000 records! 
ORA-06512: at "FOX.T1000_TRG", line 7 
ORA-04088: error during execution of trigger 'FOX.T1000_TRG' 


SQL> 
関連する問題