Что не так в триггере?

Модераторы: kdv, CyberMax

Ответить
Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Что не так в триггере?

Сообщение Nachinayuschaya » 10 сен 2007, 09:31

Добрый день! Моя программка при запуске проверяет наличие файлов с расширением sql в папке. Если есть, то вставляет текст файла в query.sql и выполняет. Написала несколько триггеров, в IBExpert-e выполняются без ошибок, но когда через программу выдаёт ошибку:

'Dinamoc SQL Error
Sql Error code=-104
Token unknown - line 8 char 7
?'.
вот текст одного из триггеров:

Код: Выделить всё

CREATE trigger bef_ins_farm for "Farm"
active before insert position 0
AS
 declare variable col integer;
begin
 select count(*) from "Farm"
 where FRMACCOUNT=new.frmaccount
 into :col;
 if(:col>0) then
 exception exc_ins_upd;
end

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 10 сен 2007, 10:17

Во-первых, читай что такое и зачем нужно SET TERM, потому что я не вижу его в твоём коде.
Во-вторых, и это важнее, пересчитывать агрегат по этой же таблице в триггере - это может быть серьёзным недочётом проектирования БД, и оправдано только в некоторых конкретных ситуациях.

ЗЫ: И ещё, тег "Code" используй для форматирования кода.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 11:25

но когда через программу выдаёт ошибку:
paramCheck:=False;

читайте FAQ перед тем как задать вопрос.

p.s. присоединяюсь к WildSery, за исключением фразы про set term.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 10 сен 2007, 11:50

kdv писал(а):за исключением фразы про set term.
:roll: угу, не подумал, всё время забываю про paramcheck этот.
Наверное, потому, что никогда из программы скрипты не бабахаю 8)

Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Сообщение Nachinayuschaya » 10 сен 2007, 11:57

извините, поторопилась. Спасибо вам огромное! :D очень помогли а зачем SET TERM знаю.

Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Сообщение Nachinayuschaya » 10 сен 2007, 12:09

что-то я обрадовалась что получилось, а то что вы сказали что это ошибка в проектировании БД пропустила. А чем можно заменить этот триггер? Мне нужно чтобы при попытке внести номер который уже есть в БД, выдавалось сообщение, что такой уже существует. Но в связи с отсутствием опыта не знаю как сделать это иначе.
P.S. и знаний

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 12:36

Мне нужно чтобы при попытке внести номер который уже есть в БД, выдавалось сообщение, что такой уже существует. Но в связи с отсутствием опыта не знаю как сделать это иначе.
www.ibase.ru/devinfo/generator.htm

Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Сообщение Nachinayuschaya » 10 сен 2007, 13:04

генераторы к сожалению я не могу использовать. Вот допустим, вводит данные работник администрации в сельсовете. Женщина, лет 50, которую очень трудно в чём то убедить и подстраиваться нужно в первую очередь под неё. А вот ей приспичило заполнять не с 1 лиц.счёта, а с 14. И так же они могут изменить номер на тот который уже существует. Триггер есть и на изменение, т.е. до обновления. Конечно у них это не выйдет, но хочется чтобы они не звонили и говорили что они номер меняют, а у них табличка выскакивает и все по-английски, а выходило сообщение об ошибке по-русски, где всё объясненно.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 13:28

1. обычно программист ошибки от СУБД перехватывает в приложении, чтобы показать их пользователю по русски
2. первичный ключ на таблице автоматически не дает вводить дубликаты
3. первичный ключ можно запретить менять при помощи триггера
4. генераторная нумерация и обычная может быть не связана.
5. генератор можно начать с 14, 15, 1000 и так далее

Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Сообщение Nachinayuschaya » 10 сен 2007, 13:52

хм.... но послать обновление по эл.почте в виде ехе-шника (самораспаковывающегося архива), в котором файлы sql дешевле чем диски с приложением. Ньюансов много конечно. А вот генераторы, я же не знаю с какого она номера начнёт. Вот села сегодня и начала с 1. закончила на 10, завтра продолжила с 50. Может я не понимаю, так можно с генератором сделать?! \ да, первичный ключ не поменяют они, но как быть с английскими ошибками. Мне то всё понятно, а они - ваша программа плохая, в ней когда вводишь таблицы выскакивают, а потом все мои данные исчезают. Они же как ошибка, берут и выключают просто-напросто. А потом базу им восстанови. \ Я ещё не надоела? \ программно в приложении я знаю как реализовать

Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Сообщение Nachinayuschaya » 10 сен 2007, 13:55

вы считаете что мне не стоит изобретать велосипед и в приложении ошибки перехватить?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 13:59

Вот села сегодня и начала с 1. закончила на 10, завтра продолжила с 50. Может я не понимаю, так можно с генератором сделать
по-моему Вы статью не прочитали. генераторы нужны для АВТОМАТИЧЕСКОЙ нумерации.
прочитайте пожалуйста что-нибудь по проектированию БД. суррогатные ключи, и.т.п.

Nachinayuschaya
Сообщения: 7
Зарегистрирован: 10 сен 2007, 09:05

Сообщение Nachinayuschaya » 10 сен 2007, 14:22

честно говоря я её раньше читала. Сейчас не стала. Просто я не так выразилась. Мне нельзя использовать генератор, нужна возможность введения любого номера какой они пожелают. Потому обхожусь без генератора. Так как мне быть, оставить в покое триггеры и в приложении написать? Очень интересно можно ли как-то по-другому это реализовать, в IB. А вот про суррогатные ключи спасибо за совет, почитаю

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 сен 2007, 14:56

Nachinayuschaya писал(а):честно говоря я её раньше читала. Сейчас не стала. Просто я не так выразилась. Мне нельзя использовать генератор, нужна возможность введения любого номера какой они пожелают. Потому обхожусь без генератора. Так как мне быть, оставить в покое триггеры и в приложении написать? Очень интересно можно ли как-то по-другому это реализовать, в IB. А вот про суррогатные ключи спасибо за совет, почитаю
Создать уникальный индекс по человековводному номеру. Ввод и модификацию выполнять через try-except. В случае ошибки нарушения уникальности выводить своё сообщение по-русски. Или по-каковски они там говорят.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 сен 2007, 14:57

1. если хотят вводить любой номер - пусть вводят. если столбец номера -первичный ключ, то никто 2 одинаковых номера или 2-ой существующий не введет. Это азы, извините, странно что Вы об этом спрашиваете.
а ошибка нарушения целостности ПК элементарно отлавливается в приложении, как и любая другая ошибка.

2. в IB/FB все реализуется одинаково.

3. Ваш метод проверки с триггером при многопользовательской работе работать не будет.
МарьИванна вводит номер 50
такого номера в базе нет
ЛидВасильна вводит номер 50
поскольку МарьИванна еще не нажала "сохранить", транзакция ЛидВасильны не видит, что номер 50 уже занят.
Триггер пропускает второе значение 50, но если на столбце
frmaccount создан первичный ключ, сервер сам выдаст ошибку, если приложение Марьиванны уже создало такую запись (с кодом 50) в базе.

Короче, учиться, учиться и учиться. Пока ничего больше посоветовать не могу...

p.s. обычно, в т.ч. в 1С, в любом справочнике нумерация ведется системой автоматически. Человеку этими номерами парить мозг ни к чему. Зачем помнить номер фирмы, если все равно дальше Марьиванна этим номером оперировать НЕ БУДЕТ? Она же наверняка будет тыкать мышкой именно в название организации. А не номера фирм в формах ввода накладных (например) вписывать...

Ответить