powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Триггер. Предыдущее и Текущее значение
20 сообщений из 20, страница 1 из 1
Триггер. Предыдущее и Текущее значение
    #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
Триггер. Предыдущее и Текущее значение
    #39641230
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Триггер. Предыдущее и Текущее значение
    #39641231
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelRemmПишу триггер который должен при изменении поля [User_id] в таблице Documents делал запись в таблицу DocumentsLogs.
PavelRemm CREATE TRIGGER DocumentTransfer
ON Documents
BEFORE UPDATE
То, что запрошено обновление, ещё не означает, что оно будет выполнено. А Вы вслепую уже хотите зафиксировать факт его выполнения. Ошибка.
...
Рейтинг: 0 / 0
Триггер. Предыдущее и Текущее значение
    #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
Триггер. Предыдущее и Текущее значение
    #39641235
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Триггер. Предыдущее и Текущее значение
    #39641236
PavelRemm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iiyamaPavelRemm,

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

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

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

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

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

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

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

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

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

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

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


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