功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、
强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务处理 6、
启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id
before insert or update of department_id on employees referencing old
as old_value new as new_value for each row when
(new_value.department_id<>80 ) begin :new_value.commission_pct
:=0; end; / 触发器的组成部分: 1、 触发器名称 2、 触发语句 3、
触发器限制 4、 触发操作 1、 触发器名称 create trigger
biufer_employees_department_id 命名习惯: biufer(before insert
update for each row) employees 表名 department_id 列名 2、 触发语句
比如: 表或视图上的DML语句 DDL语句 数据库关闭或启动,startup shutdown
等等 before insert or update of department_id on employees referencing
old as old_value new as new_value for each row 说明: 1、
无论是否规定了department_id ,对employees表进行insert的时候 2、
对employees表的department_id列进行update的时候 3、 触发器限制 when
(new_value.department_id<>80 )
限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表跟新之后的值。 4、 触发操作 是触发器的主体 begin
:new_value.commission_pct :=0; end;
主体很简单,就是将更新后的commission_pct列置为0 触发: insert into
employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct
) values( 12345,’Chen’,’Donny’, sysdate, 12,
‘donny@hotmail.com’,60,10000,.25); select commission_pct from employees
where employee_id=12345; 触发器不会通知用户,便改变了用户的输入值。
触发器类型: 1、 语句触发器 2、 行触发器 3、 INSTEAD OF 触发器 4、
系统条件触发器 5、 用户事件触发器 1、 语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、
DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次
。比如,无论update多少行,也只会调用一次update语句触发器。 例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。 Create
table foo; Create trigger biud_foo Before insert or update or delete On
foo Begin If user not in then Raise_application_error(-20001, ‘You
don’t have access to modify this table.’); End if; End; /
即使SYS,SYSTEM用户也不能修改foo表 [试验]
对修改表的时间、人物进行日志记录。 1、 建立试验表 create table
employees_copy as select *from hr.employees 2、 建立日志表 create
table employees_log, when date); 3、
在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copy Before insert or update
or delete On employees_copy Begin Insert into employees_log Values;
End; / 4、 测试 update employees_copy set salary= salary*1.1; select
*from employess_log; 5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:
begin if inserting then —– elsif updating then —– elsif deleting
then —— end if; end; if updating or updating then —— end if;
[试验] 1、 修改日志表 alter table employees_log add ; 2、
修改触发器,以便记录语句类型。 Create or replace trigger
biud_employee_copy Before insert or update or delete On
employees_copy Declare L_action employees_log.action%type; Begin if
inserting then l_action:=’Insert’; elsif updating then
l_action:=’Update’; elsif deleting then l_action:=’Delete’; else
raise_application_error(-20001,’You should never ever get this
error.’); Insert into employees_log Values( user, l_action,sysdate);
End; / 3、 测试 insert into employees_copy( employee_id, last_name,
email, hire_date, job_id)
values(12345,’Chen’,’Donny@hotmail’,sysdate,12); select *from
employees_log update employees_copy set salary=50000 where
employee_id = 12345; 2、 行触发器
是指为受到影响的各个行激活的触发器,定义与语句触发器类似,有以下两个例外:
1、 定义语句中包含FOR EACH ROW子句 2、 在BEFORE……FOR EACH
ROW触发器中,用户可以引用受到影响的行值。 比如: 定义: create trigger
biufer_employees_department_id before insert or update of
department_id on employees_copy referencing old as old_value new as
new_value for each row when (new_value.department_id<>80 )
begin :new_value.commission_pct :=0; end; / Referencing 子句:
执行DML语句之前的值的默认名称是 :old ,之后的值是 :new insert
操作只有:new delete 操作只有 :old update 操作两者都有
referencing子句只是将new
和old重命名为new_value和old_value,目的是避免混淆。比如操作一个名为
new的表时。 作用不很大。 [试验]:为主健生成自增序列号 drop table foo;
create table foo(id number, data varchar2; create sequence foo_seq;
create or replace trigger bifer_foo_id_pk before insert on foo for
each row begin select foo_seq.nextval into :new.id from dual; end; /
insert into foo; insert into foo values; select * from foo; 3、
INSTEAD OF 触发器更新视图
Create or replace view company_phone_book
as Select first_name||’, ‘||last_name name, email, phone_number,
employee_id emp_id From hr.employees; 尝试更新email和name update
hr.company_phone_book set name=’Chen1, Donny1’ where emp_id=100
create or replace trigger update_name_company_phone_book INSTEAD OF
Update on hr.company_phone_book Begin Update hr.employees Set
employee_id=:new.emp_id, First_name=substr(:new.name, instr,
last_name= substr(:new.name,1,instr, phone_number=:new.phone_number,
email=:new.email where employee_id=:old.emp_id; end; 4、
系统事件触发器
系统事件:数据库启动、关闭,服务器错误 create trigger
ad_startup after startup on database begin — do some stuff end; /
5、 用户事件触发器 用户事件:用户登陆、注销,CREATE / ALTER / DROP /
ANALYZE / AUDIT / GRANT / REVOKE / RENAME / TRUNCATE / LOGOFF
例子:记录删除对象 1. 日志表 create table droped_objects( object_name
varchar2, object_type varchar2; 2.触发器 create or replace trigger
log_drop_trigger before drop on donny.schema begin insert into
droped_objects values( ora_dict_obj_name, — 与触发器相关的函数
ora_dict_obj_type, sysdate); end; / 3. 测试 create table
drop_me; create view drop_me_view as select *from drop_me; drop
view drop_me_view; drop table drop_me; select *from droped_objects
禁用和启用触发器 alter trigger disable; alter trigger enable; 事务处理:
在触发器中,不能使用commit / rollback
因为ddl语句具有隐式的commit,所以也不允许使用 视图: dba_triggers

一、创建和管理表 1、创建表语法 create table 表名(column datatype
[default expr][,column …]) default 约束 说明略 2、利用子查询创建表
create table 表名 as select * from u表 二、修改表 1、添加一个新列
oracle:alter table table_name add(column datatype [default
expr][,column datatype]…); 2、修改现有的列 oracle:alter table
table_name modify(column datatype [defaullt expr][,column
datatype]…) 3、删除列 alter table table_name drop column 列1
集中删除列 alter table table_name set unused column 列1 alter table
table_name drop unused columns; 三、删除表 drop table
表名;删除表后自动提交,不能rollback回来。 重名表:rename 表名 to 新表名
高效清空一张表,用truncate
删除时不做日志记录也就是不能用rollback回滚回来。 truncate table 表名
用delete删除后,可以后悔,回滚回来。 给一张表做注释 comment on table
tb_u_1 is ‘用户表用来存放用户信息….’ 四,添加约束 create table
table_name (id int not null, lname varchar, fname varchar, constraint
un_key_1 unique alter table 表名 add constraint ch_1 check;
在添加数据时如果column1的数据中没有k则添加失败 添加主键约束
oracle/sql:aleter table 表名1 add constraint pk_1 primary key; 添加外键
oracle/sql:aleter table 表名2 add constraint fk_1 foreign key
references 表名1; 删除主键约束 oracle/sql:alter table tb_name drop
constraint p1 alter table 表名2 drop constraint fk_1 cascade;
sql:查询主键是否存在p1 if exists(select * from sysobjects where
name=’p1′) select * from user_constraint select
constraint_name,column_name from user_cons_columns where
table_name=” 五、创建视图Create View create [or replace]
[force|noforce] view view_name [] as subquery [with check option
[constraint 11]] [with read only [constraint 22]]
创建一个视图或重定义一个视图 create or replace view view_name as
subquery 如果表table_1不存在,则使用force
创建视图会成功,否则会报表不存在错误。 create force view v_name as
select * from table_1 使用视图修改数据 create view view_001 as select
* from table_001 where id<10 修改不在视图范围内的数据同样会成功。
update view_001 set column1=’123′ where id=10;
修改不在视图范围内的数据则会失败,报:“视图 with check option 违反 where
字句” create view view_001 as select * from table_001 where id<10
with check option; update view_001 set column1=’123′ where id=10;
创建只读视图 Create a read only view create view view_001 as select *
from table_001 where id<10 with read only; 删除视图 Drop View drop
view view_Name 临时视图 inline views select * from (select * from
table_Name) 六、序列、索引、同义词 创建序列 create sequence
seq_name [increment by n] [start with n] [{maxvalue|nomaxvalue}]
[{minvalue|nominvalue}] [{cycle|nocycle}] [{cache|nocache}] create
sequence seq_test1 increment by 1 start with 1 查询序列Select a
Sequence select seq_test1.currval from daul select seq_test1.nextvall
from daul select * from user_sequences 使用序列Using a Sequence create
table tb_1; insert into tb_1; 修改序列Modifying a Sequence alter
sequence seq_test1 increment by 20 maxvalue 999999 nocache nocycle;
创建索引Creating an Index 在一列或多列上创建索引Create an index on one
or more columns Create index index_test1 on table;
索引能提高数据检索的速度,但是降低了UPDATE,DELETE,INSERT数据操作的性能!!!
索引创建原则 一.B-Tree索引: 1. 选项择索引字段的原则: l
在WHERE子句中最频繁使用的字段 l 联接语句中的联接字段 l
选择高选择性的字段(如果很少的字段拥有相同值,即有很多独特值,则选择性很好)
l ORACLE在UNIQUE和主键字段上自动建立索引 l
在选择性很差的字段上建索引只有在这个字段的值分布非常倾斜的情况下下才有益(在这种情况下,某一,两个字段值比其它字值少出现很多)
l
不要在很少独特值的字段上建B-TREE索引,在这种情况下,你可以考虑在这些字段上建位图索引.在联机事务处理环境下,所由并发性非常高,索引经常被修改,所以不应该建位图索引
l
不要在经常被修改的字段上建索引.当有UPDATE,DELETE,INSETT操作时,ORACLE除了要更新表的数据外,同时也要更新索引,而且就象更新数据一样,或产生还原和重做条目
l
不要在有用到函数的字段上建索引,ORACLE在这种情况,优化器不会用到索引,除非你建立函数索引
l
可以考虑在外键字段上建索引,这些索引允许当在主表上UPDATE,DELETE操作时,不需要共享子表的锁,这非常适用于在父表和子表上有很多并发的INSERT,UPDATE和DELETE操作的情况
l
当建立索引后,请比较一下索引后所获得的查询性能的提高和UPDATE,DELETE,INSERT操作性能上的损失,比较得失后,再最后决定是否需建立这个索引

用语言实现 好处: 1、可以减少对数据库的访问。 2、可移植性好。 坏处:
1、操作起来考虑的东西较多,修改一处就要修改别一处。也就是说是相互关联的。如果少改了某一处,很可能使数据不一致。
用触发器实现 好处:
1、可以使程序员从复杂的相互关联中解放出来,把精力放在复杂的业务上。
坏处: 1、可移植性差。
下面我就用一个例子实现一个简单的出入库。因为是例子表中所用到的字段很少。这里的例子只做为抛砖引玉。
数据表为入库金额表income,出库金额表outlay,余额表balance 复制代码 代码如下: income{ id number;
pay_amount number; } outlay{ id number; outlay_amount number; }
balance { id number; balance number; }
下面分别在入库和出库表中建立触发器 入库表: 复制代码 代码如下: CREATE TRIGGER
“AA”.”TRI_ADD” AFTER INSERT OR DELETE ON “INCOME” FOR EACH ROW begin if
deleting then update balance set balance = nvl – :old.pay_amount; elsif
updating then update balance set balance = nvl – :old.pay_amount +
:new.pay_amount; else update balance set balance = nvl +
:new.pay_amount; end if; end; 出库表: 复制代码 代码如下: CREATE TRIGGER
“AA”.”TRI_CUT” AFTER INSERT OR DELETE OR UPDATE ON “OUTLAY” FOR EACH
ROW begin if deleting then update balance set balance = nvl +
:old.outlay_amount; elsif updating then update balance set balance =
nvl + :old.outlay_amount – :new.outlay_amount; else update balance set
balance = nvl – :new.outlay_amount; end if; end; 下面我解释一下
oracle触发器,触发事件分为插入,删除,更新列三种事件,分别对应inserting
/deleting/updating关键字 可以用if语句分别实现 复制代码 代码如下: if inserting then —–
elsif updating then —– elsif deleting then —— end if;
NVL(eExpression1, eExpression2) 如果 eExpression1 的计算结果为 null
值,则 NVL 返回 eExpression2。 如果 eExpression1 的计算结果不是 null
值,则返回 eExpression1。eExpression1 和 eExpression2
可以是任意一种数据类型。 如果 eExpression1 与 eExpression2 的结果皆为
null 值,则 NVL 返回 .NULL.。
这里插入和删除就不说了。主要是更新操作,更新操作要注意的是更新应该是先减去旧值,在加上新值。
以上就是触发器例子的实现。文章写的不好请大家谅解。

使用oracle触发器 实现对某个表的增改删的监控操作,并记录到另一个表中。

一。存储过程的创建和使用 1.创建程序包,并在程序中创建存储过程 create or
replace PACKAGE NCS_ICP_TJ AS /*lfx@ncs-cyber.com.cn*/ /* TODO
在此输入程序包声明 */
/*根据备案主体ID拷贝通过表备案数据到备案临时表,拷贝5张*/ PROCEDURE
ICP_PASS_TO_TEMP( v_main_id IN icp_gn_temp_baxx_zt.ztid%TYPE,
v_lyd IN icp_gn_temp_baxx_zt.SJXT_ZTID%TYPE, v_in_hmd IN
icp_gn_temp_baxx_zt.in_hmd%TYPE, v_czlb IN
icp_gn_temp_baxx_zt.czlb%TYPE, v_bajd IN
icp_gn_temp_baxx_zt.bajd%TYPE ); END NCS_ICP_TJ;
2.创建程序包包体,并在程序中创建存储过程实现 create or replace PACKAGE
BODY ncs_icp_tj AS
/*根据备案主体ID拷贝通过表备案数据到备案临时表,拷贝5张*/ PROCEDURE
ICP_PASS_TO_TEMP( v_main_id IN icp_gn_temp_baxx_zt.ztid%TYPE,
v_lyd IN icp_gn_temp_baxx_zt.SJXT_ZTID%TYPE, v_in_hmd IN
icp_gn_temp_baxx_zt.in_hmd%TYPE, v_czlb IN
icp_gn_temp_baxx_zt.czlb%TYPE, v_bajd IN
icp_gn_temp_baxx_zt.bajd%TYPE ) IS v_lsh integer; BEGIN select
SEQ_ICP_GN_TEMP_BAXX_ZT_ZTID.NEXTVAL into v_lsh from dual; IF
v_main_id IS NULL OR v_lyd IS NULL OR v_in_hmd IS NULL OR v_czlb
IS NULL OR v_bajd IS NULL THEN RAISE_APPLICATION_ERROR(-20000, ‘Exsit
null value in arguments.’); END IF; /*所有插入的查询条件为主体ID*/ /*
插入主体*/ INSERT INTO ICP_GN_TEMP_BAXX_ZT (LSH, BBDW,ZTID,
SJXT_ZTID, YHM_ID, IN_HMD, CZLB, SCBBSJ, ZJXGSJ, DWMC, DWXZ, TZZ,
ZJLX, ZJHM, SHENGID, SHIID, XIANID, XXDZ, ZJZS,JYLX, WZFZR, WZFZR_ZJLX,
WZFZR_ZJHM, WZFZR_DHHM, WZFZR_SJHM, WZFZR_DZYJ, WZFZR_MSN,
WZFZR_QQ, BAXH, BAJD, ZSYXQ, SHR_XM, SHSJ, BZ, LRYHLX, LR_YHM_ID,
BAMM) SELECT v_lsh, BBDW, v_main_id, SJXT_ZTID, YHM_ID,
v_in_hmd/*是否在黑名单*/, v_czlb/*操作类别*/, SCBBSJ, ZJXGSJ,
DWMC, DWXZ, TZZ, ZJLX, ZJHM, SHENGID, SHIID, XIANID, XXDZ, ZJZS,
JYLX,WZFZR, WZFZR_ZJLX, WZFZR_ZJHM, WZFZR_DHHM, WZFZR_SJHM,
WZFZR_DZYJ, WZFZR_MSN, WZFZR_QQ, BAXH,v_bajd/*备案阶段*/, ZSYXQ,
SHR_XM, SHSJ,BZ, LRYHLX, LR_YHM_ID, BAMM FROM ICP_GN_BAXX_ZT WHERE
ID = v_main_id; /*插入网站*/ INSERT INTO ICP_GN_TEMP_BAXX_WZ
(LSH,BBDW,WZID, ZTID, SJXT_WZID, SCBBSJ, XGSJ, WZMC, SYURL, WZFZR,
WZFZR_ZJLX, WZFZR_ZJHM, WZFZR_DHHM, WZFZR_SJHM, WZFZR_DZYJ,
WZFZR_MSN, WZFZR_QQ, NRLX, FWNR, BAXH, LRYHLX, LR_YHM_ID, BAMM,
BZ,BAJD) SELECT v_lsh,BBDW,id, v_main_id, SJXT_WZID, SCBBSJ, XGSJ,
WZMC, SYURL, WZFZR, WZFZR_ZJLX, WZFZR_ZJHM, WZFZR_DHHM, WZFZR_SJHM,
WZFZR_DZYJ, WZFZR_MSN, WZFZR_QQ, NRLX, FWNR, BAXH, LRYHLX,
LR_YHM_ID, BAMM, BZ,1 FROM ICP_GN_BAXX_WZ WHERE ZTID = v_main_id;
/*插入接入*/ INSERT INTO ICP_GN_TEMP_BAXX_JR (lsh, bbdw,JRID,
ZTID, WZID, SJXT_JRID, SSISP, WZFB, WZJRFS, LRYHLX, LR_YHM_ID, BAMM,
bajd) SELECT v_lsh, bbdw,ID, v_main_id, WZID, SJXT_JRID, SSISP,
WZFB, WZJRFS, LRYHLX, LR_YHM_ID, BAMM,v_bajd FROM ICP_GN_BAXX_JR
WHERE ZTID =v_main_id; /*插入IP*/ INSERT INTO
ICP_GN_TEMP_BAXX_IPLB (lsh,bbdw,IPID, ZTID, WZID, JRID, SJXT_IPID,
QSIP, ZZIP) SELECT v_lsh, bbdw,ID, v_main_id, WZID, JRID, SJXT_IPID,
QSIP, ZZIP FROM ICP_GN_BAXX_IPLB WHERE ZTID = v_main_id;
/*插入域名*/ INSERT INTO ICP_GN_TEMP_BAXX_YMLB (lsh, bbdw,YMID,
ZTID, WZID, SJXT_YMID, YM) SELECT v_lsh, bbdw,ID, v_main_id, WZID,
SJXT_YMID, YM FROM ICP_GN_BAXX_YMLB WHERE ZTID = v_main_id; END
ICP_PASS_TO_TEMP; END ncs_icp_tj; 3. 调用存储过程,call
ncs_icp_tj.icp_pass_to_temp
本存储过程的调用,实现了从5张通过表复制数据到5张临时表
二,触发器的创建。 1.行级触发器,没插入一条数据执行一次,
向临时表中加入数据时,执行此触发器,把临时表插入到临时表的数据复制的日志表中
create or replace TRIGGER TRIGGER_ICP_TEMP_ZT_INSERT AFTER INSERT ON
ICP_GN_TEMP_BAXX_ZT FOR EACH ROW BEGIN insert into
ICP_GN_BAXX_XGLS_ZT (ID,LSH, BBDW,LS_ID,ZTID,SJXT_ZTID, DWMC,
DWXZ, TZZ, ZJLX, ZJHM, SHENGID, SHIID, XIANID, XXDZ, ZJZS,JYLX, WZFZR,
WZFZR_ZJLX, WZFZR_ZJHM, WZFZR_DHHM, WZFZR_SJHM, WZFZR_DZYJ,
WZFZR_MSN, WZFZR_QQ, BAXH, SHR_XM, SHSJ, BZ, LRYHLX, LR_YHM_ID,
BAMM) values( SEQ_ICP_GN_BAXX_XGLS_ZT_ID.NEXTVAL,:new.LSH,
:new.BBDW,:new.CZLB,:new.ZTID,:new.SJXT_ZTID, :new.DWMC, :new.DWXZ,
:new.TZZ, :new.ZJLX, :new.ZJHM, :new.SHENGID, :new.SHIID, :new.XIANID,
:new.XXDZ, :new.ZJZS,:new.JYLX, :new.WZFZR, :new.WZFZR_ZJLX,
:new.WZFZR_ZJHM, :new.WZFZR_DHHM, :new.WZFZR_SJHM, :new.WZFZR_DZYJ,
:new.WZFZR_MSN, :new.WZFZR_QQ, :new.BAXH, :new.SHR_XM, :new.SHSJ,
:new.BZ, :new.LRYHLX, :new.LR_YHM_ID, :new.BAMM); END; create or
replace TRIGGER TRIGGER_ICP_TEMP_WZ_INSERT AFTER INSERT ON
ICP_GN_TEMP_BAXX_WZ FOR EACH ROW BEGIN insert into
ICP_GN_BAXX_XGLS_WZ (ID, LSH,BBDW,WZID, ZTID, SJXT_WZID, WZMC,
SYURL,WZFZR, WZFZR_ZJLX, WZFZR_ZJHM, WZFZR_DHHM, WZFZR_SJHM,
WZFZR_DZYJ, WZFZR_MSN, WZFZR_QQ, NRLX, FWNR, BAXH, LRYHLX,
LR_YHM_ID,BZ, ls_id) values(
SEQ_ICP_GN_BAXX_XGLS_WZ_ID.NEXTVAL, :new.LSH,:new.BBDW,:new.WZID,
:new.ZTID, :new.SJXT_WZID, :new.WZMC, :new.SYURL,:new.WZFZR,
:new.WZFZR_ZJLX, :new.WZFZR_ZJHM, :new.WZFZR_DHHM, :new.WZFZR_SJHM,
:new.WZFZR_DZYJ, :new.WZFZR_MSN, :new.WZFZR_QQ, :new.NRLX, :new.FWNR,
:new.BAXH, :new.LRYHLX, :new.LR_YHM_ID,:new.BZ,1); END; create or
replace TRIGGER TRIGGER_ICP_TEMP_JR_INSERT AFTER INSERT ON
ICP_GN_TEMP_BAXX_JR FOR EACH ROW BEGIN insert into
ICP_GN_BAXX_XGLS_JR (ID, lsh, bbdw,JRID, ZTID, WZID, SJXT_JRID,
SSISP, WZFB, WZJRFS, LRYHLX, LR_YHM_ID, ls_id ) values
(SEQ_ICP_GN_BAXX_XGLS_JR_ID.NEXTVAL, :new.lsh,
:new.bbdw,:new.JRID, :new.ZTID, :new.WZID, :new.SJXT_JRID, :new.SSISP,
:new.WZFB, :new.WZJRFS, :new.LRYHLX, :new.LR_YHM_ID,1); END; create or
replace TRIGGER TRIGGER_ICP_TEMP_IPLB_INSERT AFTER INSERT ON
ICP_GN_TEMP_BAXX_IPLB FOR EACH ROW BEGIN insert into
ICP_GN_BAXX_XGLS_IPLB (ID, lsh,bbdw,IPID, ZTID, WZID, JRID,
SJXT_IPID, QSIP, ZZIP, ls_id ) values(
SEQ_ICP_GN_BAXX_XGLS_IPLB_ID.NEXTVAL,
:new.lsh,:new.bbdw,:new.IPID, :new.ZTID, :new.WZID, :new.JRID,
:new.SJXT_IPID, :new.QSIP, :new.ZZIP,1); END; 2.表级触发器
插入整个过程中,触发器只之行一次
,当向AAA表中如入一条数据,将真个AAA表的数据复制BBB表 create or replace
TRIGGER TRIGGER_AAA_INSERT AFTER INSERT ON AAA BEGIN insert into BBB
select id, username from AAA; END;

  1. 选择建立复合索引 复合索引的优点: l
    改善选择性:复合索引比单个字段的索引更具选择性 l
    减少I/O:如果要查询的字段刚好全部包含在复合索引的字段里,则ORACLE只须访问索引,无须访问表
    什么情况下优化器会用到复合索引呢?
    当SQL语句的WHERE子句中有用到复合索引的领导字段时,ORACLE优化器会考虑用到复合索引来访问.
    当某几个字段在SQL语句的WHERE子句中经常通过AND操作符联合在一些使用作为过滤谓词,并且这几个字段合在一起时选择性比各自单个字段的选择性要更好时,可能考虑用这几个字段来建立复合索引.
    当有几个查询语句都是查询同样的几个字段值时,则可以考虑在这几个字段上建立复合索引.
    复合索引字段排序的原则: l
    确保在WHERE子句中使用到的字段是复合索引的领导字段 l
    如果某个字段在WHERE子句中最频繁使用,则在建立复合索引时,考虑把这个字段排在第一位
    l
    如果所有的字段在WHERE子句中使用频率相同,则将最具选择性的字段排在最前面,将最不具选择性的字段排在最后面
    l
    如果所有的字段在WHERE子句中使用频率相同,如果数据在物理上是按某一个字段排序的,则考虑将这个字段放在复合索引的第一位
    二.位图索引 什么情况下位图索引能够改善查询的性能呢? l
    WHERE子句包含多个谓词于中低基数的字段 l
    单个的谓词在这些中低基数的字段上选取大量的行 l
    已经有位图索引创建于某些或全部的这些中低基数的字段上 l
    被查询的表包含很多行 l
    可以在单一个表上建立多个位图索引,因此,位图索引能够改善包含冗长WHERE子句的复杂查询的性能,在合计查询和星形模型的联接查询语句中,位图索引也可以提供比较优良的性能
    位图索引与B-TREE索引的比较 l 位图索引更节省存储空间 l
    位图索引比较适用于数据仓库环境,但不适于联机事务处理环境.在数据仓库环境,数据维护通常上通过批量INSERT和批量UPDATE来完成的,所以索引的维护被延迟直互DML操作结束.举例:当你批量插入1000行数据时,这些插入的行被放置到排序缓存中,然后批处理更新这1000个索引条目,所以,每一个位图段在每一个DML操作中只需更新一次,即使在那个位图段里有多行被更新
    l
    一个健值的压缩位图是由一个或多个位图段所组成,每一个位图段大约相当于半个BLOCK
    SIZE那么大,锁的最小粒度是一个位图段,在联机事务处理环境,如果多个事务执行同时的更新,使用位图索引就会影响UPDATE,INSERT,DELETE性能了
    l
    一个B-TREE索引的条目只包含一个ROWID,因此,当一个索引条目被锁定,即一行被锁定.但是对于位图索引,
    一个索引条目潜在地有可能包含一段ROWID(即某一个范围内的ROWID,有多个ROWID),当一个位图索引条目被锁定时,则这个条目包含的那一段ROWID都被锁定,从而影响并发性.当一个位图段内的ROWID的数量越多时,并发性就越差.虽然如此,对于BULK
    INSERT,UPDATE和DELETE,位图索引的性能还是比B-TREE索引要好
    三,索引和NULL
    NULL值在索引中是被看做一个独特值的除非当一个索引的两行或多行的NON-NULL值是相等的情况下.在那种情况下,行被看做是相等的,因此,唯一索引不允许行包含空值以怕被看做是相等的.但是,当所有的行都是空值时,这个规则就不适用.ORACLE并不索引所有健值都为NULL的表的行,除非是位图索引或当簇键字段值是NULL时
    创建同义词Create a Synongms create [public] synonym sy_name for
    object 创建一个别名为table_001 create synonym tb1 for table_001
    删除同义词Drop a synonym Drop synonym tb1
    Oracle同义词创建及其作用(摘自//www.jb51.net/database/201109/106257.html)
    Oracle的同义词从字面上理解就是别名的意思,和试图的功能类似,就是一种映射关系。本文介绍如何创建同义词语句,删除同义词以及查看同义词语句。
    oracle的同义词总结:
    从字面上理解就是别名的意思,和试图的功能类似。就是一种映射关系。
    1.创建同义词语句: create public synonym table_name for
    user.table_name; 其中第一个user_table和第二个user_table可以不一样。
    此外如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database
    Link来扩展访问,然后在使用如下语句创建数据库同义词:create synonym
    table_name for table_name@DB_Link;
    当然,你可能需要在user用户中给当前用户授权: grant select/delete/update
    on user2 2.删除同义词: drop public synonym table_name;
    3.查看所有同义词: select * from dba_synonyms
    同义词拥有如下好处:节省大量的数据库空间,对不同用户的操作同一张表没有多少差别;扩展的数据库的使用范围,能够在不同的数据库用户之间实现无缝交互;同义词可以创建在不同一个数据库服务器上,通过网络实现连接。
    Oracle数据库中提供了同义词管理的功能。Oracle同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。
    AD:
    在Oracle中对用户的管理是使用权限的方式来管理的,也就是说,如果我们想使用数据库,我们就必须得有权限,但是如果是别人将权限授予了我们,我们也是能对数据库进行操作的,但是我们必须要已授权的表的名称前键入该表所有者的名称,所以这就是比较麻烦的,遇到这种情况,我们该怎么办呢?创建个Oracle同义词吧!这样我们就可以直接使用同义词来使用表了。
    1.同义词的概念
    Oracle数据库中提供了同义词管理的功能。同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。在使用同义词时,Oracle数据库将它翻译成对应方案对象的名字。与视图类似,同义词并不占用实际存储空间,只有在数据字典中保存了同义词的定义。在Oracle数据库中的大部分数据库对象,如表、视图、同义词、序列、存储过程、包等等,数据库管理员都可以根据实际情况为他们定义同义词。
    2.Oracle同义词的分类
    Oracle同义词有两种类型,分别是公用Oracle同义词与私有Oracle同义词。
    1)公用Oracle同义词:由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。公用同义词往往用来标示一些比较普通的数据库对象,这些对象往往大家都需要引用。
    2)私有Oracle同义词:它是跟公用同义词所对应,他是由创建他的用户所有。当然,这个同义词的创建者,可以通过授权控制其他用户是否有权使用属于自己的私有同义词。
    3.Oracle同义词创建及删除 创建公有Oracle同义词的语法:Create [public]
    synonym 同义词名称 for [username.]objectName; Drop [public] synonym
    同义词名称 4.Oracle同义词的作用 1)
    多用户协同开发中,可以屏蔽对象的名字及其持有者。如果没有同义词,当操作其他用户的表时,必须通过user名.object名的形式,采用了Oracle同义词之后就可以隐蔽掉user名,当然这里要注意的是:public同义词只是为数据库对象定义了一个公共的别名,其他用户能否通过这个别名访问这个数据库对象,还要看是否已经为这个用户授权。
    2)
    为用户简化sql语句。上面的一条其实就是一种简化sql的体现,同时如果自己建的表的名字很长,可以为这个表创建一个Oracle同义词来简化sql开发。
    3)为分布式数据库的远程对象提供位置透明性。
    5.Oracle同义词在数据库链中的作用
    数据库链是一个命名的对象,说明一个数据库到另一个数据库的路径,通过其可以实现不同数据库之间的通信。
    Create database link 数据库链名 connect to user名 identified by 口令
    using ‘Oracle连接串’; 访问对象要通过
    object名@数据库链名。同义词在数据库链中的作用就是提供位置透明性。

代码:复制代码 代码如下:create or replace
trigger test_trigger before insert or update or delete on test_table
for each row declare v_id varchar2; v_bdlb varchar2; v_jgdm VARCHAR2;
v_jgmc VARCHAR2; v_gajgmc VARCHAR2; v_gajgwsmc VARCHAR2; v_jz
VARCHAR2; v_ksdwsdwmc VARCHAR2; begin /*
插入时往历史表中存放的是新插入的数据.
修改时往历史表中存放的是修改后的数据.
删除时往历史表中存放的是删除之前的数据. */ select org_id_s.nextval
into v_id from dual; — 利用seq生成主键 v_jgdm := :new.row_id;
v_jgmc := :new.dept_name; v_gajgmc := :new.dept_name; v_gajgwsmc :=
:new.bmjc; v_jz := substr; if ‘2’ = :new.depttype then v_ksdwsdwmc :=
‘shiju’; else if ’03’ = v_jz then v_ksdwsdwmc := ‘zhi’; elsif ’05’ =
v_jz then v_ksdwsdwmc := ‘xing’; elsif ’51’ = v_jz then v_ksdwsdwmc
:= ‘she’; else v_ksdwsdwmc := ‘qita’; end if; end if; if inserting then
v_bdlb := ‘1’; insert into test_table_h (id, bdlb, jgdm, jgmc,
gajgmc, gajgwsmc, jz, ksdwsdwmc) values (v_id, v_bdlb, v_jgdm,
v_jgmc, v_gajgmc, v_gajgwsmc, v_jz, v_ksdwsdwmc); elsif updating
then v_bdlb := ‘2’; insert into test_table_h (id, bdlb, jgdm, jgmc,
gajgmc, gajgwsmc, jz, ksdwsdwmc) values (v_id, v_bdlb, v_jgdm,
v_jgmc, v_gajgmc, v_gajgwsmc, v_jz, v_ksdwsdwmc); else v_bdlb :=
‘3’; v_jgdm := :old.row_id; v_jgmc := :old.dept_name; v_gajgmc :=
:old.dept_name; v_gajgwsmc := :old.bmjc; v_jz := substr; if ‘2’ =
:old.depttype then v_ksdwsdwmc := ‘shiju’; else if ’03’ = v_jz then
v_ksdwsdwmc := ‘zhi’; elsif ’05’ = v_jz then v_ksdwsdwmc := ‘xing’;
elsif ’51’ = v_jz then v_ksdwsdwmc := ‘she’; else v_ksdwsdwmc :=
‘qita’; end if; end if; insert into test_table_h (id, bdlb, jgdm,
jgmc, gajgmc, gajgwsmc, jz, ksdwsdwmc) values (v_id, v_bdlb, v_jgdm,
v_jgmc, v_gajgmc, v_gajgwsmc, v_jz, v_ksdwsdwmc); end if; end;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图