------------------------2013-5-20------------------------
数据库触发器内置程序包是pl/sql块或存储过程,dml操作时触发,隐式执行,可能具有声明部分和异常处理部分。
组成:语句,主体,限制。
类型:应用程序触发器,数据库触发器。instead of触发器。
视图上而不是在表上定义的。 !!提供修改视图的透明方法。可以针对视图编写insert,update及delete语句。以不可见方式在后台运行。执行在触发器主体中编写的操作。启用或禁用触发器
alter trigger <Trigger_name> enable;alter trigger <Trigger_name> disable;删除触发器drop trigger <Trigger_name>;查看有关触发器,使用下列数据字典视图:user_triggersall_triggersdba_triggers内置程序包
扩展数据库的功能为pl/sql提供对sql功能的访问用户sys拥有所有程序包是公共同义词可以由任何用户访问用户必须具有execute权限,才能访问过程和函数。程序包名称 描述
dbms_standard 提供语言工具dbms_alert 支持数据库事件的异步通知dbms_application_info 允许为跟踪目的而注册应用程序dbms_aq & dbms_aqadm 管理oracle advanced queuing选件dbms_defer,dbms_defer_sys,dbms_defer_query 允许构建和管理延迟的远程过程调用dbms_ddl 某些ddl命令的pl/sql等效项calendar 提供日历维护功能dbms_describe 描述存储子程序dbms_lob 操纵oracle lobdbms_job 允许对pl/sql过程进行调度dbms_lock 用户定义的锁dbms_output 在sql*plus或服务器管理器中提供屏幕输出dbms_output中的一些过程
-Enable-Disable-Put-Put_line-New_line-Get_line-Get_linesdbms_lob
-append-compare-copy-erase-fileclose-fileexists-filegetname-getlength 强制约束 类型- 非空(not null)- 主键(primary key)- 外键(foreign key)- 唯一(unique)- 检查(check)- 缺省(default)--创建表,并使用约束。
create table student2( no char(4) not null primary key, name varchar2(8) not null unique, sex char(2) default('女') check(sex='女' or sex='男'), age int default(18) check(age > 0 and age < 100), phone char(11) null);--添加数据
insert into t values(1);insert into t (select a from t);--查询表select * from t; --语句级触发器set serveroutput on;create or replace trigger t_ais
after insert on t begin dbms_output.put_line('Insert Statement...');end;insert into t values(2);
insert into t values(3);--行级
create or replace trigger t_airafter insert on t for each rowbegin dbms_output.put_line('Insert Row...');end; -- 多功能触发器create or replace trigger t_ardurafter insert or update or delete on tfor each rowbegin case when inserting then dbms_output.put_line('Insert is ); when deleting then dbms_output.put_line('Delete is ); when updating then dbms_output.put_line('Update is ); end case;end;--insert into t values(7);
--update t set a = 8 where a=7;delete from t where a = 8;select * from t; 分别在执行添删改查时触发。--创建表,添加数据。
create table users(id int,name varchar2(12));insert into users values(1,'ANiu');
insert into users values(2,'AZhu');--判断当前用户
create or replace trigger users_budrbefore update or delete on usersfor each rowbegin if user = 'NEWLIFEYHJ' then dbms_output.put_line('WelCome NewLifeYhj'); else dbms_output.put_line('No no no'); end if;end;update users set name='AGou' where id=2;
加上判断条件
when (to_char(sysdate,'Day') = '星期日')insert into log values (user, sysdate,:old.name || ' 被修改为 ' || :new.name); 触发器主体对另外一个表进行操作。--创建日志表
create table log(username varchar2(24),operdate date,operations varchar2(500)); create or replace trigger users_budrbefore delete or update of name on usersfor each rowwhen (to_char(sysdate,'Day') = '星期一')begin if user = 'NEWLIFEYHJ' then dbms_output.put_line('WelCome NewLifeYhj'); else dbms_output.put_line('No no no'); end if; insert into log values(user,sysdate,:old.name||'被修改为'||:new.name);end;update users set name='AZhu' where id=3;
--逻辑记录
:New:OldORA-04092: COMMIT 不能在触发器中
set serveroutput on; --重新连接之后,打印信息出不来,是这个需要重新设置。-- ##这就是奇怪为什么打印出不来的原因了##
update users set name='AZhu' where id=1;
select * from user_triggers; --数据字典--
--触发器实例应用--进销存--进货表create table jh(hh char, --货号sl number(3), --数量sj date --时间);--销售表create table xs(hh char, --货号sl number(3), --数量sj date --时间);--库存表
create table cc(hh char, --货号sl number(3), --数量sj date --时间);--进货触发器--
create or replace trigger triInsertJHafter inserton jhfor each rowdeclarelv_hc_num int;begin select count(*) into lv_hc_num from cc where hh = :new.hh; if lv_hc_num > 0 then update cc set sl = sl + :new.sl where hh = :new.hh; else insert into cc values (:new.hh, :new.sl,sysdate); end if;end; insert into jh values ('A', 120, sysdate);--销售触发器--
create or replace trigger triInsertXSafter inserton xsfor each rowdeclarelv_hc_num int;begin select sl into lv_hc_num from cc where hh = :new.hh; if lv_hc_num >= :new.sl then update cc set sl = sl - :new.sl where hh = :new.hh; else RAISE_APPLICATION_ERROR (-20001, '销售量远大于现有库存量!'); end if;end;内置程序包
取随机数:select dbms_random.random from dual; select dbms_random.string('q',4) from dual; -- 四位字符随机数。#dbms_lob#
#file xml 操作# dbms_xmlquery dbms_xmlgendbms_sql 动态sql
--建立文件夹
create or replace directory wrox_dir as 'c:\temp2';dbms_utility
##sql server##sp_helptriggersp_helptext