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

Kích hoạt để kiểm tra các bản sao

Nói chung, bạn không thể thực thi loại ràng buộc này trong trình kích hoạt. Bạn sẽ cần sử dụng một ràng buộc.

Vấn đề bạn sẽ gặp phải nếu cố gắng sử dụng trình kích hoạt là bạn thường gặp phải ngoại lệ "bảng biến đổi". Nói chung, trình kích hoạt cấp hàng trên bảng A (tức là thuộc tính properties ) không thể truy vấn bảng A. Bạn có thể giải quyết vấn đề đó bằng cách tạo một gói, tạo một tập hợp trong gói đó, khởi tạo tập hợp trong trình kích hoạt câu lệnh trước, ghi các khóa được chèn hoặc cập nhật vào tập hợp trong trình kích hoạt cấp hàng , và sau đó lặp qua các phần tử của tập hợp trong một kích hoạt câu lệnh sau và phát hành DML thích hợp đối với bảng. Tuy nhiên, điều này liên quan đến rất nhiều mảnh chuyển động và rất nhiều phức tạp (mặc dù độ phức tạp sẽ giảm đi nếu bạn đang ở mức 11g và có thể sử dụng trình kích hoạt phức hợp để thay thế).

Ngoài ra, nếu bạn cố gắng sử dụng trình kích hoạt, bạn sẽ gặp phải sự cố trong môi trường nhiều người dùng. Nếu người dùng A chèn một hàng trong một phiên và người dùng B chèn một hàng trùng lặp trong một phiên khác trước khi người dùng A cam kết, thì cả trình kích hoạt của phiên sẽ không phát hiện ra hàng trùng lặp. Bạn có thể giải quyết loại vấn đề này bằng cách khóa rõ ràng một hàng trong bảng mẹ để tuần tự hóa các phần chèn vào bảng (cố ý làm cho ứng dụng chậm hơn và ít khả năng mở rộng hơn). Nhưng một hạn chế sẽ là một giải pháp hiệu quả và thiết thực hơn nhiều.

Tất cả những gì đang nói, nếu bạn chỉ chèn một hàng bằng cách sử dụng INSERT ... VALUES cú pháp và tự giới hạn trong một phiên duy nhất, trình kích hoạt của bạn dường như hoạt động

SQL> ed
Wrote file afiedt.buf

  1  create table Properties(
  2          idProperties number(10) NOT NULL,
  3          Address_FK number(20),
  4          Ownership_FK number(20)
  5* )
SQL> /

Table created.

SQL> CREATE OR REPLACE TRIGGER Check_Duplicate
  2  before insert or update on properties
  3  FOR each ROW
  4
  5  declare
  6  v_dup number;
  7
  8  begin
  9      select count(idProperties) INTO v_dup from properties where Address_FK=
:NEW.Address_FK and
 10       Ownership_FK=:NEW.Ownership_FK;
 11
 12   if v_dup > 0 then
 13     Raise_Application_Error (-20100, 'This property already exists. The inse
rt is cancelled.');
 14  end if;
 15  end;
 16  /

Trigger created.

SQL> insert into properties values( 1, 10, 100 );

1 row created.

SQL> insert into properties values( 2, 10, 100 );
insert into properties values( 2, 10, 100 )
            *
ERROR at line 1:
ORA-20100: This property already exists. The insert is cancelled.
ORA-06512: at "SCOTT.CHECK_DUPLICATE", line 9
ORA-04088: error during execution of trigger 'SCOTT.CHECK_DUPLICATE'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi định dạng Ngày của Oracle sang Java?

  2. Oracle chọn không trả về tất cả các cột trong sqlplus

  3. cx_Oracle không nhận dạng được vị trí cài đặt phần mềm Oracle để cài đặt trên Linux

  4. Nối các bộ sưu tập trong PLSQL

  5. Chọn vào một bảng tạm thời trong Oracle