Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > CONSTRAINT's, PRIMARY KEY's и FOREGN KEY's


Автор: 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 быть?

Автор: AntonSaburov 16.12.2003, 13:40
Может тогда проще триггер на удаление поставить и в нем удалять из обеих таблиц.

Автор: Guest 16.12.2003, 14:05
Как он ставится?

Автор: 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;


Ну а дальше - читайте документацию и пробуйте своими силами.

Автор: 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 существует.

Автор: AntonSaburov 16.12.2003, 18:47
К сожалению на большее моих знаний пока маловато - я не очень много занимался непосредственно PL/SQL.
Буквально на днях купил приличную книжку - через дней 20 по плану должен начать ее читать.
Вот тогда реально смогу помочь. А пока sad.gif

Автор: 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
^

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)