CONSTRAINT's, PRIMARY KEY's и FOREGN KEY's

 
0
 
Oracle
ava
firelex | 16.12.2003, 11:48
Доброго времени суток, всем!

Дело происходит в Oracle 9
Такой вопрос:

Есть три таблицы:


CREATE TABLE Country
(Name VARCHAR2(32) NOT NULL UNIQUE,
Code VARCHAR2(4) CONSTRAINT CountryKey PRIMARY KEY
);

CREATE TABLE geo_lake
(Lake VARCHAR2(25) CONSTRAINT LakeKey FOREIGN KEY,
Country VARCHAR2(4) CONSTRAINT CountryKey FOREIGN KEY
);

CREATE TABLE Lake
(Name VARCHAR2(25) CONSTRAINT LakeKey PRIMARY KEY
);



Причем geo_lake является связующей между country и Lake.
Как сделать так, чтобы при удалении страны удалялись автоматически
все озера там лежащие --> строки в geo_lake и в Lake?
В geo_lake - понятно - надо добавить

REFERENCES country(code) ON DELETE CASCADE


А вот как с Lake быть?
Comments (6)
ava
AntonSaburov | 16.12.2003, 13:40 #
Может тогда проще триггер на удаление поставить и в нем удалять из обеих таблиц.
ava
guest | 16.12.2003, 14:05 #
Как он ставится?
ava
AntonSaburov | 16.12.2003, 15:31 #
Ну вообщем-то как и всегда


Create a trigger.

Syntax:

CREATE [OR REPLACE] TRIGGER [schema.]trigger
{BEFORE event | AFTER event | INSTEAD OF event}
referencing_clause WHEN (condition) pl_sql_block
event can be one or more of the following (separate multiple events with OR)

DELETE event_ref
INSERT event_ref
UPDATE event_ref
UPDATE OF column, column... event_ref
ddl_statement ON [schema.] {table|view}
ddl_statement ON DATABASE
SERVERERROR
LOGON
LOGOFF
STARTUP
SHUTDOWN

event_ref:
ON [schema.]table
ON [schema.]view
ON [NESTED TABLE nested_table_column OF] [schema.]view
referencing_clause:
FOR EACH ROW
REFERENCING OLD [AS] old [FOR EACH ROW]
REFERENCING NEW [AS] new [FOR EACH ROW]
REFERENCING PARENT [AS] parent [FOR EACH ROW]
Multiple OLD, NEW and PARENT correlation names can be defined in one REFERENCING clause.


В качестве примера

CREATE OR REPLACE TRIGGER fgroup_gid_ai
BEFORE INSERT ON fgroup
FOR EACH ROW WHEN (new.gid IS NULL OR new.gid = 0)
BEGIN
SELECT fgroup_gid_sq.nextval INTO :new.gid FROM dual;
END;


Ну а дальше - читайте документацию и пробуйте своими силами.
ava
guest | 16.12.2003, 16:55 #

create trigger find_child
after insert on child_river
for each row
begin
select name, length
from river
where river.river in (select name from child_river)
and name not in (select name from child_river);
end find_child
;


Выдает постоянно


Warning: Trigger created with compilation errors.

Не пойму что неправильно.
Таблица child_river существует.
ava
AntonSaburov | 16.12.2003, 18:47 #
К сожалению на большее моих знаний пока маловато - я не очень много занимался непосредственно PL/SQL.
Буквально на днях купил приличную книжку - через дней 20 по плану должен начать ее читать.
Вот тогда реально смогу помочь. А пока :(
ava
VisualCraft | 17.12.2003, 22:41 #
Может имя таблицы в конце не нужно или точка с запятой в конце триггера не нравится?
В Interbase триггер выглядит примерно так, а как в Оракле не в курсях.

/* СМЕНА РАЗДЕЛИТЕЛЯ для хранимых процедур и триггеров */
COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^;


CREATE TRIGGER AD_XTABLE FOR XTABLE
ACTIVE
AFTER DELETE
AS
BEGIN
INSERT INTO DELETES2 VALUES('S',OLD.CODE);
END
^
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit