20180530 am
VPD就是介于用户SQL语句和实际执行对象之间的介质层。用户或者应用程序发出的SQL语句在传入到DBMS执行之前,会自动被拦截并且进行额外处理。处理的结果往往反映为在语句where条件中添加特殊的条件式。
创建vpd依赖函数
create table t as select * from dba_objects;
create or replace function f_limit_access
(
vc_schema varchar2,
vc_object varchar2
) return varchar2
as
vc_userid varchar2(100);
begin
select SYS_CONTEXT('USERENV','SESSION_USER')
into vc_userid
from dual;
return 'owner='''||vc_userid||'''';
end;
/
使用dbms_rls包添加vpd策略
exec dbms_rls.add_policy(object_schema => 'VPD',object_name => 'T',policy_name => 'VPD_TEST',function_schema => 'VPD',policy_function => 'F_LIMIT_ACCESS');
查询已添加的vpd策略
select policy_name, SEL, INS, UPD, DEL, IDX, CHK_OPTION, ENABLE from user_policies;
查询t表,只能查询到owner为登录用户的记录。使用autotrace可以发现其实就是在where条件中增加了函数返回的条件
删除vpd策略
exec dbms_rls.drop_policy('VPD','T','VPD_TEST');
pm
调度程序体系结构:
使用dbms_scheduler包来管理调度程序
dba_scheduler_jobs查询所有调度程序作业
cjq0后台进程调度作业执行
job_queue_processes限制调度作业的最大数,设置为0将不会运行调度程序
需要角色SCHEDULER_ADMIN
调度程序可以是存储过程,也可以是shell脚本和操作系统命令
dbms_scheduler.create_job创建作业
dbms_scheduler.create_program创建程序
dbms_scheduler.create_schedule创建时间表
dbms_scheduler.create_job_class创建作业类
dbms_scheduler.create_window创建窗口
创建一个作业:
create table times(time1 date);
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
begin
dbms_scheduler.create_job(
job_name=>'savedate',
job_type=>'plsql_block',
job_action=>'insert into times values(sysdate);',
start_date=>sysdate,
repeat_interval=>'freq=minutely;interval=1',
enabled=>true,
auto_drop=>false);
end;
/
exec dbms_scheduler.disable('savedate');
exec dbms_scheduler.drop_job('savedate');
create table test(cnt number);
create or replace procedure mypro as
begin
insert into test values(1);
commit;
end mypro;
/
begin
dbms_scheduler.create_job(
job_name=>'insertnum',
job_type=>'stored_procedure',
job_action=>'mypro',
start_date=>sysdate,
repeat_interval=>'freq=minutely;interval=1',
enabled=>true,
auto_drop=>false);
end;
/
全球化功能设置
五个全球化功能设置级别(从低到高)
数据库,实例,客户端环境,会话,语句
数据字典:select * from nls_database_parameters where parameter='NLS_CHARACTERSET';
相关参数:show parameter nls
修改显示语言
设置操作系统环境变量
echo $NLS_LANG
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
alter session set nls_date_format='YYYY-MON-DD';
alter session set nls_date_language='SIMPLIFIED CHINESE';
如果要修改字符集,在修改之前使用csscan扫描数据,获取可能存在问题的报告
以sysdba运行csminst.sql
cd $ORACLE_HOME/rdbms/admin
@csminst.sql
csscan system/oracle full=y tochar=zhs16gbk
如果要修改字符集,目标数据库必须是原数据库的超集
修改字符集需要将数据库启动到mount模式
shutdown immediate;
startup mount;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
alter database open;
ALTER DATABASE CHARACTER SET [INTERNAL_USE] al32utf8;
shutdown immediate;
!注意将参数修改回去
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=1000;