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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Триггер на копирование записаей при вставке 
:(
    Опции темы
Dimyan
Дата 22.2.2005, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Нигде не могу найти описания написания триггеров, точнее команд триггеров. В них вроде как я понял немного даже свой язык, т.е. не SQL применяется. А триггер надо срочно, помогите пожалуйста написать (а может за одно и ссылочку на документацию дадите)
Суть такова, при вставке в таблицу cars все записи должны копироватся в таблицу foo_cars
я навоял вот такое, но выдает ошибку (да и вообще я в правильности написанного не уверен)
Код

AS
begin
 INSERT INTO foo_cars VALUES(ID, OFFICE_ID, CAR_ID, SEND_DATA, RCV_DATA, CITI_ID, RPAY);
 POST_EVENT "INSERT INTO cars";
end



--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Alex
Дата 22.2.2005, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Код

AS
begin
INSERT INTO foo_cars VALUES(new.ID, new.OFFICE_ID, new.CAR_ID, new.SEND_DATA, new.RCV_DATA, new.CITI_ID, RPAY);
end

Добавлено @ 17:50
Скачай себе книгу Мир InterBase, 2 издание.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Dimyan
Дата 23.2.2005, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Alex, сапсибо. Скачал почитал и еще много чего почитал, вроде разобрался, но не могу понять где ошибка
Код

AS
begin
  IF((select foo_cars.id_foo from foo_cars, cars where foo_cars.id = cars.id) <> 0)
  then DELETE from foo_cars where foo_cars.id = cars.id;

 INSERT INTO foo_cars(ID, OFFICE_ID, CAR_ID, SEND_DATA, RCV_DATA, CITY_ID, RPAY, METHOD)
  VALUES(new.ID, new.OFFICE_ID, new.CAR_ID, new.SEND_DATA, new.RCV_DATA, new.CITY_ID, new.RPAY, 2);
end

это триггер на апдейт и надо чтоб в таблице foo_cars была только единная запись измененной строки = cars.id
говорит SQL error code = -206.
пробывал вместо 0 поставить NULL в условии, но тогда говорит Parsing Error smile


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Dimyan
Дата 23.2.2005, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Попробывал еще так
Код

AS
begin
  for select foo_cars.id_foo from foo_cars, cars where foo_cars.id = cars.id
  do
  begin
  delete from foo_cars where foo_cars.id = cars.id;
  end
 INSERT INTO foo_cars(ID, OFFICE_ID, CAR_ID, SEND_DATA, RCV_DATA, CITY_ID, RPAY, METHOD)
  VALUES(new.ID, new.OFFICE_ID, new.CAR_ID, new.SEND_DATA, new.RCV_DATA, new.CITY_ID, new.RPAY, 2);
end

тоже блин ошибка smile


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Alex
Дата 23.2.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



А так:
Код

AS
begin
 IF (not ((select foo_cars.id_foo from foo_cars, cars where foo_cars.id = cars.id) is null)) then
DELETE from foo_cars where foo_cars.id = cars.id;

INSERT INTO foo_cars(ID, OFFICE_ID, CAR_ID, SEND_DATA, RCV_DATA, CITY_ID, RPAY, METHOD)
 VALUES(new.ID, new.OFFICE_ID, new.CAR_ID, new.SEND_DATA, new.RCV_DATA, new.CITY_ID, new.RPAY, 2);
end



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Dimyan
Дата 23.2.2005, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Alex, а так
Цитата
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Subselect illegal in this context.


я вот так еще попробывал, но так при изменении записи сама сработка триггера выдает ошибку smile
Код

AS
begin
if (exists (select foo_cars.id_foo from foo_cars where foo_cars.id = cars.id)) then
  DELETE from foo_cars where foo_cars.id = cars.id;

 INSERT INTO foo_cars(ID, OFFICE_ID, CAR_ID, SEND_DATA, RCV_DATA, CITY_ID, RPAY, METHOD)
  VALUES(cars.ID, cars.OFFICE_ID, cars.CAR_ID, cars.SEND_DATA, cars.RCV_DATA, cars.CITY_ID, cars.RPAY, 2);
 
end


Это сообщение отредактировал(а) Dimyan - 23.2.2005, 11:11


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Alex
Дата 23.2.2005, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Dimyan @ 23.2.2005, 11:10)
я вот так еще попробывал, но так при изменении записи сама сработка триггера выдает ошибку

Какую?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Dimyan
Дата 23.2.2005, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Alex, ну я же ниже код привел


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Alex
Дата 23.2.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Давай так поступим: пришли мне свою базу на alex собака vingrad.ru Очень трудно моделировать твои ситуации мне на своей тестовой базе.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Sleepy_PIP
Дата 23.2.2005, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dimyan @ 23.2.2005, 08:29)
Alex, сапсибо. Скачал почитал и еще много чего почитал, вроде разобрался, но не могу понять где ошибка
Код

AS
begin
  IF((select foo_cars.id_foo from foo_cars, cars where foo_cars.id = cars.id) <> 0)
  then DELETE from foo_cars where foo_cars.id = cars.id;

 INSERT INTO foo_cars(ID, OFFICE_ID, CAR_ID, SEND_DATA, RCV_DATA, CITY_ID, RPAY, METHOD)
  VALUES(new.ID, new.OFFICE_ID, new.CAR_ID, new.SEND_DATA, new.RCV_DATA, new.CITY_ID, new.RPAY, 2);
end

это триггер на апдейт и надо чтоб в таблице foo_cars была только единная запись измененной строки = cars.id
говорит SQL error code = -206.
пробывал вместо 0 поставить NULL в условии, но тогда говорит Parsing Error smile

блин. не очень понимаю чего ты хочешь.
может вот этого:
select count(foo_cars.id_foo) from foo_cars, cars into :cc where foo_cars.id = cars.id)

IF(cc<> 0)

а?



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Dimyan
Дата 24.2.2005, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Sleepy_PIP, я хочу чтоб при изменении данных в таблице cars эти данные по триггеру вносились в foo_cars но при этом если в foo_cars уже есть запись которая соответствует условию foo_cars.id = cars.id то она предварительно удалялась

я попробывал
Код

select count(foo_cars.id_foo) from foo_cars, cars into :cc where foo_cars.id = cars.id)

IF(cc<> 0)


только переставил into
Код

select count(foo_cars.id_foo) into :cc from foo_cars, cars  where foo_cars.id = cars.id;

и не работает smile
при компиляции триггера выдается ошибка
Цитата

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 12, char 35.
into.


smile


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Sleepy_PIP
Дата 24.2.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dimyan @ 24.2.2005, 08:11)
Sleepy_PIP, я хочу чтоб при изменении данных в таблице cars эти данные по триггеру вносились в foo_cars но при этом если в foo_cars уже есть запись которая соответствует условию foo_cars.id = cars.id то она предварительно удалялась

я попробывал
Код

select count(foo_cars.id_foo) from foo_cars, cars into :cc where foo_cars.id = cars.id)

IF(cc<> 0)


только переставил into
Код

select count(foo_cars.id_foo) into :cc from foo_cars, cars  where foo_cars.id = cars.id;

и не работает smile
при компиляции триггера выдается ошибка
Цитата

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 12, char 35.
into.


smile

ну это все от того, что
1. - я ошибся. а зря.
2. - ты так и не почитал доков по IB.
т.к. конструкция с into должна быть такой как:
select count(acc) vv from accounts where acc='222' into :cc;

т.е. в твоем случае:
select count(foo_cars.id_foo) from foo_cars, cars where foo_cars.id = cars.id into :cc;



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Alex
Дата 24.2.2005, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Dimyan @ 24.2.2005, 08:11)
Sleepy_PIP, я хочу чтоб при изменении данных в таблице cars эти данные по триггеру вносились в foo_cars но при этом если в foo_cars уже есть запись которая соответствует условию foo_cars.id = cars.id то она предварительно удалялась

Погоди, так тогда я не совсем понимаю, зачем так все накручивать ведь при добавлении в таблицу cars ты уже заносишь данные триггером в таблицу foo_cars. Значит, при изменении данных в cars измени данные и в foo_cars. Не нужно делать никаких удалений сделай обычный update.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Dimyan
Дата 24.2.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 441
Регистрация: 12.1.2004
Где: Новосибирск

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



Alex, нет проблем, но таблица foo_cars очищается каждые 5 минут и что я буду обновлять в пустой foo_cars при изменении записи в cars?

Sleepy_PIP, хоть убей прочитал что мог и про "Вложенный SQL" даже, нигде нормально не описываются как использовать SQL с условиями и ветвлениями алгоритма. А по InterBase\FireBird я вообще все свободное от работы время читаю свеже купленную "Мир InterBase" 3-ие издание !

Это сообщение отредактировал(а) Dimyan - 24.2.2005, 09:55


--------------------
Как хорошо ничего не делать, а потом еще немного отдохнуть :)
PM MAIL ICQ   Вверх
Sleepy_PIP
Дата 24.2.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dimyan @ 24.2.2005, 09:48)
Alex, нет проблем, но таблица foo_cars очищается  каждые 5 минут и что я буду обновлять в пустой foo_cars при изменении записи в cars?

Sleepy_PIP, хоть убей прочитал что мог и про "Вложенный SQL" даже, нигде нормально не описываются как использовать SQL с условиями и ветвлениями алгоритма. А по InterBase\FireBird я вообще все свободное от работы время читаю свеже купленную "Мир InterBase" 3-ие издание !

Ух ты! уже 3-е издание! Спасибо за информацию.
Ну ты победил синтакс. ошибку?
PS: а я еще успешно пользовал полную док-цию от IB4 - там все расписано.

Это сообщение отредактировал(а) Sleepy_PIP - 24.2.2005, 10:06


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

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

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


 




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


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

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