Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер. Предыдущее и Текущее значение / 20 сообщений из 20, страница 1 из 1
07.05.2018, 09:58
    #39641228
PavelRemm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
Есть 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



Помогите дописать пожалуйста.
...
Рейтинг: 0 / 0
07.05.2018, 10:06
    #39641230
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
...
Рейтинг: 0 / 0
07.05.2018, 10:07
    #39641231
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
PavelRemmПишу триггер который должен при изменении поля [User_id] в таблице Documents делал запись в таблицу DocumentsLogs.
PavelRemm CREATE TRIGGER DocumentTransfer
ON Documents
BEFORE UPDATE
То, что запрошено обновление, ещё не означает, что оно будет выполнено. А Вы вслепую уже хотите зафиксировать факт его выполнения. Ошибка.
...
Рейтинг: 0 / 0
07.05.2018, 10:12
    #39641234
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
...
Рейтинг: 0 / 0
07.05.2018, 10:12
    #39641235
iiyama
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
...
Рейтинг: 0 / 0
07.05.2018, 10:19
    #39641236
PavelRemm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
iiyamaPavelRemm,

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

Конечно можно, я в процессе обучения, мне все полезно.
...
Рейтинг: 0 / 0
07.05.2018, 10:20
    #39641237
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
aleks222,

расскажите про BEFORE UPDATE, пожалуйста. :))
...
Рейтинг: 0 / 0
07.05.2018, 10:23
    #39641238
PavelRemm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
AkinaТо, что запрошено обновление, ещё не означает, что оно будет выполнено. А Вы вслепую уже хотите зафиксировать факт его выполнения. Ошибка.

Как поправить?
...
Рейтинг: 0 / 0
07.05.2018, 10:26
    #39641241
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
iiyama можно другой вариант предложить?
Жара! Первое вменяемое дополнение после LEAD/LAG и OVER ( ORDER BY ... ROWS )
...
Рейтинг: 0 / 0
07.05.2018, 10:27
    #39641242
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
PavelRemm,

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

Вам намекают на то, что наде не BEFORE, а AFTER UPDATE делать то, что Вы хотите.
...
Рейтинг: 0 / 0
07.05.2018, 10:27
    #39641243
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
iap,

:) Ну это как в Oracle, только было лень переписывать под SQL.
...
Рейтинг: 0 / 0
07.05.2018, 10:29
    #39641244
PavelRemm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
aleks222,
Если я правильно понял то вы в итоговую строку вставляете [user_id] int приведенный к varchar.
А нужно по этому id получить name из таблицы Users, и уже его вставлять в итоговую строку.
...
Рейтинг: 0 / 0
07.05.2018, 10:43
    #39641255
PavelRemm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
Про AFTER UPDATE до меня дошло, спасибо.
Но у меня основанные трудности возникают при формулировке таких "многоэтажных запросов" с участием нескольких таблиц.
Поэтому прошу, если кому-то не лень....
...
Рейтинг: 0 / 0
07.05.2018, 11:14
    #39641275
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
iapaleks222,

расскажите про BEFORE UPDATE, пожалуйста. :))
Мне лень было заголовок править - я его не читал.
...
Рейтинг: 0 / 0
07.05.2018, 11:15
    #39641276
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
PavelRemmaleks222,
Если я правильно понял то вы в итоговую строку вставляете [user_id] int приведенный к varchar.
А нужно по этому id получить name из таблицы Users, и уже его вставлять в итоговую строку.

Ну... сделай это сам.
...
Рейтинг: 0 / 0
07.05.2018, 11:25
    #39641284
PavelRemm
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
aleks222,

если бы я мог, я бы сюда не писал...
...
Рейтинг: 0 / 0
07.05.2018, 11:40
    #39641298
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'.
...
Рейтинг: 0 / 0
07.05.2018, 11:46
    #39641304
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
PavelRemm,

Что это за два SELECTа через запятую?!
...
Рейтинг: 0 / 0
07.05.2018, 11:47
    #39641306
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
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'.

да не говори, с жиру бесится
...
Рейтинг: 0 / 0
07.05.2018, 11:59
    #39641318
aleksrov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер. Предыдущее и Текущее значение
PavelRemm,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
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



Если логика понятна, то дополнить и изменить я думаю уже не трудно будет.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер. Предыдущее и Текущее значение / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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