2016-04-01 1 views
0

J'ai parcouru les réponses précédentes pour créer une clé pseudo-étrangère pour référencer des tables entre deux bases de données dans NetBeans 8.1. Voici le code que je suis venu avec,Clé étrangère entre deux bases de données

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; 

/

Cependant, je rencontre les erreurs suivantes:

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

Votre message d'erreur indique Oracle et '@ FIT5148B' un DBLink. Vous ne pouvez pas créer un déclencheur via un lien DB. Vous devez vous connecter à la base de données distante et créer le déclencheur. Aussi: le 'délimiteur //' n'est pas valide pour tout outil SQL Oracle que je connais. Etes-vous sûr que votre outil supporte cela? De plus, il n'y a rien de tel que 'inserted 'dans Oracle - surtout pas dans un trigger de niveau ligne. –

+0

La structure 'if-statement' est également erronée. S'il vous plaît aidez-vous et lire quelques tutoriels de base en premier. Ils ne sont pas si difficiles à trouver (http://stackoverflow.com/tags/plsql/info). – user272735

Répondre

0

Créer Trigger dbo.MyTableTrigger ON dbo.MyTable, après insertion, mise à jour Comme Begin

Si NON Existe (sélectionnez PK à partir de OtherDB.dbo.TableName où PK dans (Sélectionnez FK à partir de inséré) BEGIN - Gérer l'erreur référentielle ici END

END

+0

Salut, Merci de votre réponse rapide, c'est la structure de base que j'ai essayé de suivre. Cependant, la gestion des erreurs semble être la partie qui induit les erreurs. Je suis incapable de réparer la même chose. –

0

Essayez l'extrait ci-dessous illustré. J'espère que cela aide. Et aussi toutes les TRANSACTIONS comme COMMIT/ROLLBACK ne peuvent pas être placées dans INSIDE Trigger à moins que ce soit une transaction autonome mais que ce n'est pas une bonne idée puisque la transaction parente est cachée à la transaction de déclenchement. Donc, même la transaction Parent échoue, la transaction Automnomous sera effectuée.

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