Flower@12 Ответов: 1

Как написать триггер для обновления таблицы значений в SQL Server 2005 с


Я использую Sql Server 2005.Мне нужно написать триггер для таблицы sql перед обновлением таблицы.у меня есть две таблицы: одна-tblEmpDetail, а другая-tblEmpHistoryDetail .
В таблице есть поля
я)tblEmpDetail :-
ID числовой(18) автоинкремент,
EmpName nvarchar(50),
Dob datetime
ii)tblEmpHistoryDetail
ID numeric(18) AutoIncrement,
MasterID numeric(18),
EmpName nvarchar(20),
Dob datetime

как создать триггер для Перед обновлением

Что я уже пробовал:

Мой код триггера является
CREATE TRIGGER trgrBeforeUpdate on tblEmpDetail 
For Update
 declare @MasterID numeric(18)
 declare @EmpName nvarchar(50);
 declare @Dob Datetime;

select @MasterID=i.ID from inserted i;
select @EmpName =i.EmpName from inserted i;
select @Dob =i.Dob from inserted i;
	INSERT INTO tblEmpHistoryDetail 
         (MasterID,EmpName,Dob)
        Values
        (@MasterID,@EmpName,@Dob)
	PRINT 'BEFORE UPDATE trigger fired.'

Santosh kumar Pithani

Нет необходимости использовать триггеры, вместо этого используйте output clau..

Создать триггер trgrBeforeUpdate на tblEmpDetail
для обновлений
АС
---Вновь вставленное значение
ВСТАВИТЬ В
tblEmpHistoryDetail (MasterID,EmpName,Dob)
выберите ID,EmpName,Dob из inserted;
---Удалено старое значение
ВСТАВИТЬ В
tblEmpHistoryDetail (MasterID,EmpName,Dob)
выберите ID,EmpName,Dob из списка удаленных;

CHill60

OP четко заявил, что это относится к SQL 2005. Предложение output было введено в SQL 2008 - Предложение вывода (Transact-SQL) - SQL Server | Microsoft Docs[^]

Santosh kumar Pithani

Да chill60,ваше право, я обновлю свое решение..Поблагодарить у так много

CHill60

Ты не можешь. Чего вы на самом деле пытаетесь достичь? Вы можете сравнить удаленные и вставленные таблицы в триггере обновления (после), если хотите знать, что изменилось. Но код, который у вас сейчас есть, все равно потребует триггера после обновления

1 Ответов

Рейтинг:
0

Richard Deeming

При написании триггера необходимо помнить, что inserted и updated виртуальные таблицы могут содержать несколько строк. Как бы то ни было, ваш триггер будет регистрировать только детали последней строки, обновленной каждым из них. UPDATE заявление.

Распространенные ошибки SQL Server – многорядные триггеры DML - SQLServerCentral[^]

Основываясь на вашем описании, я подозреваю, что вы хотите записать старые значения столбцов из вашего триггера. Вам не нужен триггер, чтобы запустить его до того, как UPDATE заявление, чтобы сделать это; вам просто нужно использовать deleted вместо этого виртуальный стол.

Использование вставленных и удаленных таблиц - SQL Server | Microsoft Docs[^]
(В этой документации говорится "начиная с SQL 2008", но это неверно. Эта информация относится, по крайней мере, к SQL 2000; просто 2008-это самая ранняя версия, которая все еще поддерживается.)

CREATE TRIGGER trgrBeforeUpdate 
ON tblEmpDetail 
AFTER UPDATE
As
BEGIN
    SET NOCOUNT ON;
    
    INSERT INTO tblEmpHistoryDetail (MasterID, EmpName, Dob)
    SELECT MasterID, EmpName, Dob
    FROM deleted;
END;


Если ты действительно если вам нужен триггер, который срабатывает до обновления таблицы, то вам нужно будет использовать в триггер[^]. Триггер также будет отвечать за обновление исходной таблицы.

Стоит отметить, что поддержка SQL 2005 завершилась в апреле 2016 года, а поддержка SQL 2008 и 2008 R2 завершится в июле. Если это вообще возможно, вы должны стремиться перейти на поддерживаемую версию - тем более что версии Windows, на которых работает 2005/2008/2008R2, вероятно, также не будут поддерживаться.


Maciej Los

О, нет! Еще 5!