Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Триггер FOR UPDATE  [new]
Sorry
Guest
Sorry. Только начала осваивать MS SQL (2008).
И могу допустить ляпсус в терминологии, да и в вопросе, пожалуй ...

Задача следующая.
Нужно в триггере FOR UPDATE обеспечить НЕвозможность изменения значения поля DATE_CREATE из внешних модулей.
Вот такой триггер решает задачу, если изменение происходит в одной строке таблицы.

                                                                                                                          
ALTER TRIGGER STORAGELIST_UPD ON STORAGE_LIST FOR UPDATE
AS BEGIN
  IF @@ROWCOUNT>0
  BEGIN

     DECLARE @D_CR DATE

     -- *********************************************
     -- Читаем DATE_CREATE (из набора старых значений полей)
     SELECT @D_CR = D.DATE_CREATE
     FROM Deleted D INNER JOIN Inserted I ON I.ID_THIS = D.ID_THIS
     -- *********************************************

     -- *********************************************
     -- Если DATE_CREATE (из набора старых значений полей) не задано
     -- присваиваем переменной @D_CR значение DATE_UPDATE  (из набора старых значений полей)
     IF ( @D_CR IS NULL )
     BEGIN
       SELECT @D_CR = D.DATE_UPDATE
       FROM Deleted D INNER JOIN Inserted I ON I.ID_THIS = D.ID_THIS
     END
     -- *********************************************

     -- *********************************************
     -- Если и в этом случае значение @D_CR не задано - присваиваем текущую дату
     IF ( @D_CR IS NULL )
     BEGIN
       SET @D_CR = GETDATE()
     END
     -- *********************************************

     -- *********************************************
     -- Делаем Update таблицы
     UPDATE STORAGE_LIST
     SET
       DATE_CREATE = @D_CR,
       DATE_UPDATE = GETDATE()
     FROM Inserted I INNER JOIN STORAGE_LIST T ON I.ID_THIS = T.ID_THIS
     -- *********************************************
  END
END


Но если выполнить такую команду :

update STORAGE_LIST
set
DATE_CREATE = '01.01.2009'  

То триггер работает не правильно.

Смотрел в сторону DECLARE ... CURSOR, но корректно не смог реализовать.

Подскажите, pls, варианты решения.
Если возможно - на этом конкретном примере.
12 сен 09, 23:41    [7651708]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Insrted и deleted - таблицы, в которых может быть более одной записи. Кстати, и менее одной тоже.
12 сен 09, 23:57    [7651732]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Sorry
Если возможно - на этом конкретном примере.

Это унылое г..но, извини, непонятно совершенно что должно делать. За первые два селекта я бы автора за яйу линейкой по пальцам подвесил
13 сен 09, 00:03    [7651741]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Гавриленко Сергей Алексеевич
Кстати, и менее одной тоже.

Тут автор подстраховался
IF @@ROWCOUNT>0
13 сен 09, 00:05    [7651746]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
iljy
Member

Откуда:
Сообщений: 8711
Sorry,

привыкайте работать с множествами. Насколько я понял, ваш триггер можно записать вот таким запросом:

 UPDATE S
     SET
       DATE_CREATE = coalesce(D.DATE_CREATE, D.DATE_UPDATE, GetDate()),
       DATE_UPDATE = GETDATE()
     FROM STORAGE_LIST S join DELETED d ON s.ID_THIS = d.ID_THIS
13 сен 09, 00:06    [7651751]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Sorry
Guest
Roman S. Golubin
Это унылое г..но, извини, непонятно совершенно что должно делать. За первые два селекта я бы автора за яйу линейкой по пальцам подвесил


1. Извиняю (ибо даже если Вы СверхГуру - то вряд ли с рождения и вряд ли простительно хамство).
Я же сказал, что только начал изучать.

2. Сделать нужно простую вещь.
Чтобы при любых изменениях строк таблицы - значение поля DATE_CREATE вычислялось по след. приоритетам :

a. Если старое значение поля ДО изменения было не NULL, то остается это значение.

b. Если старое значение этого поля NULL, то берется старое значение поля DATE_UPDATE

c. Если и после этого NULL - то текущая дата.

Вот и все ...
13 сен 09, 00:10    [7651760]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Sorry
Guest
iljy
Sorry,

привыкайте работать с множествами. Насколько я понял, ваш триггер можно записать вот таким запросом:

 UPDATE S
     SET
       DATE_CREATE = coalesce(D.DATE_CREATE, D.DATE_UPDATE, GetDate()),
       DATE_UPDATE = GETDATE()
     FROM STORAGE_LIST S join DELETED d ON s.ID_THIS = d.ID_THIS


Спасибо, iljy.
Я должен это обдумать и протестировать(еще медленно ориентирусь).
13 сен 09, 00:13    [7651765]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Sorry
1. Извиняю (ибо даже если Вы СверхГуру - то вряд ли с рождения и вряд ли простительно хамство).
Я же сказал, что только начал изучать.

Где хамство? Просто вещи названы своими именами. Привыкайте к терминологии...

Sorry
2. Сделать нужно простую вещь.
Чтобы при любых изменениях строк таблицы - значение поля DATE_CREATE вычислялось по след. приоритетам :

a. Если старое значение поля ДО изменения было не NULL, то остается это значение.

b. Если старое значение этого поля NULL, то берется старое значение поля DATE_UPDATE

c. Если и после этого NULL - то текущая дата.

Вот и все ...


Вот сразу и надо было так написать.
PS: iljy уже дал вам правильный ответ.
PPS: на звание свехгуру не претендую :)
13 сен 09, 00:16    [7651768]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Sorry
Guest
iljy
Sorry,

привыкайте работать с множествами. Насколько я понял, ваш триггер можно записать вот таким запросом:

 UPDATE S
     SET
       DATE_CREATE = coalesce(D.DATE_CREATE, D.DATE_UPDATE, GetDate()),
       DATE_UPDATE = GETDATE()
     FROM STORAGE_LIST S join DELETED d ON s.ID_THIS = d.ID_THIS


Это работает.
Теперь буду читать док. и разбираться в этом примере.
Огромнейшее спасибо.
13 сен 09, 00:19    [7651773]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Sorry
Guest
Где хамство? Просто вещи названы своими именами. Привыкайте к терминологии...


Да ладно.
Я не в обиде (сам далеко не ангел).
13 сен 09, 00:21    [7651779]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Sorry
Да ладно.
Я не в обиде (сам далеко не ангел).

Я сам начинал изучать SQL с полного непонимания принципов работы. И если бы сразу по рукам не надавали...
Если только начал изучать SQL, забудь про переменные - считай, что их нет. Они нужны, но в самом начале изучения лучше ими вообще не пользоваться, иначе процесс может значительно затянуться.
13 сен 09, 00:29    [7651791]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Sorry
Guest
Roman S. Golubin, в SQL я не с самого уж нуля. Но мыслю в контексте Interbase.
А это, все-таки, существенная разница (насколько я уже могу судить).
Насчет переменных - понял. Спасибо.
13 сен 09, 00:39    [7651810]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541
Sorry
мыслю в контексте Interbase.

Интербейза не знаю, ни разу не видел :) Для прочистки контекста рекомендую порешать задачки с sql-ex.ru
13 сен 09, 00:47    [7651820]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Sorry
Но мыслю в контексте Interbase.
Что Вам мешает поменять контекст? у меня получилось вот... :) И до сих пор "перключаюсь" непринужденно ;)
13 сен 09, 01:09    [7651840]     Ответить | Цитировать Сообщить модератору
 Re: Триггер FOR UPDATE  [new]
Sorry
Guest
Senya_L
Sorry
Но мыслю в контексте Interbase.
Что Вам мешает поменять контекст? у меня получилось вот... :) И до сих пор "перключаюсь" непринужденно ;)

Так вот же и меняю.
Но трудно за 3 дня сменить роль (ну не Смоктуновский я).
:-)
13 сен 09, 09:53    [7652236]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить