Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / То ли лыжи не едут... Совпадение имен полей / 5 сообщений из 5, страница 1 из 1
23.05.2001, 18:04
    #32006111
Alexandr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли лыжи не едут... Совпадение имен полей
Триггер следующего содержания нормальному перевариванию SQLом не подлежит:

CREATE TRIGGER udClients ON [dbo].[Clients]
FOR UPDATE
AS
IF (UPDATE(PersonID) AND (PersonID IS NULL)) BEGIN
INSERT INTO ClientsHistory
(ClientID, PersonID, ActionDate, ActionID,Result,ActionPersonID)
VALUES
(Inserted.ClientID, PersonID, GETDATE(), 2, 'OK', 31)
END

Ругается он, судя по всему, из-за того, что поля двух таблиц ClientsHistory и Clients
совпадают... И как с ним управиться? Не поля же переименовывать...
...
Рейтинг: 0 / 0
23.05.2001, 18:55
    #32006113
То ли лыжи не едут... Совпадение имен полей
попробуй так

INSERT INTO ClientsHistory
__(ClientID, PersonID, ActionDate, ActionID,Result,ActionPersonID)
SELECT
__ClientID, PersonID, GETDATE(), 2, 'OK', 31
FROM
__inserted
...
Рейтинг: 0 / 0
23.05.2001, 19:01
    #32006114
Alexander Chepack
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли лыжи не едут... Совпадение имен полей
А у меня вот эта строчка опасения вызывает:

IF (UPDATE(PersonID) AND (PersonID IS NULL))

А что будет, если пользователь одним оператором UPDATE
обновит не ОДНУ запись, а НЕСКОЛЬКО - вы из какой записи
значение PersonID для проверки на NULL/NOT NULL брать
будете?

Это очень распространненая ошибка - люди подсознательно полагают,
что inserted/deleted содержат одну запись - а они как всякие таблицы
могут и сто тысяч записей содержать - в том числе с разными значениями
PersonID.
...
Рейтинг: 0 / 0
23.05.2001, 22:42
    #32006116
REX_X
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли лыжи не едут... Совпадение имен полей
Если одной транзакцией апдйтится _только_одна_ запись то все прекрасно работает (SELECT использовать надо.):

CREATE TRIGGER udClients ON [dbo].[Clients]
FOR UPDATE
AS
IF (UPDATE(PersonID) AND (SELECT PersonID FROM INSERTED) IS NULL))
BEGIN
INSERT INTO ClientsHistory
(ClientID, PersonID, ActionDate, ActionID,Result,ActionPersonID)
SELECT
ClientID, PersonID, GETDATE(), 2, 'OK', 31 FROM INSERTED
END

Если, как говорит Alexander Chepack у тебя несколько значений апдэйтится, то тогда это сойдет:

CREATE TRIGGER udClients ON [dbo].[Clients]
FOR UPDATE
AS
IF UPDATE(PersonID)
BEGIN
INSERT INTO ClientsHistory
(ClientID, PersonID, ActionDate, ActionID,Result,ActionPersonID)
SELECT
ClientID, PersonID, GETDATE(), 2, 'OK', 31 FROM INSERTED WHERE PersonID IS NULL
END
...
Рейтинг: 0 / 0
24.05.2001, 20:30
    #32006220
Fompro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
То ли лыжи не едут... Совпадение имен полей
2Alexandr. Вопрос: Что проверяется - внесение нового зн-ния вместо NULL, или обNULLение существующего? Если последнее , то вариант REX_X, если же нет (что кажется более разумным, иначе м.б. писать NULL в SELECTе), то JOIN с DELETED по РК (ClientId)
INSERT ...
SELECT I.ClientID, I.PersonID, GETDATE(), 2, 'OK', 31 FROM INSERTED AS I JOIN DELETED AS D ON (I.ClientID=D.ClientID) WHERE D.PersonID IS NULL
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / То ли лыжи не едут... Совпадение имен полей / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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