lucene用数据库Trigger同步索引

    触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。

功能:

1、 允许/限制对表的修改

2、 自动生成派生列,比如自增字段

3、 强制数据一致性

4、 提供审计和日志记录

5、 防止无效的事务处理

6、 启用复杂的业务逻辑

 

触发器触发时间有两种:after和before。

1、触发器的语法:

CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

ON表名

[FOR EACH ROW]

BEGIN

    pl/sql语句

END

其中:

触发器名:触发器对象的名称。

由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。

触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行;

after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发器:

insert:数据库插入会触发此触发器;

update:数据库修改会触发此触发器;

delete:数据库删除会触发此触发器。

表 名:数据库触发器所在的表。

each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

 

---------------------------------------------------

2.实例

Create Or Replace Trigger TRIG_kmsDOCUMENT
   After Insert Or Update or Delete On KMS_MANAGER.kmsDOCUMENT
   For Each Row
begin
   case
     when inserting then
       INSERT INTO TRIGKMS_VW$_TEMP
       VALUES
         (TRIGkms_VW$_SEQ.NEXTVAL, :NEW.DOCID, 1, 0);

     when updating then
       INSERT INTO TRIGKMS_VW$_TEMP
       VALUES
         (TRIGkms_VW$_SEQ.NEXTVAL, :NEW.DOCID, 2, 0);
     when deleting then
       INSERT INTO TRIGKMS_VW$_TEMP
       VALUES
         (TRIGkms_VW$_SEQ.NEXTVAL, :OLD.DOCID, 3, 0);
   end case;
end;

 

解释://TRIGkms_VW$_SEQ是一个sequence序列

NEW.DOCID:代表kmsDOCUMENT修改后字段DOCID的值.

OLD.DOCId:代表kmsDOCUMENT修改前字段DOCID的值.

 

 

 

 

----------------------------------------------------

 

 

引入回收站机制。

Create Or Replace Trigger TRIG_kmsDOCUMENT
   After Update of DOCTITLE,docstatus,CRTIME,DOCVALID,DOCAUTHOR,DOCCHANNELPATH_ID,DOCID,REPLYFLAG,DOCCHANNELPATH_NAME,LIFESTATUS,CITYIDS,BRANDIDS,TARGETCUSTOMIDS,WFSTATUS Or Delete On KMS_MANAGER.Kmsdocument
   For Each Row
     
DECLARE
    new_docstatus        number;
      new_value number;
begin
     new_docstatus := :NEW.docstatus;
     new_value:=-1;
            if updating then
          
               if new_docstatus=new_value then
                 begin
                    INSERT INTO TRIGKMS_VW VALUES(TRIGkms_VW$_SEQ.NEXTVAL, :OLD.DOCID, 3, 0,sysdate);
                 end;
              else if :NEW.docstatus<>-10 then
                  begin
                    INSERT INTO TRIGKMS_VW VALUES(TRIGkms_VW$_SEQ.NEXTVAL, :OLD.DOCID, 2, 0,sysdate);
                  end;
              end if;   end if;
            end if;
            if deleting then
             begin
                INSERT INTO TRIGKMS_VW VALUES(TRIGkms_VW$_SEQ.NEXTVAL, :OLD.DOCID, 3, 0,sysdate);
             end;
            end if;
end;