sql >> Database teknologi >  >> RDS >> Oracle

Flere begrænsninger i tabel:Hvordan får man alle overtrædelser?

Der er ingen enkel måde at rapportere alle mulige overtrædelser af begrænsninger på. Fordi når Oracle støder på den første overtrædelse af en begrænsning, er ingen yderligere evaluering mulig, sætningen mislykkes, medmindre den begrænsning er udskudt en eller logfejl klausul er medtaget i DML-erklæringen. Men det skal bemærkes, at logfejl klausulen vil ikke være i stand til at fange alle mulige overtrædelser af begrænsninger, kun registrere den første.

Som en af ​​de mulige måder er at:

  1. opret undtagelser bord. Det kan gøres ved at udføre ora_home/rdbms/admin/utlexpt.sql manuskript. Tabellens struktur er ret enkel;
  2. deaktiver alle tabelbegrænsninger;
  3. udfør DML'er;
  4. aktiver alle begrænsninger med undtagelser i <> klausul. Hvis du udførte utlexpt.sql script, ville navnet på de tabelundtagelser, der skal gemmes, være undtagelser .

Testtabel:

create table t1(
  col1 number not null,
  col2 number not null,
  col3 number not null,
  col4 number not null
);

Prøv at udføre en insert erklæring:

insert into t1(col1, col2, col3, col4)
  values(1, null, 2, null);

Error report -
SQL Error: ORA-01400: cannot insert NULL into ("HR"."T1"."COL2")

Deaktiver alle tabellens begrænsninger:

alter table T1 disable constraint SYS_C009951;     
alter table T1 disable constraint SYS_C009950;     
alter table T1 disable constraint SYS_C009953;     
alter table T1 disable constraint SYS_C009952; 

Prøv at udføre den tidligere mislykkede insert erklæring igen:

insert into t1(col1, col2, col3, col4)
  values(1, null, 2, null);

1 rows inserted.

commit;

Aktiver nu tabellens begrænsninger og gem undtagelser, hvis der er nogen, i undtagelser tabel:

alter table T1 enable constraint SYS_C009951 exceptions into exceptions; 
alter table T1 enable constraint SYS_C009950 exceptions into exceptions; 
alter table T1 enable constraint SYS_C009953 exceptions into exceptions; 
alter table T1 enable constraint SYS_C009952 exceptions into exceptions; 

Tjek undtagelserne tabel:

column row_id     format a30;
column owner      format a7;
column table_name format a10;
column constraint format a12;

select *
  from exceptions 

ROW_ID                         OWNER   TABLE_NAME CONSTRAINT 
------------------------------ ------- -------    ------------
AAAWmUAAJAAAF6WAAA             HR      T1         SYS_C009951  
AAAWmUAAJAAAF6WAAA             HR      T1         SYS_C009953

To begrænsninger er blevet overtrådt. For at finde ud af kolonnenavne skal du blot henvise til user_cons_columns dataordbogsvisning:

column table_name   format a10;
column column_name  format a7;
column row_id       format a20;

select e.table_name
     , t.COLUMN_NAME
     , e.ROW_ID
  from user_cons_columns t
  join exceptions e
    on (e.constraint = t.constraint_name)


TABLE_NAME COLUMN_NAME ROW_ID             
---------- ----------  --------------------
T1         COL2        AAAWmUAAJAAAF6WAAA   
T1         COL4        AAAWmUAAJAAAF6WAAA

Ovenstående forespørgsel giver os kolonnenavne og rækker af problematiske poster. Når du har rækker ved hånden, burde der ikke være noget problem at finde de poster, der forårsager overtrædelse af begrænsninger, rette dem og genaktivere begrænsninger igen.

Her er scriptet, der er blevet brugt til at generere ændringstabel sætninger til at aktivere og deaktivere begrænsninger:

column cons_disable format a50
column cons_enable format a72

select 'alter table ' || t.table_name || ' disable constraint '|| 
        t.constraint_name || ';' as cons_disable
     , 'alter table ' || t.table_name || ' enable constraint '|| 
        t.constraint_name || ' exceptions into exceptions;' as cons_enable
  from user_constraints t
where t.table_name = 'T1'
order by t.constraint_type


  1. Sådan opretter du udenlandsk nøglebegrænsning med ON SLET CASCADE i SQL Server - SQL Server / TSQL vejledning del 80

  2. Django JSONField inde i ArrayField

  3. problem ORA-00001:unik begrænsning overtrådt, kommer i INSERT/OPDATERING

  4. Sådan bruges en ringdatastruktur i vinduesfunktioner