Страница 1 из 1

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

Добавлено: 10 сен 2007, 09:31
Nachinayuschaya
Добрый день! Моя программка при запуске проверяет наличие файлов с расширением 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

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

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

Добавлено: 10 сен 2007, 11:25
kdv
но когда через программу выдаёт ошибку:
paramCheck:=False;

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

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

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

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

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

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

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

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

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

Добавлено: 10 сен 2007, 13:55
Nachinayuschaya
вы считаете что мне не стоит изобретать велосипед и в приложении ошибки перехватить?

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

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

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

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

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

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

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

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