触发器权限

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

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

如果想在当前用户下创建其他用户的触发器需要具有CREATE ANY TRIGGER的权限

如果要创建的触发器作用在数据库上的比如对start或者shutdown事件触发,则需要具有ADMINISTER DATABASE TRIGGER系统权限。

触发器的创建:

1.标准触发器的创建

CREATE TRIGGER tirgger_name

BEFORE/AFTER DELETE[UPDATE INSERT SHUTDOWN]

ON object_name

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;

PLSQL 触发器的更多相关文章

  1. PLSQL触发器,游标

    --触发器 drop table emp_log create table emp_log( empno number, log_date date, new_salary number, actio ...

  2. Oracle plsql 触发器 查询/启用/停止

    在PLSQL中查询某个表的触发器脚本 select * from user_triggers where table_name='xxx' oracle触发器的启用和停用 1.禁用 table_nam ...

  3. PLSQL触发器

    触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行  GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...

  4. SQL记录-PLSQL触发器

    PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...

  5. plsql 触发器介绍 语句级别触发器、行级别触发器。

    /* 分类: 1.DDL触发器 执行create,alter,drop操作时,会激活的触发器 2.DML触发器 执行增.删除.修改时,激活的触发器 3.系统事件触发器 执行特定的系统事件时(启动.加载 ...

  6. Oracle-4 - :超级适合初学者的入门级笔记:plsql,基本语法,记录类型,循环,游标,异常处理,存储过程,存储函数,触发器

    初学者可以从查询到现在的pl/sql的内容都可以在我这里的笔记中找到,希望能帮到大家,视频资源在 资源, 我自己的全套笔记在  笔记 在pl/sql中可以继续使用的sql关键字有:update del ...

  7. 【PLSQL】触发器trigger类型,状态,參数

    ************************************************************************   ****原文:blog.csdn.net/clar ...

  8. plsql创建一个表、序列、和触发器

    plsql创建表后不能直接让id递增,因此要手动创建,下面是例子: 1.创建表 SQL: create table student(id number primary key,name varchar ...

  9. oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器

      PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语 ...

随机推荐

  1. 【mlflow】打包:npm run build + python setup.py sdist

    mlflow是一个开源机器学习平台 最近需要使用一个它的最新版本,但是这个最新版本没有git包,无法通过pip install安装,需要打包安装. 打包完之后在项目的dist文件夹中有打包后的压缩包, ...

  2. pandas 取消读取csv时默认第一行为列名

    读取时默认第一行为列名 此时DataFrame的列名为第一行数据: 因为第一行为有效数据,故不可作为列名,要么重新起列名,要么使用默认序列列名: 取消默认第一行为列名 给 pd.read_csv() ...

  3. Mysql覆盖索引与延迟关联

    延迟关联:通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据.   为什innodb的索引叶子节点存的是主键,而不是像myisam一样存数据的物理地址指针? 如果存的是物理地址指针不 ...

  4. sublime text 2windows下常用快捷键

    Ctrl + X 删除行 Ctrl + L 选取行 Ctrl + Shift + M 选取括号内的所有东西 Ctrl + Shift + D 复制行 Ctrl + Enter 插入下一行 Ctrl + ...

  5. open-falcon api相关

    本文描述通过被监控endpoint的名称获取该endpoint的eid和监控项,从而获取到该endpoint的监控历史数据,使用python代码的 api操作方法 注:同步open-falcon和ag ...

  6. py文件生成pyc

    鼠标右键 在此处打开命令行 python -m compileall xxx.py可以对当前目录下的xxx.py文件生成pyc

  7. Sybase IQ使用过程中注意事项

    Sybase IQ使用过程中注意事项 1,字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样; 2,等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较: 3,GROUP ...

  8. 20145325张梓靖 《Java程序设计》第2周学习总结

    20145325张梓靖 <Java程序设计>第2周学习总结 教材学习内容总结 整数 short 2字节,int 4字节,long 8字节 字节 byte 1字节 浮点数 float 4字节 ...

  9. JAVA8新特性——Lamda表达式

    JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类. 先来看看传统的匿名 ...

  10. js的原型继承

    <script> //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 function Animal(name){ thi ...