2016-04-01 5 views
0

Я прошел предыдущие ответы, чтобы создать псевдо-внешний ключ для сопоставления таблиц между двумя базами данных в Netbeans 8.1. Это код, который я придумал,Внешний ключ между двумя базами данных

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; 

/

Однако я сталкиваюсь следующие ошибки:

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

Ваше сообщение об ошибке указывает Oracle и '@ FIT5148B' DBLink. Вы не можете создать триггер через ссылку db. Вам нужно подключиться к удаленной базе данных и создать там триггер. Также: 'delimiter //' недействителен для любого инструмента Oracle SQL, который я знаю. Вы уверены, что ваш инструмент поддерживает это? Кроме того, в Oracle нет такой вещи, как «вставленный», особенно в триггер уровня строки. –

+0

Также структура 'if-statement' проста. Пожалуйста, помогите себе и сначала прочитайте основные учебные пособия. Их не так сложно [найти] (http://stackoverflow.com/tags/plsql/info). – user272735

ответ

0

Создание триггера dbo.MyTableTrigger ON dbo.MyTable, после вставки, обновления Как Инициация

Если NOT EXISTS (выберите PK из OtherDB.dbo.TableName где PK в (выберите FK от вставлено) НАЧАТЬ - Обрабатывать Ошибка ссылочной Здесь END

END

+0

Привет, Спасибо за ваш быстрый ответ, это основная структура, к которой я стремился. Однако обработка ошибок, по-видимому, является той частью, которая вызывает ошибки. Я не могу исправить то же самое. –

0

Попробуйте приведенный ниже сниппет. Надеюсь, поможет. А также любые транзакции, такие как COMMIT/ROLLBACK, могут быть помещены в INSIDE Trigger, если только его автономная транзакция, но это тоже не очень хорошая идея в качестве родительской транзакции, скрыта для транзакции триггера. Таким образом, даже транзакция родителя не будет выполнена Automnomous транзакция.

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