Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Нетривиальная задача. Работает триггер после. Тут выясняется, что в другой таблице - нет записи на которое ссылается поле таблицы по которой сейчас выполняется триггер (сам вроде бы понял что сказал) Добавляем запись в другую таблицу - это на ура, а вот как поправить поле , да еще и в триггере , да еще и в таблице по котрой выполняется триггер. Буду очень признателен. С уважением! Тимур ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2001, 03:46 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
UPDATE ... не работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2001, 06:46 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Да нет конечно, дело в том, что не допускается изменение таблиц inserted & deleted А update вызовет другой триггер - который не очень то нужно вызывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2001, 17:26 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Вот как я выкрутился. Первое апдейтить нужно конечно саму таблицу, т.е. не inserted а саму на котроую триггер написан. Затем в триггере на UPDATE имеется условие IF @@NESTLEVEL < Integer, ну и т.д. Вот пример. CREATE TRIGGER BeforUpdateMdan ON dbo.Mdan FOR UPDATE AS IF @@NESTLEVEL < 4 BEGIN Ну а тут уже сам триггер END 4 моем случае. В Вашем нужно будет узнать какой уровень вложенности у триггера на апдейт, когда он вызывается через другой триггер, в котором Вы проводите апдейт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2001, 03:11 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Я извиняюсь. Не @@NESTLEVEL(это для текущей процедуры), а TRIGGER_NESTLEVEL([Object_id]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2001, 10:53 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Даже вот так TRIGGER_NESTLEVEL(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2001, 11:23 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
TRIGGER_NESTLEVEL([Object_id]) поправильнее будет. А иначе вызовется твой триггер из какой-нибудь процедуры, и обломится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2001, 12:24 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
TRIGGER_NESTLEVEL c ненулевым параметром возвращает уровень вложенности для конкретного триггера, а если параметр NULL, то возвращается количество выполненных до этого триггеров + 1. TRIGGER_NESTLEVEL([Object_id('Our Trigger')]) будет возвращать всегда 1 в нашем случае, а вот TRIGGER_NESTLEVEL() - 2. Насчет того, что триггер может вызваться из процедуры можно сказать, что здесь надо точно знать может ли это произойти или нет, либо не допускать ситауции, когла на сервер приходят неправильные значения, т.е. обрабатывать их клиенте, что бы не нужно было апдейтить. Вообще говоря для меня эта проблема тоже очень актаульна, т.к. меня тоже заставляют Update проводить в триггере, что мне очень не нравится из-за триггера на Update. Павел, буду очень рад дискусии на эту тему. Жду Вашего ответа с нетерпением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2001, 03:25 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Если триггер будет вызван из процедуры, то TRIGGER_NESTLEVEL() возвратит 1!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2001, 03:54 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Я исхожу из таких соображений: если предусмотреть все возможные варианты рекурсивного взаимодействия триггеров, используя TRIGGER_NESTLEVEL([Object_id]), всегда можно точно определить что именно послужило причиной отработки триггера, и соответствующим образом строить правила поведения триггера, в котором и происходит проверка. Т.е. проверять не сколько раз выполнялись вложенные триггера, а выполнялся ли конкретный триггер, и если да - то сколько раз. Этот способ не лишен недостатков: все идет на смарку в случае переименования или добавления триггеров в рекурсивной цепочке. Но это скорее вопрос аккуратности разроботчика. А вот от клиентских проверок, результат которых может повлиять на результат операций на сервере лучше отказаться. Вернее стоит продублировать их на сервере. Тогда перед отправкой изменений на сервер клиент разгрузит сервер от потенциального отката транзакции в случае обнаружения сервером ошибки, либо вообще отменит отправку. Короче мой девиз - всю логику на сервер. Чем тоньше и тупее клиент, тем легче его разрабатывать и сопровождать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2001, 04:28 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Павел, мне кажется в вопросе где должна быть логика нужно искать золотую середину всегда. Может что посоветуете? Мои клиентчики хотят при вставке записи сразу знать ее 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 в этом случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 02:45 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
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. Что еще надо то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 05:09 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Что то я тоже ничего не понял. А что у Вас в качестве клиента? Я ума не приложу, что вы используете чтобы так извращаться! ODBC и ADO возвращают Identity для вставленной записи совершенно бесшумно... Или как Genady посоветовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 05:34 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Delphi5, ADO. Про ключи почитал. Объясните Павел пожалуйста что Вы имеете ввиду говоря о бесшумности. Сейчас я остановился на том что в триггере на insert написал select id from inserted в конце. В TQuery после инсерта есть набор данных (select id from inserted). Вроде все просто. 2 Genady Скажите пожалуйста (ну не понимаю я чего-то) между выполнением insert и set в Вашем примере @@IDENTITY не может измениться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 06:58 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Я не владею терминологией ADO компонентов Delphi, поэтому расскажу про ADO как есть от мелкомягких. Если используется Recordset, то нужно прописать динамическое свойство Resync Command, и значение счетчика вернется автоматом. Очень советую почитать http://www.delphikingdom.com/helloworld/ado01.htm и http://www.delphikingdom.com/helloworld/ado02.htm И отвечу за Genady - не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 07:12 |
|
||
|
Как поправить запись в триггере
|
|||
|---|---|---|---|
|
#18+
Да, Павел, правильно Вам уже ответил. Посмотрите в BOL System Function, я как то брякнул здесь чушь о глобальных переменных, а потом выяснил, что глобальные переменные это по сути системные функции и @@Identity одна из них, и если Вы сами ничего не напутали, то юзера не помешают друг другу в получение правильного значения Identity. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2001, 07:24 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32007887&tid=1826430]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 369ms |

| 0 / 0 |
