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

Откуда:
Сообщений: 16
Есть 3 таблицы:
Users([id] int, [name] varchar),
Documents([id] int, [User_id] int),
DocumentsLogs(int[Document_id], [Action] varchar)

Пишу триггер который должен при изменении поля [User_id] в таблице Documents делал запись в таблицу DocumentsLogs.
В поле [Action] должна попасть запись такого формата:
[имя пользователя (старое значение)] + "передал документ" + [имя пользователя (новое значение)] + дата-время.


CREATE TRIGGER DocumentTransfer
ON Documents
BEFORE UPDATE
AS
SET NOCOUNT ON
IF UPDATE(User_id)
INSERT INTO DocumentsLogs (Document_id, Action)
SELECT ID, ???????????
FROM INSERTED



Помогите дописать пожалуйста.
7 май 18, 09:58    [21392128]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
PavelRemm,

автор
BEFORE UPDATE

чудно
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017
7 май 18, 10:06    [21392147]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
PavelRemm
Пишу триггер который должен при изменении поля [User_id] в таблице Documents делал запись в таблицу DocumentsLogs.

PavelRemm
CREATE TRIGGER DocumentTransfer
ON Documents
BEFORE UPDATE
То, что запрошено обновление, ещё не означает, что оно будет выполнено. А Вы вслепую уже хотите зафиксировать факт его выполнения. Ошибка.
7 май 18, 10:07    [21392149]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
aleks222
Member

Откуда:
Сообщений: 985
CREATE TRIGGER DocumentTransfer
ON Documents
BEFORE UPDATE
AS
SET NOCOUNT ON

with x as ( select i.Document_id, OldUserid = d.USERID, NewUserid = i.USERID from deleted as d inner join inserted as i on d.Document_id = i.Document_id where d.USERID <> i.USERID )
  insert dbo.DocumentsLogs (Document_id, Action)
      select  Document_id, cast( OldUserid as nvarchar(16) ) + N' передал документ ' + cast( NewUserid as nvarchar(16) ) + N' ' + convert( nvarchar(64), getdate(), 102). 
        from x;
7 май 18, 10:12    [21392164]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
iiyama
Member

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

можно другой вариант предложить?
7 май 18, 10:12    [21392167]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
PavelRemm
Member

Откуда:
Сообщений: 16
iiyama
PavelRemm,

можно другой вариант предложить?


Конечно можно, я в процессе обучения, мне все полезно.
7 май 18, 10:19    [21392192]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
iap
Member

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

расскажите про BEFORE UPDATE, пожалуйста. :))
7 май 18, 10:20    [21392196]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
PavelRemm
Member

Откуда:
Сообщений: 16
Akina
То, что запрошено обновление, ещё не означает, что оно будет выполнено. А Вы вслепую уже хотите зафиксировать факт его выполнения. Ошибка.


Как поправить?
7 май 18, 10:23    [21392206]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
iiyama
можно другой вариант предложить?

Жара! Первое вменяемое дополнение после LEAD/LAG и OVER ( ORDER BY ... ROWS )
7 май 18, 10:26    [21392214]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27753
PavelRemm,

английский у Вас тоже в процессе обучения?

Вам намекают на то, что наде не BEFORE, а AFTER UPDATE делать то, что Вы хотите.
7 май 18, 10:27    [21392216]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
aleksrov
Member

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

:) Ну это как в Oracle, только было лень переписывать под SQL.
7 май 18, 10:27    [21392217]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
PavelRemm
Member

Откуда:
Сообщений: 16
aleks222,
Если я правильно понял то вы в итоговую строку вставляете [user_id] int приведенный к varchar.
А нужно по этому id получить name из таблицы Users, и уже его вставлять в итоговую строку.
7 май 18, 10:29    [21392226]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
PavelRemm
Member

Откуда:
Сообщений: 16
Про AFTER UPDATE до меня дошло, спасибо.
Но у меня основанные трудности возникают при формулировке таких "многоэтажных запросов" с участием нескольких таблиц.
Поэтому прошу, если кому-то не лень....
7 май 18, 10:43    [21392284]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
aleks222
Member

Откуда:
Сообщений: 985
iap
aleks222,

расскажите про BEFORE UPDATE, пожалуйста. :))

Мне лень было заголовок править - я его не читал.
7 май 18, 11:14    [21392412]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
aleks222
Member

Откуда:
Сообщений: 985
PavelRemm
aleks222,
Если я правильно понял то вы в итоговую строку вставляете [user_id] int приведенный к varchar.
А нужно по этому id получить name из таблицы Users, и уже его вставлять в итоговую строку.


Ну... сделай это сам.
7 май 18, 11:15    [21392415]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
PavelRemm
Member

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

если бы я мог, я бы сюда не писал...
7 май 18, 11:25    [21392444]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
PavelRemm
Member

Откуда:
Сообщений: 16

CREATE TRIGGER DocumentTransfer
ON Documents
AFTER UPDATE
AS
SET NOCOUNT ON
IF UPDATE(WhoHasOriginal)
INSERT INTO DocumentsLogs (DocumentID, Action)
SELECT ID FROM INSERTED,
SELECT Name FROM [Users] WHERE Users.ID = deleted.ID
+ N' передал(а) документ '
+ SELECT Name FROM [Users] WHERE Users.ID = inserted.ID
+ convert(varchar, getdate(), 105) + ' | ' + convert(varchar, getdate(), 108)


ну вот что ему не так??

Error:
Incorrect syntax near the keyword 'SELECT'.
Incorrect syntax near the keyword 'SELECT'.
7 май 18, 11:40    [21392508]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
iap
Member

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

Что это за два SELECTа через запятую?!
7 май 18, 11:46    [21392539]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
PavelRemm

CREATE TRIGGER DocumentTransfer
ON Documents
AFTER UPDATE
AS
SET NOCOUNT ON
IF UPDATE(WhoHasOriginal)
INSERT INTO DocumentsLogs (DocumentID, Action)
SELECT ID FROM INSERTED,
SELECT Name FROM [Users] WHERE Users.ID = deleted.ID
+ N' передал(а) документ '
+ SELECT Name FROM [Users] WHERE Users.ID = inserted.ID
+ convert(varchar, getdate(), 105) + ' | ' + convert(varchar, getdate(), 108)


ну вот что ему не так??

Error:
Incorrect syntax near the keyword 'SELECT'.
Incorrect syntax near the keyword 'SELECT'.


да не говори, с жиру бесится
7 май 18, 11:47    [21392546]     Ответить | Цитировать Сообщить модератору
 Re: Триггер. Предыдущее и Текущее значение  [new]
aleksrov
Member

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

Взято из безкрайних просторов стака при первой же ссылке из гугла, вроде пока не забанен, хотя утром гнал.

CREATE TRIGGER trgEmployeeUpdate
ON dbo.Employees AFTER UPDATE
AS 
   INSERT INTO dbo.LogTable(ID, OldValue, NewValue)
      SELECT i.ID, d.Name, i.Name
      FROM Inserted i
      INNER JOIN Deleted d ON i.ID = d.ID


Если логика понятна, то дополнить и изменить я думаю уже не трудно будет.
7 май 18, 11:59    [21392597]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить