日期:2014-05-16  浏览次数:20372 次

工作积累(表空间、导出方案、触发器)1

--查看表空间、数据文件相关信息

1、查看表空间包含哪些数据文件
SELECT T.FILE_NAME,T.TABLESPACE_NAME FROM DBA_DATA_FILES T
WHERE T.TABLESPACE_NAME='TBS_PKIQ'
?


2、查看表空间 包含哪些内容
SELECT T.owner,T.segment_name,T.segment_type,T.tablespace_name FROM DBA_SEGMENTS T
WHERE T.tablespace_name='TBS_PKIQ'
?

--导出方案

导出方案(包括数据):
exp? nap/hs_hn_nap@jwzh? file=g:\nap.dmp? log=g:\nap.log? owner=nap
导出方案结构(不含数据):
????? 1、打开命令窗口;? 2、输入exp;? 3、输入用户名-密码@服务名;? 4、...按提示操作...

导入方案 (导入的用户名、表空间需与被导入数据的一致) (导入方案结构与导入方案数据方法一样):
imp nap/hs_hn_nap@orcl? file=g:\nap.dmp? log=g:\nap_imp.log full=y


导出表空间:
exp pcs/hs_hn_pcs@jwzh tablespaces=TBS_HY? file=d:\tbs_hy.dmp log=d:\tbs_hy.log

导入表空间:
exp? pcs/hs_hn_pcs@jwzh? file=d:\tbs_hy.dmp? tablespaces=TBS_HY? log

?

--触发器

自述:在触发器内判断一个操作具体是什么操作,可以通过判断该表字段的
:OLD.字段,:NEW.字段 是否空值来判断是 插入、更新还是删除操作。


1.语句触发器
????????????? 语句触发器是指当执行DML语句时被隐含执行的触发器。如果在表
上针对某种DML操作建立了语句触发器,那么当执行DML操作时会自动执行触发器的相应代码。当审计DML操作,或者确保DML操作安全执行时,可以使用语句触发器。当使用语句触发器时,不能记录列数据的变化。建立语句触发器的语法如下:
CREATE [OR REPLACE] TRIGGER trigger_name
?? timing event1 [OR event2 OR event3]
? ON table_name
?? PL/SQL block;
其中,timing用于指定触发时机(BEFORE或AFTER);event用于指定触发事件(INSERT、UPDATE和DELETE);table_name用于指定DML操作所对应的表名。
E.G:
CREATE OR REPLACE TRIGGER tr_sec_emp
BEFORE INSERT OR UPDATE OR DELETE ON emp
BEGIN
? IF to_char(sysdate,’DY’,’nls_date_language=AMERICAN’)
??IN(‘SAT,’SUN’) THEN
??raise_application_error(-20001,’不能在休息日改变雇员信息’);
?? END IF;
END;

2.行触发器
???????? 行触发器是指当执行DML操作时,每作用一行被触发一次的触发器。
? 当审计数据变化时,可以使用行触发器。建立行触发器语法:
?CREATE [OR REPLACE] TRIGGER trigger trigger_name
???timing event1 [OR event2 OR event3]
???ON table_name
???[REFERENCING OLD AS old | NEW AS new]
???FOR EACH ROW
???[WHEN condition]
???PL/SQL block;
其中,timing用于指定触发时机(BEFORE或AFTER);event用于指定触发事件(INSERT、UPDATE、DELETE);REFERENCING子句用于指定引用新、旧数据的方式,默认情况下使用old修饰符引用旧数据,使用new修饰符引用新数据;table_name用于指定DML操作所对应的表;FOR EACH ROW表示建立行触发器;WHEN子句(可选)用于指定触发条件。示例如下:
CREATE OR REPLACE TRIGGER tr_sal_change
AFTER UPDATE OF sal ON emp
FOR EACH ROW
DECLARE
? v_temp INT;
BEGIN
? SELECT count(*) INTO v_temp FROM audit_emp_change
?WHERE name=:old.ename;
? IF v_temp=0 THEN
?INSERT INTO audit_emp_change
?VALUES(:old.ename,:old.sal,:new.sal,SYSDATE);
? ELSE
?UPDATE audit_emp_change
?? SET oldsal=:old.sal,newsal=:new.sal,time=SYSDATE
?? WHERE name=:old.ename;
? END IF;
END;
/