Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara membuat pemicu baris PL/SQL yang memvalidasi kolom dari tabel lain

Ada beberapa masalah dengan pemicu Anda. Mari kita mulai dengan 'hubungan' antara pernyataan pilih dan kode yang tersisa. Dalam kasus khusus ini select.. dan if...end_if (untuk saat ini anggap pilihan Anda benar-benar berfungsi, itu tidak tetapi hanya berasumsi). Sekarang berkonsentrasilah pada klausa WHERE.

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

IF TRUST = 'NO' THEN ...

Karena pilihan Anda HANYA mengembalikan YA, pernyataan if tidak akan pernah Benar. Oleh karena itu pengecualian aplikasi tidak pernah dapat dimunculkan. Sekarang, apa masalah dengan select .
Pertama-tama Anda mengakses tabel yang memicu pemicu. Meskipun dalam beberapa kasus Anda dapat lolos begitu saja tetapi biasanya menghasilkan ORA -04091:tabel sedang bermutasi, pemicu/fungsi mungkin tidak melihatnya . Adalah gagal untuk selalu menghindari referensi tabel pemicu sama sekali. Anda mereferensikan data tabel dengan catatan semu :NEW dan/atau :OLD. Kedua, kueri Anda tidak melakukan apa yang Anda pikirkan. Dikatakan

Namun klausa INTO mengharuskan pernyataan untuk mengembalikan tepat 1 baris . Lebih dari 1 baris menghasilkan pengecualian, dan 0 baris menghasilkan no data found pengecualian.
Akhirnya ada masalah dengan raise_application_error statement . Jika dieksekusi akan memunculkan argumen angka...di luar jangkauan pengecualian. Parameter pertama harus antara -20999 hingga -20000 (Bilangan negatif). Jadi seperti apa hasilnya:

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;
/

CATATAN:
JANGAN gunakan tipe data VARCHAR. Itu diperbolehkan tetapi Oracle merekomendasikan untuk tidak melakukannya. Berarti mereka berhak untuk mengubah apa yang dilakukannya setiap saat. Gunakan VARCHAR2 yang direkomendasikan sebagai gantinya.
Saya mengubah pemicu untuk diaktifkan pada Sisipkan atau Perbarui. Jika diaktifkan di Sisipkan, hanya seseorang yang BISA mengubah nama_pemasok menjadi referensi pemasok yang tidak tepercaya dan semuanya akan baik-baik saja.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu Oracle SQL &PL/SQL? Semua Yang Perlu Diketahui Pemula

  2. Paket cx_Oracle Tidak berfungsi di dalam Crontab

  3. Kesalahan (2,7):PLS-00428:klausa INTO diharapkan dalam pernyataan SELECT ini

  4. cara mengatur kolom kenaikan otomatis dengan pengembang sql

  5. Oracle Identifikasi Tipe Data