虚表是一个快照,视图与自查询都属于虚表.
触发器如果在同一张表上可以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 触发器名;