Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Всем привет. Помогите пожалуйста. У меня есть таблица Vakansee с полями IdVak, field1, field2,..., DateUpdate. Мне нужно чтобы при изменении любой записи автоматически обновлялось поле DateUpdate(сист. дата). Щас сделал это при помощи процедуры и триггера но эта связка не работает. Вот она:
CREATE PROCEDURE UpdateFirst
AS
BEGIN
UPDATE [NIPI\IT09].[Vakansee] SET DateUpdate=GetDate()
END
GO


CREATE TRIGGER UpdTrig
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

exec UpdateFirst

END


Когда вызываю работу процедуры путем exec UpdateFirst - все работает. Но в триггере почему то не пашет.
Не дает редактировать записи и выводит - Row failed to retrieve on last operation
26 ноя 12, 15:01    [13529998]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ReZonance,

обновляете поле каждый раз во всех записях? Странно это.

А UPDATE (правильный) проще в триггере и написать
26 ноя 12, 15:05    [13530041]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Только обратить внимание на возможность рекурсивного вызова триггера (это разрешено или запрещено, - откуда мы знаем?).
26 ноя 12, 15:07    [13530060]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
ReZonance,

Может так?
CREATE TRIGGER UpdTrig
 ON [NIPI\IT09].[Vakansee]
 AFTER update
AS
BEGIN

 UPDATE [NIPI\IT09].[Vakansee] 
 SET DateUpdate=GetDate() 
 FROM INSERTED i
    INNER JOIN [NIPI\IT09].[Vakansee] vk
    ON i.IdVak =vk.IdVak -- где IdVak ключевое поле

END
26 ноя 12, 15:08    [13530081]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
trew, так работает но меняет DateUpdate непосредственно на той записи в кот мы вносим изменения, а мне надо чтобы Dateupdate менялись во всех записях при изменении любой из них.
26 ноя 12, 15:19    [13530169]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
trew
ReZonance,

Может так?
CREATE TRIGGER UpdTrig
 ON [NIPI\IT09].[Vakansee]
 AFTER update
AS
BEGIN

 UPDATE [NIPI\IT09].[Vakansee] 
 SET DateUpdate=GetDate() 
 FROM INSERTED i
    INNER JOIN [NIPI\IT09].[Vakansee] vk
    ON i.IdVak =vk.IdVak -- где IdVak ключевое поле

END
Надо бы ещё проверку на неравенство даты в inserted и deleted,
чтобы рекурсия быстро обломалась на следующем шаге, если она возможна.
BEGIN и END лишние, но это, конечно, от вкуса зависит...
26 ноя 12, 15:20    [13530181]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
ReZonance
trew, так работает но меняет DateUpdate непосредственно на той записи в кот мы вносим изменения, а мне надо чтобы Dateupdate менялись во всех записях при изменении любой из них.

Так напишите ваш UPDATE в триггере, как iap уже предложил.
26 ноя 12, 15:21    [13530190]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ReZonance
trew, так работает но меняет DateUpdate непосредственно на той записи в кот мы вносим изменения, а мне надо чтобы Dateupdate менялись во всех записях при изменении любой из них.
Если настаиваете, то годится Ваш UPDATE, только добавьте
WHERE NOT EXISTS(SELECT DateUpdate INTERSECT SELECT CURRENT_TIMESTAMP);
26 ноя 12, 15:24    [13530207]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Я не настаиваю, этот вариант

CREATE TRIGGER UpdTrig
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

exec UpdateFirst

END


меня поставил в тупик пока что) Куда добавить условие? в новопредложенный вариант или в мою старую процедурку?
26 ноя 12, 16:08    [13530719]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ReZonance
Я не настаиваю, этот вариант

CREATE TRIGGER UpdTrig
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

exec UpdateFirst

END


меня поставил в тупик пока что) Куда добавить условие? в новопредложенный вариант или в мою старую процедурку?
Выбросить EXEC, вписать UPDATE.
Что тут непонятного?
Зачем лишняя процедура?
26 ноя 12, 16:16    [13530806]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
На Intersect ругается

Incorrect syntax near the keyword 'INTERSECT'.
26 ноя 12, 16:17    [13530818]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ReZonance
На Intersect ругается

Incorrect syntax near the keyword 'INTERSECT'.
Версия 2000-я что ли? Сразу говорить надо!
WHERE DateUpdate IS NULL OR DateUpdate<>CURRENT_TIMESTAMP;
26 ноя 12, 16:21    [13530850]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Да, 2000. Извините.

CREATE TRIGGER UpdTrig
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

UPDATE [NIPI\IT09].[Vakansee] SET DateUpdate=GetDate() 
WHERE DateUpdate IS NULL OR DateUpdate<>CURRENT_TIMESTAMP;

END

Я правильно понимаю?
26 ноя 12, 16:27    [13530916]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
Glory
Member

Откуда:
Сообщений: 104751
ReZonance
Я правильно понимаю?

trew привел вам правильный текст триггера
26 ноя 12, 16:48    [13531106]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
ReZonance
Да, 2000. Извините.

CREATE TRIGGER UpdTrig
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

UPDATE [NIPI\IT09].[Vakansee] SET DateUpdate=GetDate() 
WHERE DateUpdate IS NULL OR DateUpdate<>CURRENT_TIMESTAMP;

END

Я правильно понимаю?
GETDATE() == CURRENT_TIMESTAMP (это одно и то же, но CURRENT_TIMESTAMP - стандарт ANSI)

Glory, он же хочет каждый раз апдейтить прямо всю таблицу! Представляете?
26 ноя 12, 17:21    [13531391]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Вынужден был отсутствовать неделю, не закончив эту работу.

автор
Glory, он же хочет каждый раз апдейтить прямо всю таблицу! Представляете?

Я всего лишь пишу сюда потому что нуб в скл, и нуждаюсь в вашей помощи. Тот триггер не дееспособен, и я не совсем понимаю почему, поэтому спрашиваю у вас, что там не так?
3 дек 12, 07:07    [13566263]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
ReZonance
На Intersect ругается

Incorrect syntax near the keyword 'INTERSECT'.
Версия 2000-я что ли? Сразу говорить надо!
WHERE DateUpdate IS NULL OR DateUpdate<>CURRENT_TIMESTAMP;

Это для защиты от рекурсии? Но ведь до следующего шага рекурсии может пройти несколько миллисекунд, и тогда CURRENT_TIMESTAMP изменится?
3 дек 12, 09:48    [13566693]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
Glory
Member

Откуда:
Сообщений: 104751
ReZonance
Тот триггер не дееспособен, и я не совсем понимаю почему, поэтому спрашиваю у вас, что там не так?

Наверное потому, что у других триггер "дееспособен"
3 дек 12, 10:31    [13566886]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Правда? Вы проверяли? При изменении любой записи меняется дата асболютно во всех строках бд?
3 дек 12, 14:44    [13568687]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
Gwa
Guest
ReZonance,
если дата меняется во всей таблице, то нет смысла хранить ее там.
Вынесите её в другую (м.б. специальную) таблицу.
3 дек 12, 14:48    [13568735]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Спасибо, да, в этом есть смысл. Вообщем я сделал одну ерунду, вот такую:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [UpdTrig]
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

INSERT INTO [NIPI\IT09].Systdate(DateUpdate) VALUES (getdate())

END


так он заполняет значениями, но так база будет переполняться, не подскажете как мне перед вставкой реализовать удаление предыдущих записей? ВРоде DELETE from [NIPI\IT09].Systdate(DateUpdate)
3 дек 12, 15:57    [13569334]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
Все, понял сам, нужно апдейтить по ид:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go




ALTER TRIGGER [UpdTrig]
ON [NIPI\IT09].[Vakansee]
AFTER update
AS
BEGIN

UPDATE [NIPI\IT09].Systdate SET DateUpdate=getdate() WHERE id_date=17

END


Все работает, всем спасибо за участие
4 дек 12, 08:04    [13572479]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
извините, долгое время это решение работало, но после изменения первичного ключа перестал срабатывать триггер после обновления таблицы. То есть после обновления таблицы, не срабатывает триггер. Помогите пожалуйста понять, что произошло?
31 янв 13, 07:37    [13854373]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ReZonance
после обновления таблицы, не срабатывает триггер

Триггер у вас включен вообще?
select name, ObjectProperty(id, 'ExecIsTriggerDisabled')
from sysobjects
where name = 'UpdTrig' and type = 'TR'
31 янв 13, 09:32    [13854688]     Ответить | Цитировать Сообщить модератору
 Re: Вывод даты при изменении полей  [new]
ReZonance
Member

Откуда:
Сообщений: 42
ну ваш запрос выполнился, вывел 2 колонки
name - UpdTrig и
No column name - 0
31 янв 13, 09:53    [13854764]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить