триггеры

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

триггеры

Сообщение Дева » 31 июл 2006, 11:43

помогите разобраться. Как использовать триггеры? Пишу приложение на Delphi 7. Когда происходит ображение к триггерам и как?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 11:58

Дева, имейте совесть, воспользуйтесь поиском.
Ссылки: http://www.ya.ru/ либо http://forum.ibase.ru/phpBB2/search.php либо http://www.ibase.ru/develop.htm.
А то спровоцируете "флуд" на пять страниц :wink:.

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

Сообщение Дева » 31 июл 2006, 12:40

я сегодня все утро ищу. Везде есть только размышления на тему почему не сработало и какие ошибки в коде. Как правило код - генераторов и триггеров.
Ладно, можно вопрос по-другому обставить? Есть таблица, в которую необходимо поместить запись с полем "Код", значение которого должно увеличиваться автоматически.
генератор:

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

CREATE GENERATOR GENINT;
SET GENERATOR GENINT TO 1
триггер:

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

CREATE TRIGGER TR_GEN_TABLE1_ID FOR TABLE1
ACTIVE BEFORE INSERT POSITION 0
AS

begin
  IF (NEW.KOD IS NULL) THEN 
    NEW.KOD=GEN_ID(GENINT,1);

end
В приложении на форме помещаю: IBDatabase1 + IBTransaction1 + DataSource1 + IBQuery1.
Когда я работала с Access'ом, я делала запрос с текстом:

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

Select * From Table1
а далее обращаясь к данному запросу:

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

Query1.Insert;
Query1.FieldByName('Kod').AsInteger:=1;
Query1.FieldByName('Field1').AsString:='TEXT';
Query1.Post;
будет ли это верно?

P. S. продолжаю искать :-)

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 12:46

Милая девушка, посмотрите еще раз эту ссылку:
http://www.ibase.ru/develop.htm
А так же вот эту, которая находится на вышеуказанной странице:
http://www.ibase.ru/devinfo/generator.htm

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

Сообщение Дева » 31 июл 2006, 13:24

Читаю-читаю-читаю и не могу понять. Возможно я неверно поставила себе задачу :oops: и потому не нахожу ответы... Для решения каких вопросов служат триггеры? А если забыть о генераторе на минутку. Пусть к примеру есть задача, выполнение которой одинаково при каждом добавлении записи. Значит ли, что достаточно реализовать эту повторяющуюся задачу в триггере, а потом лишь обращаться к нему?
По сути дела увеличивать значение счетчика можно без использования генератора вообще. Из приложения вызывать просмотр таблицы, брать последний номер, увеличивать на 1 и вставлять запись... Но я ищу более оптимальные пути. Чтобы использовать однажды написанный код, а не дублировать его всякий раз, когда мне нужно вставить запись в одну из десятка-сотни таблиц.
Я сейчас не пытаюсь разобраться с тем как писать генераторы, триггеры и хранимые процедуры, я не могу понять, как из приложения, которое я стряпаю на Delphi 7 обратиться к уже готовому коду.
Эта статья о генераторах, а я не могу понять триггеры.

Возможно неверен ход моей мысли?
К примеру:
Я в таблицу хочу добавить запись с помощью объекта TIBTable, набираю в поле "Field" текст. И так как в триггере должен работать генератор намеренно не присваиваю значения полю "Код". Нажимаю Enter, получаю ошибку: поле "Код" не должно быть пустым.
Когда и после каких действий должен срабатывать триггер?

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 13:30

Дева писал(а):должно увеличиваться автоматически.
триггер:

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

CREATE TRIGGER TR_GEN_TABLE1_ID FOR TABLE1
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  IF (NEW.KOD IS NULL) THEN 
    NEW.KOD=GEN_ID(GENINT,1);
end

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

Query1.Insert;
Query1.FieldByName('Kod').AsInteger:=1;
Query1.FieldByName('Field1').AsString:='TEXT';
Query1.Post;
Девушка если Вы пишите IF (NEW.KOD IS NULL) THEN, то зачем присваеваете Query1.FieldByName('Kod').AsInteger:=1. Из-за этого Ваш тригер ничего не делает :(

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 13:35

http://www.realcoding.net/article/view/1578
http://www.citforum.ru/database/sql_any/sql_065.shtml
Это результат вот этой ссылки:
http://www.yandex.ru/yandsearch?text=%F ... &stype=www
Надеюсь, этого будет достаточно. И еще. Пишите в раздел FAQ. Триггеры - это ну очень часто задаваемые вопросы.

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

Сообщение Дева » 31 июл 2006, 14:32

2 Guard, вы неправильно меня поняли
Дева писал(а):Когда я работала с Access'ом, я делала запрос с текстом:

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

Select * From Table1
а далее обращаясь к данному запросу:

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

Query1.Insert;
Query1.FieldByName('Kod').AsInteger:=1;
Query1.FieldByName('Field1').AsString:='TEXT';
Query1.Post;
Это я использовала без триггеров

Вообще я интересовалась, могу ли я методоми Insert.....Post вызвать триггер.
Все что я хотела узнать в данной теме, это какие методы и когда вызывают триггер

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 14:42

Вы читали ссылки, которые я давал?
На всякий случай продублируюсь:
Вы не можете вызывать триггеры. Они срабатывают автоматически (при условии, что активны) при исполнении запроса вставки/модификации/удаления в зависимости от того, на какое событие подвешены. То есть прямо из клиента вызвать триггер не получится.
Короче, читайте мануалы.

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 14:50

Вообще я интересовалась, могу ли я методоми Insert.....Post вызвать триггер.
Все что я хотела узнать в данной теме, это какие методы и когда вызывают триггер
Девушка тригеры вызывает сам сервер, соответственно при событиях таблицы к которой привязан триггер, а события Вы можете получить пользуясь методами Insert.....Post (Before/After Insert, Update, Delete)

Insert :
Before Insert
After Insert

Post :
Before Update
After Update

Delete :
Before Delete
After Delete

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

Сообщение Дева » 31 июл 2006, 15:19

Guard писал(а):Девушка тригеры вызывает сам сервер, соответственно при событиях таблицы к которой привязан триггер, а события Вы можете получить пользуясь методами Insert.....Post (Before/After Insert, Update, Delete)

Insert :
Before Insert
After Insert

Post :
Before Update
After Update

Delete :
Before Delete
After Delete
В данном контексте я имела ввиду методы Insert...Post как методы набора данных (DataSet, Query...) надеюсь вы тоже?

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

Сообщение Дева » 31 июл 2006, 15:22

2 CyberMax , все ссылки читала :-)

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 15:41

Дева писал(а): В данном контексте я имела ввиду методы Insert...Post как методы набора данных (DataSet, Query...) надеюсь вы тоже?
Конечно(тем более для Таблиц нет метода POST)
Если Вы читали информацию по ссылкам CyberMax, то честно говоря, я не знаю какие ещё вопросы могут быть. Попробуйте сформулировать по другому, возможно я не успеваю за ходом Вашего быстрого разума :cry:

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

Сообщение WildSery » 31 июл 2006, 15:46

2 Дева:
Query1.Post как раз и вызовет на сервере событие BeforeInsert, а затем AfterInsert.
Господа, девушке надо учить основы, а вы ей суёте документацию для разработчиков.

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

Сообщение Merlin » 31 июл 2006, 15:47

Спинным мозгом чую - бландынка (С)

Guard
Сообщения: 11
Зарегистрирован: 31 июл 2006, 12:00

Сообщение Guard » 31 июл 2006, 15:50

WildSery писал(а):2 Дева:
Query1.Post как раз и вызовет на сервере событие BeforeInsert, а затем AfterInsert.
Господа, девушке надо учить основы, а вы ей суёте документацию для разработчиков.
На самом деле Query1.Post не всегда вызовет Insert, если вы в режиме редактирования то Update. Спасибо за "МЫ", но CyberMax как раз и предлагал посмотреть в FAQе.

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

Сообщение Merlin » 31 июл 2006, 16:08

WildSery писал(а):2 Дева:
Query1.Post как раз и вызовет на сервере событие BeforeInsert, а затем AfterInsert.
Господа, девушке надо учить основы, а вы ей суёте документацию для разработчиков.
Ты так её ещё больше запутаешь, она после этих слов верняк события датасета задумчиво рассматривает и ищет в них триггера. Сливает её TField.Reqired, а не сервак, до него дело ещё не доходит. Правда що потом делать клиенту с записью, ID которой ему неведомо - тоже вопрос. Но это же в статье "про генераторы", а не "про триггеры". Которую она уже читала. Там вроде всё на уровне Буратины и трёх яблок расписано...

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 16:18

Merlin писал(а):Правда що потом делать клиенту с записью, ID которой ему неведомо - тоже вопрос. Но это же в статье "про генераторы", а не "про триггеры"
Для этого и давал ей ссылку на статью про генераторы, а она не поняла...
Соглашусь, что она блондинко, причем во всех местах :D. Даже поблондинистей, чем Марина будет.
В общем, Марина, сначала перечитай документацию сайта, а потом уже спрашивай. А по-хорошему тему надо в ЧаВо переместить, там ей самое место.

Дева
Сообщения: 19
Зарегистрирован: 26 июл 2006, 16:58

Сообщение Дева » 31 июл 2006, 16:41

Во-первых я не блондика
Во-вторых азы я знаю
В-третьих вы не поняли вопроса, посему отправляли меня изучать не то, что надо, поэтому я по-прежнему задавала свои глупые вопросы, потому что ответа не было! Вот такая вот билеберда и вышла!

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 16:46

Это ты не поняла :evil:. Отправляли тебя изучать всё. Иначе подобные темы ты будешь создавать десятками.
P.S. Повезло тебе, что я не модер на этом разделе, и Дмитрий на отдыхе. Иначе этой темы уже не было бы.

Ответить