2017-12-26 18 views
0

Ich möchte eine Tabelle erstellen, um alle CONSTRAINTs Änderungen in meiner Oracle Datenbank zu speichern, also habe ich diese Tabelle erstellt (Tabellenname, Constraintname, Datum, Modus wie [insert | update | löschen])create trigger um CONSTRAINTs Änderungen an Tabellen in Oracle zu speichern

CREATE TABLE CONS 
(
    C_ID NUMBER NOT NULL 
, C_NAME VARCHAR2(50) NOT NULL 
, T_NAME VARCHAR2(50) NOT NULL 
, EXE_DATE DATE NOT NULL 
, MODE VARCHAR2(50) NOT NULL 
); 

das Problem durch Einsatzdaten, war

ich dachte Auslöser der Schaffung auf user_cons_columns nach Einsatz oder zu aktualisieren oder löschen,

aber ich fand ich, dass user_cons_columns s eine Ansicht und ich kann keinen Trigger darauf erstellen,

also wie kann ich diese Arbeit tun?

oder was ist die Tabellen, die ich auslösen kann, um es zu tun, dies zu tun ???

dank .......

+0

Der richtige Weg dazu wäre, Ihre DDL-Skripte in einem Quellcodeverwaltungs-Repository zu verwalten. – APC

Antwort

0

User_Cons_Columns ist Metadaten in Oracle und Sie können es nicht für die Überwachung Einschränkung Änderungen verwenden.

denke ich, können Sie diese Metadaten-Ansicht verwenden:

SELECT * 
FROM ALL_CONSTRAINTS T 

Er zeigt, welche Einschränkung durch LAST_CHANGE Spalte und andere Daten geändert hat, dass Sie sie verwenden können.

+0

das gleiche Problem "kann diesen Trigger-Typ auf Ansichten nicht erstellen" –

+0

Sie müssen Trigger nicht erstellen. Die Sicht ALL_CONSTRAINTS gibt Ihnen alles, was Sie brauchen. –

0

Ich weiß nicht, ob wir DML TRIGGER s auf Datenwörterbuch Tabellen in Oracle erstellen können, aber das klingt wie eine schlechte Idee.

Mein Vorschlag an Sie wäre eine DDL Trigger auf dem ALTER Ereignis

Zunächst zu schaffen, als eine einmalige Aktivität, können Sie speichern alle verfügbaren Einschränkungen in CONS Tabelle.

Dann könnten Sie in Ihrer trigger diese Bedingungen verwenden, um zu überprüfen, ob eine Tabelle und Spalte geändert wurde.

if (ora_sysevent = 'ALTER' and 
ora_dict_obj_type = 'TABLE') 
    then alter_column := 
ora_is_alter_column('FOO'); 
end if; 

Sie könnten dann die user_cons_columns, ALL_CONSTRAINTS und CONS abfragen - je nachdem, was Sie ist relevant finden Ihre Daten zu speichern - wenn eine neue Einschränkung hinzugefügt wurde oder nicht zu finden. Wenn es wurde in der Tat geändert oder hinzugefügt wurden, einen Eintrag in CONS oder auch aktualisieren (mit MERGE Anweisung)

+0

ist es eine andere Lösung, die ich mit ihm versuchen werde ....... –

+0

@MohammedNosirat: Ich denke, wenn Sie die Information nicht brauchen, in Echtzeit aktualisiert zu werden, könnten Sie ein Programm jeden Tag auch laufen lassen, der nur den Vergleich macht die Einträge in Ihrer Tabelle 'cons' und den Datenwörterbucheintrag und führen Sie die Einträge zusammen, indem Sie die neuen/geänderten Einträge erfassen. –

0

Wie Sie gesagt haben, können Sie nicht diese Art eines Abzugs auf USER_CONS_COLUMNS erstellen:

SQL> create or replace trigger trg_myucc 
    2 before insert 
    3 on user_cons_columns 
    4 begin 
    5 null; 
    6 end; 
    7/
create or replace trigger trg_myucc 
          * 
ERROR at line 1: 
ORA-25001: cannot create this trigger type on this type of view 

Warum sollten wir nicht versuchen STATT TRIGGER?

SQL> create or replace trigger trg_myucc 
    2 instead of insert 
    3 on user_cons_columns 
    4 for each row 
    5 begin 
    6 null; 
    7 end; 
    8/
on user_cons_columns 
    * 
ERROR at line 3: 
ORA-01031: insufficient privileges 

OK, das wird auch nicht funktionieren. Aber was verhindert, dass wir eine Ansicht auf eine Ansicht erstellen und dann den INSTEAD OF-Trigger für diese neu erstellte Ansicht erstellen?

SQL> create or replace view my_ucc as select * from user_cons_columns; 

View created. 

SQL> create or replace trigger trg_myucc 
    2 instead of insert 
    3 on my_ucc 
    4 for each row 
    5 begin 
    6 null; 
    7 end; 
    8/

Trigger created. 

Fein; Jetzt hast du einen Weg zu tun, was du tun sollst. Mehr über Trigger here.