powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / То ли лыжи не едут... Совпадение имен полей
5 сообщений из 5, страница 1 из 1
То ли лыжи не едут... Совпадение имен полей
    #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
То ли лыжи не едут... Совпадение имен полей
    #32006113
попробуй так

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

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

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

Это очень распространненая ошибка - люди подсознательно полагают,
что inserted/deleted содержат одну запись - а они как всякие таблицы
могут и сто тысяч записей содержать - в том числе с разными значениями
PersonID.
...
Рейтинг: 0 / 0
То ли лыжи не едут... Совпадение имен полей
    #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
То ли лыжи не едут... Совпадение имен полей
    #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
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / То ли лыжи не едут... Совпадение имен полей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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