Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CONSTRAINT's, PRIMARY KEY's и FOREGN KEY's 
:(
    Опции темы
firelex
  Дата 16.12.2003, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2003

Репутация: нет
Всего: нет



Доброго времени суток, всем!

Дело происходит в 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 быть?
PM MAIL   Вверх
AntonSaburov
Дата 16.12.2003, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Может тогда проще триггер на удаление поставить и в нем удалять из обеих таблиц.
PM MAIL WWW ICQ   Вверх
Guest
Дата 16.12.2003, 14:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как он ставится?
  Вверх
AntonSaburov
Дата 16.12.2003, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Ну вообщем-то как и всегда

Код

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;


Ну а дальше - читайте документацию и пробуйте своими силами.
PM MAIL WWW ICQ   Вверх
Guest
Дата 16.12.2003, 16:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



К сожалению на большее моих знаний пока маловато - я не очень много занимался непосредственно PL/SQL.
Буквально на днях купил приличную книжку - через дней 20 по плану должен начать ее читать.
Вот тогда реально смогу помочь. А пока sad.gif
PM MAIL WWW ICQ   Вверх
VisualCraft
Дата 17.12.2003, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 24.11.2003

Репутация: нет
Всего: нет



Может имя таблицы в конце не нужно или точка с запятой в конце триггера не нравится?
В 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
^

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0677 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.