Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm thế nào để vượt qua một vi phạm ràng buộc duy nhất?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cài đặt Oracle 12c Enterprise Edition trên Windows 7

  2. Tôi có thể tham gia giữa các nguồn dữ liệu trong SSRS không?

  3. Tại sao hibernate tạo tiền tố 'T_' tableName trong quá trình chèn và xóa?

  4. Truy vấn tham số động với like

  5. Làm thế nào để lưu BLOB dưới dạng tệp trong PL / SQL?