powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как поправить запись в триггере
17 сообщений из 17, страница 1 из 1
Как поправить запись в триггере
    #32007633
Nbveh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Нетривиальная задача.
Работает триггер после. Тут выясняется, что в другой таблице - нет записи на которое
ссылается поле таблицы по которой сейчас выполняется триггер (сам вроде бы понял что сказал)
Добавляем запись в другую таблицу - это на ура, а вот как поправить поле , да еще и в триггере
, да еще и в таблице по котрой выполняется триггер.

Буду очень признателен.
С уважением!
Тимур
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007634
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UPDATE ... не работает?
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007645
Nbveh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да нет конечно, дело в том, что не допускается изменение
таблиц inserted & deleted
А update вызовет другой триггер - который не очень то нужно вызывать.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007654
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот как я выкрутился. Первое апдейтить нужно конечно саму таблицу, т.е. не inserted а саму на котроую триггер написан. Затем в триггере на UPDATE имеется условие IF @@NESTLEVEL < Integer, ну и т.д. Вот пример.
CREATE TRIGGER BeforUpdateMdan ON dbo.Mdan
FOR UPDATE
AS
IF @@NESTLEVEL < 4
BEGIN
Ну а тут уже сам триггер
END
4 моем случае. В Вашем нужно будет узнать какой уровень вложенности у триггера на апдейт, когда он вызывается через другой триггер, в котором Вы проводите апдейт.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007702
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я извиняюсь. Не @@NESTLEVEL(это для текущей процедуры), а TRIGGER_NESTLEVEL([Object_id])
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007709
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даже вот так TRIGGER_NESTLEVEL().
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007714
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TRIGGER_NESTLEVEL([Object_id]) поправильнее будет. А иначе вызовется твой триггер из какой-нибудь процедуры, и обломится.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007770
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TRIGGER_NESTLEVEL c ненулевым параметром возвращает уровень вложенности для конкретного триггера, а если параметр NULL, то возвращается количество выполненных до этого триггеров + 1. TRIGGER_NESTLEVEL([Object_id('Our Trigger')]) будет возвращать всегда 1 в нашем случае, а вот TRIGGER_NESTLEVEL() - 2. Насчет того, что триггер может вызваться из процедуры можно сказать, что здесь надо точно знать может ли это произойти или нет, либо не допускать ситауции, когла на сервер приходят неправильные значения, т.е. обрабатывать их клиенте, что бы не нужно было апдейтить.
Вообще говоря для меня эта проблема тоже очень актаульна, т.к. меня тоже заставляют Update проводить в триггере, что мне очень не нравится из-за триггера на Update. Павел, буду очень рад дискусии на эту тему. Жду Вашего ответа с нетерпением.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007771
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если триггер будет вызван из процедуры, то TRIGGER_NESTLEVEL() возвратит 1!!!
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007772
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я исхожу из таких соображений: если предусмотреть все возможные варианты рекурсивного взаимодействия триггеров, используя TRIGGER_NESTLEVEL([Object_id]), всегда можно точно определить что именно послужило причиной отработки триггера, и соответствующим образом строить правила поведения триггера, в котором и происходит проверка. Т.е. проверять не сколько раз выполнялись вложенные триггера, а выполнялся ли конкретный триггер, и если да - то сколько раз. Этот способ не лишен недостатков: все идет на смарку в случае переименования или добавления триггеров в рекурсивной цепочке. Но это скорее вопрос аккуратности разроботчика. А вот от клиентских проверок, результат которых может повлиять на результат операций на сервере лучше отказаться. Вернее стоит продублировать их на сервере. Тогда перед отправкой изменений на сервер клиент разгрузит сервер от потенциального отката транзакции в случае обнаружения сервером ошибки, либо вообще отменит отправку. Короче мой девиз - всю логику на сервер. Чем тоньше и тупее клиент, тем легче его разрабатывать и сопровождать.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007870
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел, мне кажется в вопросе где должна быть логика нужно искать золотую середину всегда.
Может что посоветуете? Мои клиентчики хотят при вставке записи сразу знать ее ID. Вот зачем. Иногда в БД происхит вот такая вещь. Юзер вставляет запись в главную таблицу а через некоторое время (секунд 10-20) в почененную. Если бы связь таблиц организовывалась бы через поле действительно являющееся ключевым, то проблем бы не было, а так как связь через дополнительно добавленное поле ID(с Identity). Возникает проблема. За эти 10-20 секунд кто-то может вставить запись и IDENT_CURRENT возвратит неверное значение.
Одно решение ко мне пришло.
declare @InsertedID int
set @InsertedID = IDENT_CURRENT('MyTable') + 1
/*между этими строчками никто запись не вставит?*/
insert into MyTbale values ('Мои клиентчики ошибаются')
select @InsertedID
Есть еще один вариант. В триггере на insert сказать
select @InsertedID = id from inserted
return
я тут могу ошибаться!, но интересно как клиент сможет прочесть @InsertedID в этом случае?
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007873
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Slava
>Если бы связь таблиц организовывалась бы через поле действительно являющееся ключевым, то проблем бы не было, а так как связь через дополнительно добавленное поле ID(с Identity).

Не могу представить зачем нужно было так делать. Почитайте статью здесь или из рассылки, называется "Естественные ключи против исскуственных"

>За эти 10-20 секунд кто-то может вставить запись и IDENT_CURRENT возвратит неверное значение.

Вот здесь вообще ничего не понял, это у Вас транзакция ответа юзера ждет что ли???

Вот ну никак не пойму что за проблема такая с этим identity.
Ну сделайте запись через процедуру с возвратом значения этого Identity, неужели это так сложно?

Create procedure Write @Parameters
as
begin
declare @IdentityValue int
insert into YourTable values(....)
set @IdentityValue = @@identity
select @IdentityValue as YourIdentityValue
end
Вот и все в результате процедура вставит запись и вернет вам значение Identity. Что еще надо то?
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007874
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что то я тоже ничего не понял. А что у Вас в качестве клиента? Я ума не приложу, что вы используете чтобы так извращаться! ODBC и ADO возвращают Identity для вставленной записи совершенно бесшумно... Или как Genady посоветовал.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007882
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Delphi5, ADO. Про ключи почитал. Объясните Павел пожалуйста что Вы имеете ввиду говоря о бесшумности.
Сейчас я остановился на том что в триггере на insert написал
select id from inserted
в конце. В TQuery после инсерта есть набор данных (select id from inserted). Вроде все просто.

2 Genady
Скажите пожалуйста (ну не понимаю я чего-то) между выполнением insert и set в Вашем примере @@IDENTITY не может измениться?
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007886
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не владею терминологией ADO компонентов Delphi, поэтому расскажу про ADO как есть от мелкомягких. Если используется Recordset, то нужно прописать динамическое свойство Resync Command, и значение счетчика вернется автоматом. Очень советую почитать http://www.delphikingdom.com/helloworld/ado01.htm и http://www.delphikingdom.com/helloworld/ado02.htm

И отвечу за Genady - не может.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007887
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, Павел, правильно Вам уже ответил. Посмотрите в BOL System Function, я как то брякнул здесь чушь о глобальных переменных, а потом выяснил, что глобальные переменные это по сути системные функции и @@Identity одна из них, и если Вы сами ничего не напутали, то юзера не помешают друг другу в получение правильного значения Identity.
...
Рейтинг: 0 / 0
Как поправить запись в триггере
    #32007908
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо коллеги. За статью отдельно.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как поправить запись в триггере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]