Một tùy chọn sẽ là sử dụng instead of
Kích hoạt. Tuy nhiên, giải pháp này yêu cầu bạn phải đổi tên các bảng của mình và tạo các khung nhìn với tên mà chúng đã có. Bằng cách đó, bạn không ảnh hưởng đến logic của ứng dụng, tuy nhiên, nó có thể ảnh hưởng đến hiệu suất tổng thể, vì vậy nó nên được kiểm tra đúng cách.
Tuy nhiên, sử dụng trình kích hoạt để thay đổi logic ứng dụng sai không phải là một ý kiến hay. Tôi hiểu tình trạng khó khăn của bạn rằng đôi khi chúng ta cần tìm giải pháp thay thế cho các vấn đề hiện có, nhưng điều đó không ổn.
Dù sao, dưới đây là một ví dụ đơn giản mà bạn có thể áp dụng cho logic của mình
SQL> create table t ( c1 number primary key , c2 varchar2(1) ) ;
Table created.
SQL> alter table t rename to tbl_t ;
Table altered.
SQL> create view t as ( select c1 , c2 from tbl_t ) ;
View created.
Bây giờ chúng ta tạo một instead of
kích hoạt
SQL> create or replace trigger tr_v_t
2 instead of insert
3 on t
4 for each row
5 declare
6 pk_violation_exception exception;
7 pragma exception_init(pk_violation_exception, -00001);
8 begin
9 insert into tbl_t (c1,c2)
10 values ( :new.c1,:new.c2 );
11 exception
12 when pk_violation_exception then
13 dbms_output.put_line('ora-00001 (pk_violation_exception) captured');
14 update tbl_t
15 set c2 = :new.c2
16 where c1 = :new.c1 ;
17* end;
SQL> /
Trigger created.
Với trình kích hoạt này, bất kỳ nỗ lực nào để vi phạm ràng buộc sẽ làm cho việc cập nhật giá trị trong bảng cuối cùng có thể thực hiện được.
SQL> select * from t ;
no rows selected
SQL> insert into t values ( 1 , 'A' ) ;
1 row created.
SQL> commit ;
Commit complete.
SQL> insert into t values ( 2, 'B' ) ;
1 row created.
SQL> commit ;
Commit complete.
SQL> insert into t values ( 2, 'C' ) ;
ORA-00001 (pk_violation_exception) captured
1 row created.
SQL> select * from tbl_t ;
C1 C
---------- -
1 A
2 C