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

триггеры

Добавлено: 31 июл 2006, 11:43
Дева
помогите разобраться. Как использовать триггеры? Пишу приложение на Delphi 7. Когда происходит ображение к триггерам и как?

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

Добавлено: 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. продолжаю искать :-)

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

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

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

Добавлено: 31 июл 2006, 13:30
Guard
Дева писал(а):должно увеличиваться автоматически.
триггер:

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

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. Из-за этого Ваш тригер ничего не делает :(

Добавлено: 31 июл 2006, 13:35
CyberMax
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. Триггеры - это ну очень часто задаваемые вопросы.

Добавлено: 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 вызвать триггер.
Все что я хотела узнать в данной теме, это какие методы и когда вызывают триггер

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

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

Insert :
Before Insert
After Insert

Post :
Before Update
After Update

Delete :
Before Delete
After Delete

Добавлено: 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...) надеюсь вы тоже?

Добавлено: 31 июл 2006, 15:22
Дева
2 CyberMax , все ссылки читала :-)

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

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

Добавлено: 31 июл 2006, 15:47
Merlin
Спинным мозгом чую - бландынка (С)

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

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

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

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

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