Sql 如何编写基于在另一个表中执行的操作更新表的触发器?
我有一个名为Sql 如何编写基于在另一个表中执行的操作更新表的触发器?,sql,database,triggers,db2,Sql,Database,Triggers,Db2,我有一个名为ORDERITEMS的表 CREATE TABLE DB2ADMIN.ORDERITEMS ( ORDERITEMS_ID BIGINT NOT NULL, STOREENT_ID INTEGER NOT NULL, ORDERS_ID BIGINT NOT NULL, TERMCOND_ID BIGINT, TRADING_ID BIGINT, ITEMSPC_ID BIGINT, CATENTRY_ID BIGINT,
ORDERITEMS
的表
CREATE TABLE DB2ADMIN.ORDERITEMS (
ORDERITEMS_ID BIGINT NOT NULL,
STOREENT_ID INTEGER NOT NULL,
ORDERS_ID BIGINT NOT NULL,
TERMCOND_ID BIGINT,
TRADING_ID BIGINT,
ITEMSPC_ID BIGINT,
CATENTRY_ID BIGINT,
PARTNUM VARCHAR(64)
);
我需要创建一个名为ORDERITEM\u LOG
的新表,该表看起来基本相同,但有两个附加列:
CREATE TABLE DB2ADMIN.ORDERITEM_LOG (
ORDERITEMS_ID BIGINT NOT NULL,
STOREENT_ID INTEGER NOT NULL,
ORDERS_ID BIGINT NOT NULL,
TERMCOND_ID BIGINT,
TRADING_ID BIGINT,
ITEMSPC_ID BIGINT,
CATENTRY_ID BIGINT,
PARTNUM VARCHAR(64),
LOG_ACTION_DATE VARCHAR(254),
LOG_ACTION_TYPE VARCHAR(1)
);
我需要制作一个触发器来监视ORDERITEMS
表。每当在ORDERITEMS
表中插入、删除或更新一行时,都需要对ORDERITEM\U LOG
表执行相同的操作,另外两列填充当前时间戳
,以及'U'
、'D'
或'I'
(取决于所采取的操作),分别
例如,如果我在ORDERITEMS
表中插入一行,我希望看到在ORDERITEM\u LOG
表中插入一个重复的行,时间戳在LOG\u ACTION\u DATE
中,时间戳在LOG\u ACTION\u TYPE
中。然后,如果我要删除ORDERITEMS
中的行,我希望在ORDERITEM\u LOG
表中看到'I'
更新为'D'
,并看到时间戳更新。我希望在ORDERITEMS
表之前更新ORDERITEMS\u日志表
我该如何编写一个触发器来完成我正在寻找的任务?如果我知道您想要快照对表2的更改。好的策略在数据量大的时候会让你头疼。您需要的sql代码如下所示。您可以使用标签插入、删除、更新为所有作业创建一个触发器,也可以单独创建3个触发器。请注意,SQLUPDATE命令会同时触发delete和insert语句
下面的示例使用BulkInsert,并假设日志表存在。如果一次更新几行,没有问题,但如果同时操作这么多行,可能会超时或响应时间过长。为了避免这种情况,您可能更愿意在WHILE语句中使用where子句编写相同的语句,其目标是主键(如where id=XXX)
CREATE TRIGGER [ORDERITEMTRIGGER] ON [ORDERITEMS]
FOR INSERT, UPDATE, DELETE
AS
-- INSERT
set nocount on
insert into ORDERITEM_LOG(
ORDERITEMS_ID,
STOREENT_ID,
ORDERS_ID,
TERMCOND_ID,
TRADING_ID,
ITEMSPC_ID,
CATENTRY_ID,
PARTNUM,
LOG_ACTION_DATE,
LOG_ACTION_TYPE)
select ORDERITEMS_ID,
STOREENT_ID,
ORDERS_ID,
TERMCOND_ID,
TRADING_ID,
ITEMSPC_ID,
CATENTRY_ID,
PARTNUM,
getdate(),'I' from inserted
-- DELETE (this triggers on delete and update because sql update has 2 phase delete and insert)
insert into ORDERITEM_LOG(
ORDERITEMS_ID,
STOREENT_ID,
ORDERS_ID,
TERMCOND_ID,
TRADING_ID,
ITEMSPC_ID,
CATENTRY_ID,
PARTNUM,
LOG_ACTION_DATE,
LOG_ACTION_TYPE)
select ORDERITEMS_ID,
STOREENT_ID,
ORDERS_ID,
TERMCOND_ID,
TRADING_ID,
ITEMSPC_ID,
CATENTRY_ID,
PARTNUM,
getdate(),'D' from deleted
-- UPDATE
set nocount on
insert into ORDERITEM_LOG(
ORDERITEMS_ID,
STOREENT_ID,
ORDERS_ID,
TERMCOND_ID,
TRADING_ID,
ITEMSPC_ID,
CATENTRY_ID,
PARTNUM,
LOG_ACTION_DATE,
LOG_ACTION_TYPE)
select ORDERITEMS_ID,
STOREENT_ID,
ORDERS_ID,
TERMCOND_ID,
TRADING_ID,
ITEMSPC_ID,
CATENTRY_ID,
PARTNUM,
getdate(),'U' from inserted
set nocount off
触发器的类型
触发器有两种类型。在触发器之后和而不是触发器。您必须使用After触发器
1) 后触发器
这些触发器在执行插入、更新或删除等操作后执行
您必须在触发后使用,如下所示
插入后的
CREATE TRIGGER [dbo].[Customer_INSERT]
ON [dbo].[Customers]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @OrderItemsID;
DECLARE @StroreentID;
DECLARE @OrdersID;
DECLARE @TermCondID;
DECLARE @TradingID ;
DECLARE @ItemSPCID;
DECLARE @CatentryID;
DECLARE @Partnum;
DECLARE @SysDateTime datetime = SYSDATETIME();
DECLARE @LogActionType VARCHAR(1);
SELECT @OrderItemsID = INSERTED.ORDERITEMS_ID;
SELECT @StroreentID = INSERTED.STOREENT_ID;
SELECT @OrdersID = INSERTED.ORDERS_ID;
SELECT @TermCondID = INSERTED.TERMCOND_ID;
SELECT @TradingID = INSERTED.TRADING_ID;
SELECT @ItemSPCID = INSERTED.ITEMSPC_ID;
SELECT @CatentryID = INSERTED.CATENTRY_ID;
SELECT @Partnum = INSERTED.PARTNUM;
@LogActionType = "1";
FROM INSERTED
INSERT INTO ORDERITEM_LOG
VALUES (@OrderItemsID, @StroreentID, @OrdersID, @TermCondID, @TradingID, @ItemSPCID, @CatentryID, Partnum, LogActionType, @LogActionType)
END
更新后
CREATE TRIGGER [dbo].[Customer_INSERT]
ON [dbo].[Customers]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @OrderItemsID;
DECLARE @StroreentID;
DECLARE @OrdersID;
DECLARE @TermCondID;
DECLARE @TradingID ;
DECLARE @ItemSPCID;
DECLARE @CatentryID;
DECLARE @Partnum;
DECLARE @SysDateTime datetime = SYSDATETIME();
DECLARE @LogActionType VARCHAR(1);
SELECT @OrderItemsID = INSERTED.ORDERITEMS_ID;
SELECT @StroreentID = INSERTED.STOREENT_ID;
SELECT @OrdersID = INSERTED.ORDERS_ID;
SELECT @TermCondID = INSERTED.TERMCOND_ID;
SELECT @TradingID = INSERTED.TRADING_ID;
SELECT @ItemSPCID = INSERTED.ITEMSPC_ID;
SELECT @CatentryID = INSERTED.CATENTRY_ID;
SELECT @Partnum = INSERTED.PARTNUM;
@LogActionType = "1";
FROM INSERTED
INSERT INTO ORDERITEM_LOG
VALUES(@OrderItemsID, @StroreentID,@OrdersID,@TermCondID,@TradingID,@ItemSPCID,@CatentryID,Partnum,LogActionType, @LogActionType)
END
删除后
CREATE TRIGGER [dbo].[Customer_INSERT]
ON [dbo].[Customers]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @OrderItemsID;
DECLARE @StroreentID;
DECLARE @OrdersID;
DECLARE @TermCondID;
DECLARE @TradingID ;
DECLARE @ItemSPCID;
DECLARE @CatentryID;
DECLARE @Partnum;
DECLARE @SysDateTime datetime = SYSDATETIME();
DECLARE @LogActionType VARCHAR(1);
SET @LogActionType = "1";
SELECT @OrderItemsID = DELETED.ORDERITEMS_ID;
SELECT @StroreentID = DELETED.STOREENT_ID;
SELECT @OrdersID = DELETED.ORDERS_ID;
SELECT @TermCondID = DELETED.TERMCOND_ID;
SELECT @TradingID = DELETED.TRADING_ID;
SELECT @ItemSPCID = DELETED.ITEMSPC_ID;
SELECT @CatentryID = DELETED.CATENTRY_ID;
SELECT @Partnum = DELETED.PARTNUM;
INSERT INTO ORDERITEM_LOG
VALUES(@OrderItemsID, @StroreentID,@OrdersID,@TermCondID,@TradingID,@ItemSPCID,@CatentryID,Partnum,LogActionType, @LogActionType)
END
您看过手册中的触发器示例了吗?你试过写一些代码吗?你有什么特别的困难吗?是的,我试着只为插入编写一些代码,但我不确定该去哪里。在插入每个FOR BEGIN的ORDERITEMS之前创建触发器OI_LOG_触发器???在ORDERITEM_LOG()中插入值()--不知道最后会发生什么