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

Cách tạo trình kích hoạt hàng PL / SQL xác thực một cột từ bảng khác

Có một số vấn đề với trình kích hoạt của bạn. Hãy bắt đầu với 'mối quan hệ' giữa một câu lệnh chọn và mã còn lại. Trong trường hợp cụ thể này, select..if...end_if (hiện tại giả sử lựa chọn của bạn thực sự hoạt động, nó không hoạt động nhưng chỉ giả sử). Bây giờ tập trung vào mệnh đề WHERE.

SELECT SUPPLIER.TRUSTED_SUPPLIER
    INTO TRUST
    ...
    WHERE SUPPLIER.TRUSTED_SUPPLIER = 'YES';

IF TRUST = 'NO' THEN ...

Vì lựa chọn của bạn chỉ trả về CÓ nên câu lệnh if sẽ không bao giờ đúng. Do đó, ngoại lệ ứng dụng không bao giờ có thể được nâng lên. Bây giờ, vấn đề với select là gì .
Trước tiên, bạn đang truy cập vào bảng mà trình kích hoạt được kích hoạt. Mặc dù trong một số trường hợp, bạn có thể thoát khỏi nó nhưng thường thì nó dẫn đến ORA -04091:bảng đang thay đổi, trình kích hoạt / chức năng có thể không nhìn thấy nó . Đó là một sự phá sản khi luôn tránh tham chiếu đến bảng kích hoạt hoàn toàn. Bạn tham chiếu dữ liệu bảng với các bản ghi giả MỚI và / hoặc:CŨ. Thứ hai, truy vấn của bạn không hoạt động như bạn nghĩ. Nó nói

Tuy nhiên, mệnh đề INTO yêu cầu câu lệnh trả về chính xác 1 hàng . Thêm vào đó, 1 hàng dẫn đến ngoại lệ và 0 hàng dẫn đến no data found ngoại lệ.
Cuối cùng, có một vấn đề với câu lệnh raise_application_error statement . Nếu nó được thực thi, nó sẽ đưa ra một đối số number ... nằm ngoài phạm vi ngoại lệ. Tham số đầu tiên phải nằm trong khoảng từ -20999 đến -20000 (Số âm). Vì vậy, kết quả trông như thế nào:

create or replace trigger verify_supplier_trust
before insert or update on product
for each row 
declare 
    trust varchar2(3);

begin
    select supplier.trusted_supplier
      into trust
      from supplier 
     where supplier.company_name = :new.supplier_name
       and supplier.trusted_supplier = 'YES';
exception
   when no_data_found then 
        raise_application_error(-20001, 'supplier not trusted');
end;
/

LƯU Ý:
KHÔNG sử dụng kiểu dữ liệu VARCHAR. Nó được phép nhưng Oracle khuyến cáo không nên. Có nghĩa là họ bảo lưu quyền thay đổi những gì nó làm bất cứ lúc nào. Sử dụng VARCHAR2 được đề xuất thay thế.
Tôi thay đổi trình kích hoạt để kích hoạt trên Chèn hoặc Cập nhật. Nếu được kích hoạt trên Chèn chỉ ai đó CÓ THỂ thay đổi tên nhà cung cấp để tham chiếu đến một nhà cung cấp không đáng tin cậy và tất cả đều ổn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. XMLAGG với sự cố RTRIM

  2. MVC4 Entity Framework nhiều đến nhiều tên bảng kết hợp tùy chỉnh và tên lược đồ

  3. Sự cố tiêu điểm của Vista khi gọi kiểm tra chính tả Microsoft Word từ Biểu mẫu Oracle

  4. Cách tạo ràng buộc not null trong oracle

  5. Oracle SQL - Truy vấn 2 bảng dựa trên các khóa ngoại của chúng