2014-04-26 1 views
0

Здравствуйте,Как сделать триггер «до фиксации» в базе данных Oracle

У меня есть команда стола и драйвер стола. В каждой команде есть 2 водителя. Вставить команду с 0 или 1 водителем запрещено

Подписанная сделка в порядке.

INSERT INTO team (id, name, nationality) VALUES (1, 'Mercedes', 'German'); 
INSERT INTO driver (id, firstname, lastname, team_id) VALUES (10, 'Lewis', 'Hamilton', 1); 
INSERT INTO driver (id, firstname, lastname, team_id) VALUES (20, 'Nico', 'Rosberg', 1); 
COMMIT; 

Ниже сделка не одобрена.

INSERT INTO team (id, name, nationality) VALUES (1, 'Mercedes', 'German'); 
INSERT INTO driver (id, firstname, lastname, team_id) VALUES (10, 'Lewis', 'Hamilton', 1); 
COMMIT; 

Я хочу проверить это ограничение на триггер. Но он не существует триггером ПЕРЕД КОМИТЕТОМ. Как реализовать ограничение, для которого требуется 2 драйвера для каждой команды? Другими словами, я просто хочу проверить, нормально ли транзакция или нет.

Благодаря

ответ

0

Вы можете сделать это путем реструктуризации данных. Вместо того, чтобы водители относятся к команде, есть команда относится к водителям:

create table team (
    . . . 
    driver1 int not null, 
    driver2 int not null, 
    . . . 
    foreign key (driver1) references driver(id), 
    foreign key (driver2) references driver(id), 
    check (driver1 <> driver2) 
); 

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

0

Я выбрал команду таблиц и драйверы только для понимания проблемы. Я хочу проверить минимальную мощность в модели. Другими словами, команда может иметь 3, 4, 5 ... драйверов, но минимум 2 драйвера. Кроме того, каждый драйвер принадлежит команде. В вашем ответе мы не можем быть уверены, что каждый драйвер принадлежит команде (драйвер может быть в базе данных без команды).

Для проверки этого ограничения необходимо использовать триггер и процедуру. Я хочу проверить транзакцию только до совершения транзакции. Однако я не знаю, как запускать процедуру не после каждой строки, а только перед фиксацией.

Смежные вопросы