2016-04-01 16 views
0

Ich ging die vorherigen Antworten durch, um einen Pseudo-Fremdschlüssel für Referenztabellen zwischen zwei Datenbanken in Netbeans 8.1 zu erstellen. Dies ist der Code, den ich mit aufkam,Fremdschlüssel zwischen zwei Datenbanken

DELIMITER // 

CREATE OR REPLACE TRIGGER conf_track_FK 
AFTER INSERT OR UPDATE on [email protected] 
FOR EACH ROW 
BEGIN 
    IF EXISTS(select * from inserted I where not exists (select * from 
    [email protected] A where I.conf_id=A.conf_id)) 
    RAISE_APPLICATION_ERROR(-20001,'Violation of pseudo-foreign key.'); 
    ROLLBACK; 
    END IF; 
END; 

/

Allerdings habe ich die folgenden Fehler auftreten:

PLS-00103: Encountered the symbol ";" when expecting one of the following: 
    ) with and or group having intersect minus start union where 
    connect 

PLS-00103: Encountered the symbol "ROLLBACK" when expecting one of the following: 
    := . (% ; 
The symbol ":=" was substituted for "ROLLBACK" to continue. 

PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: 

    end not pragma final instantiable order overriding static 
    member constructor map 
+1

Ihre Fehlermeldung zeigt Oracle und das '@ FIT5148B' einen DBLink an. Sie können keinen Trigger über einen Datenbanklink erstellen. Sie müssen eine Verbindung zur entfernten Datenbank herstellen und dort den Trigger erstellen. Außerdem: Das 'delimiter //' ist für jedes Oracle SQL-Tool, das ich kenne, ungültig. Sind Sie sicher, dass Ihr Tool dies unterstützt? Darüber hinaus gibt es in Oracle keine "Einfügung" - vor allem nicht in einem Trigger auf Zeilenebene. –

+0

Auch 'If-Anweisung'-Struktur ist einfach falsch. Bitte hilf dir selbst und lies zuerst einige grundlegende Tutorials. Sie sind nicht so schwer zu finden (http://stackoverflow.com/tags/plsql/info). – user272735

Antwort

0

erstellen Trigger-dbo.MyTableTrigger ON dbo.MyTable, Nach Insert, Update Als Begin

if not exists (wählen PK von OtherDB.dbo.TableName wo PK in (FK wählen Sie aus eingefügt) BEGIN - Behandeln Sie die Referenzfehler Hier END

ENDE

+0

Hallo, Danke für Ihre schnelle Antwort, das ist die Grundstruktur, die ich versucht habe zu folgen. Die Fehlerbehandlung scheint jedoch der Teil zu sein, der die Fehler verursacht. Ich kann das nicht beheben. –

0

Probieren Sie das unten abgebildete Snippet aus. Ich hoffe es hilft. Und auch TRANSACTIONS wie COMMIT/ROLLBACK können INSIDE Trigger nicht platziert werden, es sei denn, es handelt sich um eine Autonome Transaktion, aber auch das ist keine gute Idee, da die übergeordnete Transaktion für die Triggertransaktion ausgeblendet ist. Selbst wenn die Elterntransaktion fehlschlägt, wird die Automnomous-Transaktion ausgeführt.

CREATE OR REPLACE TRIGGER conf_track_FK AFTER 
    INSERT OR 
    UPDATE ON [email protected] --Remove DB link as it cant be used in Trigger 
    FOR EACH ROW 
    DECLARE 
    lv_cnt PLS_INTEGER; 
    BEGIN 
    SELECT COUNT(1) 
    INTO lv_cnt 
    FROM inserted I 
    WHERE NOT EXISTS 
     (SELECT 1 FROM [email protected] A WHERE I.conf_id=A.conf_id 
    ); 
    IF lv_cnt > 0 THEN 
     RAISE_APPLICATION_ERROR(-20001,'Violation of pseudo-foreign key.'); 
    END IF; 
    END; 
/