Oracle学习笔记20150917触发器

时间:2022-06-23 05:08:58

虚表是一个快照,视图与自查询都属于虚表.

触发器如果在同一张表上可以replace,如果不在同一张表则不能replace

在Oracle中dml语句需要手动提交,ddl语句自动提交

触发器默认的是语句级触发器,就是每个语句触发一次触发器,二加上for each now后变为行级触发器,就是对语句涉及到的每一行都触发一次触发器.

1.视图是Oracle的一种数据对象,能简化操作,提高安全性,满足不同用户的需求,视图不是真正存在的物理表.它是根据别的表生成一个动态的视图.

 创建视图基本语法create view 视图名字 as select 语句 [with read only]

例子:create view empview as select empno,ename,job from emp;

2.视图可以像表一样被查询.

3.创建视图后面可以附加with read only条件设置视图只读.如果视图不设置只读那么可以对视图进行修改,即修改了原表.

4.创建一个横跨两张表的视图以简化多表查询操作create viwe myviwe as select  emp.ename,dept.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno with read only;

5.创建修改视图 create or replace view 试图名 as select语句(可多表)  删除视图drop 视图名称;

6.视图不能添加索引,不占用磁盘空间.不同的用户查询不同的视图有利于提高安全性.

7.触发器是指某一事件发生时自动触发的隐含执行的动作.(比如当用户登录时自动记录时间与IP的操作)

8.触发器分为dml(Data Manipulation Language数据操作语言)触发器与ddl(Data Definition Language数据定义语言)触发器和系统触发器(与系统相关的触发器,比如用户登录退出启动关闭数据库)

9.创建触发器的基本语法

create trigger trigger_name

{before|after}

{}

实际例子在scott.emp表上添加记录时提示添加了一条.()

create or replace trigger tril

after insert on

scott.emp

begin

dbms_output.put_line('添加了一条');

end;

10.create or replace trigger tril2

after update on

scott.emp

for each row (表示这是一个行级触发器)

begin

dbms_output.put_line('修改了一条数据');

end;

行级触发器每修改几个记录就提示几次,而语句级触发器修改多个记录也只提示一次.

11.可以利用before创建触发器实现数据安全,例如:

create or replace trigger tril3

before delete on 

scott.emp

begin

if to_char(sysdate,'day') in ('星期日','星期六') then

dbms_output.put_line('休息日不可以删除员工');

raise_application_error (-20001,'休息日不可以删除员工');(自定义错误,真正的阻止删除操作的执行.自定义错误代码第一个参数可以是-20000到-20999之间,第二个参数是提示信息)

end if;

end;

12.在增删改查前打印相应提示

create or replace trigger tri3

before

insert or update or delete on

scott.emp

begin

case

     when insert then  dbms_output.put_line('请不要添加');

     raise_application_error(-20002,'请不要添加');

     when update then  dbms_output.put_line('请不要更新');

     raise_application_error(-20003,'请不要更新');

     when delete then  dbms_output.put_line('请不要删除');

     raise_application_error(-20004,'请不要添删除');

end case;end;

13.实现一个新工资不能低于旧工资的触发器

create  or replace trigger tri4

before update on

scott.emp

for each row

begin

if  :new.sal<:old.sal then dbms_output.put_line('工资不能低于原来的工资');

raise_application_error(-20005,'工资不能低于原来的工资');

else

dbms_output.put_line('原来的工资是'||:old.sal||'现在的工资'||:new.sal);

end if;

end;

14.关于相关操作:new与:old的有效性

特性 insert update delete

old null 有效 有效

new 有效 有效 null

15.add_months(:new.birthday,18*12)>sysdate(这个条件是指birthday加上18岁要大于当前系统时间)

16.系统触发器常用的五种事件(系统级触发器往往由dba账户创建)

ora_client_ip_address返回客户端ip

ora_database_name返回数据库名

ora_login_user返回登录用户名

ora_sysevent返回触发触发器的系统事件名

ora_des_encrypted_password返回用户des(md5)加密后的密码

基本语法为

crate or replace trigger tri_name

after [before]logon [logoff] on datebase

begin

执行语句

end;

实际例子

登录触发器:

create or replace trigger tri7

after logon on datebase

insert into logon_table(自己另行创建此表) (username,logon_time,address) values (ora_login_user,sysdate,ora_client_ip_address);

begin

end;

17.ddl触发器(一般是由系统管理员完成的,也需要dba账户)

可以被create alter drop触发

create or replace trigger 触发器名

after ddl on 方案名.schema

begin

执行语句

end;

18.实际应用:

创建一张表

create table my_ddl_record(event varchar2(64),username varchar2(64),ddl_time date);

创建触发器

create or replace trigger tri9

after ddl on scott.schema

begin

insert into my_ddl_record values(ora_sysevent,ora_login_user,sysdate);

end;

19.指定触发器的禁用与激活

 alter trigger 触发器名 disable/enable

20.禁用或者激活指定表上的所有触发器

alter table 表名 disable all trigger;(9i)

alter table 表名 enable all trigger;(9i)

21.彻底删除触发器

drop trigger 触发器名;