2013-04-12 4 views
0

У меня есть две простые таблицы в Oracle SQL Developer (Train and Driver), каждый из которых имеет общий атрибут (driverid). По сути, я хочу не допускать никаких обновлений для конкретного кортежа драйверов в таблице драйверов, если их атрибут driverid существует в таблице поездов. Я попытался добавить следующее ограничение, однако он отбрасывает ошибку «подзапрос, который здесь не разрешен».Oracle SQL Check Exists Constraint

alter table driver add constraint drivcheck CHECK 
(NOT EXISTS(select driverid from train)) 

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

create trigger drivcheck4 
before update on driver 
for each row 
begin 
declare 
cursor dri is 
select driverid from train where 'N' IN 
      (select availability 
      from driver 
      inner join train on driver.driverid=train.driverid 
      ); 
dri2 NUMBER; 
begin 
open dri; 
loop 
fetch dri into dri2; 
exit when dri%NOTFOUND; 
if check (exists (select * from dri2)) THEN 
//Throw Error Section 
else 
//Allow update operation to take place 
end if; 
end loop; 
close dri; 
end; 

Я знаю, что триггер может выполнять что-то другое, отличное от описанного, но это только результат экспериментов. Мое первоначальное описание - это то, чего я пытаюсь достичь. Если у кого есть какие-то мысли, я был бы очень благодарен!

+0

Какие поля находятся в таблице драйверов? Вы хотите предотвратить их обновление, если они назначены на поезд? –

+0

Это две таблицы и их атрибуты. – Reidacus

+0

создать таблицу драйвера (номер драйвера ID) (5) ПЕРВИЧНЫЙ КЛЮЧ, FName VARCHAR (20), LName VARCHAR (20), адрес VARCHAR (30), DOB DATE, Tel_Num VARCHAR (11), доступность CHAR (1) CONSTRAINT driverAvail Check (Доступность = 'Y' ИЛИ ​​Доступность = 'N')) – Reidacus

ответ

0

Andrew,

Есть ошибки, против которых вы столкнулись? Что-то в следующих строках должно работать. Если бы вы могли опубликовать некоторые образцы данных, это было бы легко проверить.

create or replace trigger trg_bu_driver2 
    before update on driver 
    for each row 
    declare 
     l_cnt number; 
    begin 
    select count(*) 
    into l_cnt 
    from train 
    where driver_id = :new.driver_id; 
    if (l_cnt > 0) then 
     raise_application_error (-20001, 'new driver id exists in train table'); 
    end if; 
    end trg_bu_driver2; 
    /

испытания:

SQL> select * from driver; 

    DRIVER_ID COLUMN2 
    ---------- -------------------- 
      10 driver1 

    SQL> select * from train; 

    DRIVER_ID TRAIN_ID COLUMN3 
    ---------- ---------- -------------------- 
      20  100 train1 
  • Обновление с идентификатором драйвера, который не существует в поезде таблице.

    1 update driver 
        2 set driver_id = 30 
        3* where driver_id = 10 
    SQL>/
    
    1 row updated. 
    
    No issues. 
    
    SQL> rollback; 
    
    Rollback complete. 
    

--updating к идентификатору водителя, который существует в поезде таблицы, вызывает ошибку.

SQL> update driver 
     2 set driver_id = 20 
     3 where driver_id = 10 
     4 ; 
    update driver 
      * 
    ERROR at line 1: 
    ORA-20001: new driver id exists in train table 
    ORA-06512: at "DMART_ETL.TRG_BU_DRIVER2", line 9 
    ORA-04088: error during execution of trigger 'DMART_ETL.TRG_BU_DRIVER2' 
+0

спасибо за это. Я поставил сценарии создания таблицы в соответствии с комментариями выше. Что касается выборочных данных, то пример таблицы поездов будет (900000, 1, 2, 7, 87,2, 231,2), а таблица драйверов будет (1, Джон, Доу, некоторые адреса, 14/09/88, 0011223344, N) (2, John, Smith, Some Address, 10/12/85, 0, N), (3, Johnny, Doey, Some Address, 1/1/91, 00145321456, Y). – Reidacus

+0

Andrew- Сделано пару синтаксических исправлений.Код работает. Убедитесь, что вы также проверяете, должен ли ваш триггер работать над вставками или нет. Кроме того, вы можете отредактировать вопрос для публикации DDL и т. Д. Вместо публикации в комментариях. Удачи! –

+0

отлично работает. Спасибо огромное! – Reidacus