如何在Oracle数据库中“提交前”触发器

时间:2014-04-26 20:13:58

标签: oracle triggers transactions

您好,

我有一个表团队和一个表驱动程序。每个团队有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;

我想用触发器检查这个约束。但它并不存在触发BEFORE COMMIT。 如何实现每个团队需要2个驱动程序的约束?换句话说,我只想检查交易是否正常。

由于

2 个答案:

答案 0 :(得分: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)
);

然后数据结构会自动强制执行此约束,因为您必须填充两个有效驱动程序且不相等的值。

答案 1 :(得分:0)

我选择表格团队和司机只是为了解问题。我想检查模型中的最小基数。换句话说,该团队可能有3个,4个,5个......司机,但至少有2个司机。此外,每个司机都属于一个团队。在您的回复中,我们无法确定每个驱动程序是否属于某个团队(驱动程序可能位于没有团队的数据库中)。

必须使用触发器和过程来检查此约束。我想在提交前检查交易。但是,我不知道如何在每行之后触发一个过程,而是仅在提交之前触发。