Триггеры

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Триггеры

Сообщение ru_alex »

Всем привет!

У меня в программе в некоторых файлах-связках есть дополнительные поля (даты и наименования) для сортировки Browse, информация берется из основных файлов, соответственно при ее редактировании в основном файле, нужно изменять в файл-связке. Пока делаю ручками, но вроде как должна быть возможность делать это автоматом на серваке, и вроде как для это можно использовать триггеры. Попробовал разобраться, получается только сразу во всем файле, а надо только для редактируемой записи.

Может кто сталкивался?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

а какие проблемы? В триггере главного файла пишешь
UPDATE myFile
SET myField=@FieldValue
WHERE MyFile.Id=@IdValue
где myFile - файл-связка, @FieldValue новое значение поля, @IdValue поле связи между файлами

ПС
я про MSSQL говорю
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

А как получить @FieldValue и @IdValue?

У меня то ошибка понятно в чем:

CREATE TRIGGER UpdateMyFileName ON MyFile
FOR INSERT, UPDATE
AS
IF UPDATE(Name)
BEGIN
UPDATE MyFile2MyFile1 SET MyFile2MyFile1.NameMyFile = MyFile.Name FROM MyFile WHERE MyFile2MyFile1.NumMyFile = MyFile.Num
END
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

есть 2 таблицы для триггеров - inserted и deleted (смотри Books Online).
declare @IdValue int
SELECT @IdValue=Id
FROM inserted
кажется так
С уважением, ДП
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Дед Пахом писал(а):есть 2 таблицы для триггеров - inserted и deleted (смотри Books Online).
declare @IdValue int
SELECT @IdValue=Id
FROM inserted
кажется так
судя по переписке это MSSQL
а вот так не советую юзать inserted и deleted
т к в них может быть более одной записи и тады кирдык

в 90% случаев
надо декларировать курсоры и в цикле проходится по всем записям

это сделано для оптимизации (в ORACLE такого нет, триггера по одной записи), можно в зависимости от задачи и не декларировать курсоры, если имеют место быть групповые операции типа:

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

  delete from dbo.W_CAL where
   DATUMS in (select DATUMS from deleted) 
Последний раз редактировалось Andrew™ 16 Январь 2006, 9:37, всего редактировалось 1 раз.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3134
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Сообщение Дед Пахом »

а вот так не советую юзать inserted и deleted
т к в них может быть более одной записи и тады кирдык
надо декларировать курсоры и в цикле проходится по всем записям
Совершенно справедливо
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Правильно ли я понял?

Чтобы найти те строки, в которых значение некой колонки изменилось, мне нужно сравнивать inserted table с основным файлом.

Для этого объявить курсор типа:

DECLARE MyCursor CURSOR FOR
SELECT MyFile.Name FROM MyFile INNER JOIN inserted ON MyFile.ID= inserted.ID
WHERE MyFile.Name <> inserted.Name

Или можно проще?

PS: Извиняюсь что не уточнил. Использую MSSQL.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

ru_alex писал(а):Правильно ли я понял?

Чтобы найти те строки, в которых значение некой колонки изменилось, мне нужно сравнивать inserted table с основным файлом.

Для этого объявить курсор типа:

DECLARE MyCursor CURSOR FOR
SELECT MyFile.Name FROM MyFile INNER JOIN inserted ON MyFile.ID= inserted.ID
WHERE MyFile.Name <> inserted.Name

Или можно проще?
на входе есть inserted и deleted, по хорошему(правильному) поля первичного ключа никогда не меняются, тогда надо просто сравнить
соответсвующие поля в записях inserted и deleted по полям первичного ключа на предмет изменения требуемых полей, накладывать JOIN прямо на реальную таблицу нет необходимости

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

SELECT inserted.Name FROM inserted INNER JOIN deleted ON inserted.ID= deleted.ID
WHERE inserted.Name <> deleted.Name
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Все, разобрался, проверил, работает!
Всем спасибо!
Ответить