триггеры
Модератор: kdv
триггеры
помогите разобраться. Как использовать триггеры? Пишу приложение на Delphi 7. Когда происходит ображение к триггерам и как?
Дева, имейте совесть, воспользуйтесь поиском.
Ссылки: http://www.ya.ru/ либо http://forum.ibase.ru/phpBB2/search.php либо http://www.ibase.ru/develop.htm.
А то спровоцируете "флуд" на пять страниц
.
Ссылки: http://www.ya.ru/ либо http://forum.ibase.ru/phpBB2/search.php либо http://www.ibase.ru/develop.htm.
А то спровоцируете "флуд" на пять страниц

я сегодня все утро ищу. Везде есть только размышления на тему почему не сработало и какие ошибки в коде. Как правило код - генераторов и триггеров.
Ладно, можно вопрос по-другому обставить? Есть таблица, в которую необходимо поместить запись с полем "Код", значение которого должно увеличиваться автоматически.
генератор:
триггер:
В приложении на форме помещаю: IBDatabase1 + IBTransaction1 + DataSource1 + IBQuery1.
Когда я работала с Access'ом, я делала запрос с текстом:
а далее обращаясь к данному запросу:
будет ли это верно?
P. S. продолжаю искать
Ладно, можно вопрос по-другому обставить? Есть таблица, в которую необходимо поместить запись с полем "Код", значение которого должно увеличиваться автоматически.
генератор:
Код: Выделить всё
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
Когда я работала с Access'ом, я делала запрос с текстом:
Код: Выделить всё
Select * From Table1
Код: Выделить всё
Query1.Insert;
Query1.FieldByName('Kod').AsInteger:=1;
Query1.FieldByName('Field1').AsString:='TEXT';
Query1.Post;
P. S. продолжаю искать

Милая девушка, посмотрите еще раз эту ссылку:
http://www.ibase.ru/develop.htm
А так же вот эту, которая находится на вышеуказанной странице:
http://www.ibase.ru/devinfo/generator.htm
http://www.ibase.ru/develop.htm
А так же вот эту, которая находится на вышеуказанной странице:
http://www.ibase.ru/devinfo/generator.htm
Читаю-читаю-читаю и не могу понять. Возможно я неверно поставила себе задачу
и потому не нахожу ответы... Для решения каких вопросов служат триггеры? А если забыть о генераторе на минутку. Пусть к примеру есть задача, выполнение которой одинаково при каждом добавлении записи. Значит ли, что достаточно реализовать эту повторяющуюся задачу в триггере, а потом лишь обращаться к нему?
По сути дела увеличивать значение счетчика можно без использования генератора вообще. Из приложения вызывать просмотр таблицы, брать последний номер, увеличивать на 1 и вставлять запись... Но я ищу более оптимальные пути. Чтобы использовать однажды написанный код, а не дублировать его всякий раз, когда мне нужно вставить запись в одну из десятка-сотни таблиц.
Я сейчас не пытаюсь разобраться с тем как писать генераторы, триггеры и хранимые процедуры, я не могу понять, как из приложения, которое я стряпаю на Delphi 7 обратиться к уже готовому коду.
Возможно неверен ход моей мысли?
К примеру:
Я в таблицу хочу добавить запись с помощью объекта TIBTable, набираю в поле "Field" текст. И так как в триггере должен работать генератор намеренно не присваиваю значения полю "Код". Нажимаю Enter, получаю ошибку: поле "Код" не должно быть пустым.
Когда и после каких действий должен срабатывать триггер?

По сути дела увеличивать значение счетчика можно без использования генератора вообще. Из приложения вызывать просмотр таблицы, брать последний номер, увеличивать на 1 и вставлять запись... Но я ищу более оптимальные пути. Чтобы использовать однажды написанный код, а не дублировать его всякий раз, когда мне нужно вставить запись в одну из десятка-сотни таблиц.
Я сейчас не пытаюсь разобраться с тем как писать генераторы, триггеры и хранимые процедуры, я не могу понять, как из приложения, которое я стряпаю на Delphi 7 обратиться к уже готовому коду.
Эта статья о генераторах, а я не могу понять триггеры.CyberMax писал(а):http://www.ibase.ru/devinfo/generator.htm
Возможно неверен ход моей мысли?
К примеру:
Я в таблицу хочу добавить запись с помощью объекта TIBTable, набираю в поле "Field" текст. И так как в триггере должен работать генератор намеренно не присваиваю значения полю "Код". Нажимаю Enter, получаю ошибку: поле "Код" не должно быть пустым.
Когда и после каких действий должен срабатывать триггер?
Девушка если Вы пишите IF (NEW.KOD IS NULL) THEN, то зачем присваеваете Query1.FieldByName('Kod').AsInteger:=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
Код: Выделить всё
Query1.Insert; Query1.FieldByName('Kod').AsInteger:=1; Query1.FieldByName('Field1').AsString:='TEXT'; Query1.Post;

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. Триггеры - это ну очень часто задаваемые вопросы.
http://www.citforum.ru/database/sql_any/sql_065.shtml
Это результат вот этой ссылки:
http://www.yandex.ru/yandsearch?text=%F ... &stype=www
Надеюсь, этого будет достаточно. И еще. Пишите в раздел FAQ. Триггеры - это ну очень часто задаваемые вопросы.
2 Guard, вы неправильно меня поняли
Вообще я интересовалась, могу ли я методоми Insert.....Post вызвать триггер.
Все что я хотела узнать в данной теме, это какие методы и когда вызывают триггер
Это я использовала без триггеровДева писал(а):Когда я работала с Access'ом, я делала запрос с текстом:а далее обращаясь к данному запросу:Код: Выделить всё
Select * From Table1
Код: Выделить всё
Query1.Insert; Query1.FieldByName('Kod').AsInteger:=1; Query1.FieldByName('Field1').AsString:='TEXT'; Query1.Post;
Вообще я интересовалась, могу ли я методоми Insert.....Post вызвать триггер.
Все что я хотела узнать в данной теме, это какие методы и когда вызывают триггер
Вы читали ссылки, которые я давал?
На всякий случай продублируюсь:
Вы не можете вызывать триггеры. Они срабатывают автоматически (при условии, что активны) при исполнении запроса вставки/модификации/удаления в зависимости от того, на какое событие подвешены. То есть прямо из клиента вызвать триггер не получится.
Короче, читайте мануалы.
На всякий случай продублируюсь:
Вы не можете вызывать триггеры. Они срабатывают автоматически (при условии, что активны) при исполнении запроса вставки/модификации/удаления в зависимости от того, на какое событие подвешены. То есть прямо из клиента вызвать триггер не получится.
Короче, читайте мануалы.
Девушка тригеры вызывает сам сервер, соответственно при событиях таблицы к которой привязан триггер, а события Вы можете получить пользуясь методами Insert.....Post (Before/After Insert, Update, Delete)Вообще я интересовалась, могу ли я методоми Insert.....Post вызвать триггер.
Все что я хотела узнать в данной теме, это какие методы и когда вызывают триггер
Insert :
Before Insert
After Insert
Post :
Before Update
After Update
Delete :
Before Delete
After Delete
В данном контексте я имела ввиду методы Insert...Post как методы набора данных (DataSet, Query...) надеюсь вы тоже?Guard писал(а):Девушка тригеры вызывает сам сервер, соответственно при событиях таблицы к которой привязан триггер, а события Вы можете получить пользуясь методами Insert.....Post (Before/After Insert, Update, Delete)
Insert :
Before Insert
After Insert
Post :
Before Update
After Update
Delete :
Before Delete
After Delete
Конечно(тем более для Таблиц нет метода POST)Дева писал(а): В данном контексте я имела ввиду методы Insert...Post как методы набора данных (DataSet, Query...) надеюсь вы тоже?
Если Вы читали информацию по ссылкам CyberMax, то честно говоря, я не знаю какие ещё вопросы могут быть. Попробуйте сформулировать по другому, возможно я не успеваю за ходом Вашего быстрого разума

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

В общем, Марина, сначала перечитай документацию сайта, а потом уже спрашивай. А по-хорошему тему надо в ЧаВо переместить, там ей самое место.