Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何编写基于在另一个表中执行的操作更新表的触发器?_Sql_Database_Triggers_Db2 - Fatal编程技术网

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()中插入值()--不知道最后会发生什么