sql >> Database >  >> RDS >> Oracle

Meerdere beperkingen in tabel:Hoe krijg ik alle schendingen?

Er is geen eenvoudige manier om alle mogelijke schendingen van beperkingen te melden. Omdat wanneer Oracle op de eerste overtreding van een beperking stuit, geen verdere evaluatie mogelijk is, mislukt de instructie, tenzij die beperking wordt uitgesteld of de log errors clausule is opgenomen in de DML-instructie. Maar het moet worden opgemerkt dat log errors clausule kan niet alle mogelijke schendingen van beperkingen opvangen, registreert alleen de eerste.

Een van de mogelijke manieren is om:

  1. maak exceptions tafel. Dit kan gedaan worden door ora_home/rdbms/admin/utlexpt.sql uit te voeren script. De structuur van de tabel is vrij eenvoudig;
  2. schakel alle tabelbeperkingen uit;
  3. voer DML's uit;
  4. schakel alle beperkingen in met exceptions into <<exception table name>> clausule. Als je utlexpt.sql . hebt uitgevoerd script, is de naam van de tabeluitzonderingen die worden opgeslagen exceptions .

Testtabel:

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

Probeer een insert uit te voeren verklaring:

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")

Schakel alle beperkingen van de tabel uit:

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; 

Probeer de eerder mislukte insert . uit te voeren verklaring nogmaals:

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

1 rows inserted.

commit;

Schakel nu de beperkingen van de tabel in en sla uitzonderingen op, als die er zijn, in de exceptions tafel:

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; 

Controleer de exceptions tafel:

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

Er zijn twee beperkingen geschonden. Raadpleeg user_cons_columns . om kolomnamen te vinden gegevenswoordenboekweergave:

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

De bovenstaande query geeft ons kolomnamen en rowids van problematische records. Als u rowids bij de hand hebt, zou het geen probleem moeten zijn om die records te vinden die een schending van de beperking veroorzaken, deze op te lossen en de beperkingen opnieuw in te schakelen.

Hier is het script dat is gebruikt om alter table te genereren instructies voor het in- en uitschakelen van beperkingen:

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. Hoe kan ik de taak scripts genereren in SQL Server Management Studio 2008 automatiseren?

  2. Like-wildcard gebruiken in voorbereide verklaring

  3. SQL Server Parallel Back-up Herstellen -1

  4. DBaaS-failoveroplossingen vergelijken met handmatige herstelconfiguraties