Я пытаюсь создать триггер, который будет вставлять записи в таблицу OH_PONUMBER_AUDIT
на основе обновления столбца PONUMBER
в таблице REPORDER
, но я не знаю, как вставлять записи, используя новые и старые значения столбцов в SQL Server.
У меня есть триггер, подобный этому в DB2, поэтому я предполагаю, что функциональность должна существовать в SQL Server.
Заранее спасибо
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [DBO].[PONUMBER_AUDIT]
ON [DBO].[REPORDER]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE (PONUMBER)
BEGIN
INSERT INTO [DBO].[OH_PONUMBER_AUDIT]
([ORDERNUM]
,[USER_WHO_CHANGED]
,[DATE_CHANGED]
,[FIELD_CHARGED]
,[OLD_VALUE]
,[NEW_VALUE])
SELECT
ORDERNUM, SESSION_USER, GETDATE(), 'PONUMBER', O.PONUMBER, N.PONUMBER
FROM
[TFW].[DBO].[REPORDER];
END
END
2 ответа
Вам необходимо использовать псевдо таблицы INSERTED
и DELETED
:
CREATE TRIGGER [DBO].[PONUMBER_AUDIT]
ON [DBO].[REPORDER]
AFTER UPDATE
AS BEGIN
SET NOCOUNT ON;
IF UPDATE (PONUMBER)
BEGIN
INSERT INTO [DBO].[OH_PONUMBER_AUDIT]
([ORDERNUM]
,[USER_WHO_CHANGED]
,[DATE_CHANGED]
,[FIELD_CHARGED]
,[OLD_VALUE]
,[NEW_VALUE])
SELECT I.ORDERNUM,
SESSION_USER,
GETDATE(),
'PONUMBER',
D.PONUMBER,
I.PONUMBER
FROM INSERTED I
INNER JOIN DELETED D
ON I.[ORDERNUM] = D.[ORDERNUM];
END
END
Этот код предполагает, что ORDERNUM
является первичным ключом таблицы.
В TRIGGER вы должны использовать таблицы inserted
и deleted
.
Вместо использования: IF UPDATE (PONUMBER)
я бы предложил использовать
IF EXISTS (SELECT 1
FROM inserted
INNER JOIN deleted
ON inserted.<key_field> = deleted.<key_field>
WHERE inserted.PONUMBER <> deleted.PONUMBER)
USE [TFW]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [DBO].[PONUMBER_AUDIT]
ON [DBO].[REPORDER]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE (PONUMBER)
BEGIN
INSERT INTO [DBO].[OH_PONUMBER_AUDIT]
([ORDERNUM]
,[USER_WHO_CHANGED]
,[DATE_CHANGED]
,[FIELD_CHARGED]
,[OLD_VALUE]
,[NEW_VALUE])
SELECT ORDERNUM,
SESSION_USER,
GETDATE(),
'PONUMBER',
O.PONUMBER,
N.PONUMBER
FROM inserted
INNER JOIN deleted
ON inserted.<KEY_FIELD> = deleted.<KEY_FIELD>
WHERE inserted.PONUMBER <> deleted.PONUMBER
END
END
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.