2017-04-17 131 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

重新標記'oracle'和基於問題 –

+0

語法'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> 

作品多行INSERT語句了。

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>