PLSQL 触发器

触发器权限java

数据库建立用户时想要在本用户下使用触发器,须要给用户触发器的权限sql

使用DBA用户执行  GRANT CREATE TRIGGER TO user_name;数据库

若是想在当前用户下建立其余用户的触发器须要具备CREATE ANY TRIGGER的权限日志

若是要建立的触发器做用在数据库上的好比对start或者shutdown事件触发,则须要具备ADMINISTER DATABASE TRIGGER系统权限。对象

 

触发器的建立:blog

1.标准触发器的建立事件

CREATE TRIGGER tirgger_nameio

BEFORE/AFTER DELETE[UPDATE INSERT SHUTDOWN]编译

ON object_nametable

trigger_sql_body;

Create trigger 表示建立触发器,随后是触发器的名字,before和after表示触发的时机,在以后是触发的事件如delete update等,使用on关键字说明触发器的操做对象,该对象能够是表或者数据库DATABASE,最后是触发器的主体代码逻辑。

实例:

CREATE TRIGGER delete_trigger--建立名为delete_trigger的触发器

BEFORE DELETE ON emp-- 以前操做,操做表emp

FOR EACH ROW --说明触发器对操做的涉及每一行都激发触发器行为

  BEGIN  

    dbms_output.put_line('触发器执行成功,正在删除');

  END;

2.建立基于JAVA的触发器:

建立触发器的执行部分使用java代码实现

public class  InsertTrigger

{

public static void insertDate() throws Exception

{

Connection conn = JDBCConnection.defaultConnection();

Statement stm = conn.CreateStatement();

stm.execute(" INSERT INTO table_name VALUES(ID1,ID2,'inserting') ");

stm.close();

return;

}

}

而后建立一个存储过程去包含java代码

CREATE OR REPLACE PROCEDURE record_insert_trigger() --过程建立

IS

 LANGUAGE JAVA --语言

 NAME 'InsertTrigger.insertDate()'--调用java类 类名.方法名

最后建立触发器调用

CREATE OR REPLACE TRIGGER record_insert_trigger_data

BEFORE INSERT ON emp

FOR EACH ROW

  BEGIN

    CALL record_insert_trigger();

  END;

 

触发器的分类

1.基于DML操做的触发器

  这类触发器是在当用户对一个表进行insert delete update 操做时触发行为的。

  在对表进行触发行为的时候使用for each row激发表中涉及的每行数据

 该类触发器语法:

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER INSERT[DELETE UPDATE ]

ON table_name

FOR EACH ROW[WHEN cond]

BEGIN sql_body END;

--这里须要说下[WHEN cond] 这个是限制条件,行级条件限制,当达到每种条件是在执行触发器举例说明

When(old.name in hello world)当oldname是 hello world是执行触发条件

2.基于DDL操做的触发器,语法

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER CREATE[DROP ALTER]--建立,删除修改

ON database_name [WHEN cond]

Sql_body;

此类触发器的典型应用,当建立修改删除数据库表的时候在以前或者以后记录该用户的操做信息,以做为用户操做日志。

 

3.基于数据库级操做的触发器

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER START[SHUTDOWM,LOGON,LOGOFF]--数据库、日志启动关闭

ON database_name [WHEN cond]

Sql_body;

 

触发器中的新值和旧值

建立基于DML的触发器时,因为操做对象是表,因此有一个可选项即for each row

以实现对每一行都激发触发器行为,Oracle提供2个临时表来访问每行中的新值和旧值即  :new 和 :old。下面举例说明下:

先建立update触发器

CREATE OR REPLACE TRIGGER update_trigger

AFTER UPDATE ON table_name

FOR EACH ROW

  BEGIN

    dbms_output.put_line('旧值:='||:OLD.CHARS);

    dbms_output.put_line('新值:='||:NEW.CHARS);

  END;

查询table_name表,查询结果

 

而后执行update操做

UPDATE table_name SET chars='newvalue';

查看输出日志

 

证实触发器执行成功,在查看table_name表数据已变动。

 

审核触发器的建立

顾名思义,就是当用户操做一个重要的表时,如插入数据和更新数据,但愿记录该用户的用户名和更改时间等信息,以备审核时用。建立审核触发器前,咱们须要建立一个表,记录审核信息

实例:

--建立审核表

CREATE TABLE user_modify

(

user_name VARCHAR2(20),

modify_time DATE,

modify_content VARCHAR2(20)

);

--建立触发器

CREATE OR REPLACE TRIGGER user_change

BEFORE UPDATE OR INSERT ON emp

FOR EACH ROW

  BEGIN

    IF inserting THEN 

      INSERT INTO user_modify

      VALUES(USER,SYSDATE,'updating');

    END IF;

  END;

 

删除触发器的建立

该类触发器的主要做用就是当在进行删除操做的时候,把删除的记录记录到另外一张备份表中。直接实例

--建立删除备份表

CREATE TABLE delete_back

(

back_id VARCHAR2(20),

back_id2 VARCHAR2(20),

back_id3 VARCHAR2(20)

);

--建立触发器

CREATE OR REPLACE TRIGGER delete_back

BEFORE DELETE ON emp

FOR EACH ROW

  BEGIN

    INSERT INTO delete_back VALUES(old.back_id,old.back_id2,old.back_id3);

  END;

当用户操做emp表进行删除操做,激发触发器往delete_back表插入删除的数据明细

 

触发器基本管理操做

1.从新编译触发器

 alter trigger trigger_name complie;

2.屏蔽触发器(不删除使其无效)

 alter trigger trigger_name disable;

3.启用触发器(适用于屏蔽了的触发器)

 alter trigger trigger_name ENABLE;

4.删除触发器

 drop trigger trigger_name;

相关文章
相关标签/搜索