VPD visual private database 数据访问控制技术,通过策略函数来实现具体的控制。提供了对数据库信息的细粒度访问控制,归属在ORACLE Security框架下的成熟产品。介于用户SQL语句和实际执行对象之间的介质层。
详见:EBS VPD介绍和使用实例注:只有企业版才有此功能。
--设定对数据表 T 的每个 select 语句都要添加一个条件 table_id >= 100,即使应用层发出了 SELECT * FROM T ,实际执行的也是 SELECT * FROM T where table_id >= 100 。
-- 查询出所有表中的数据
SELECT * FROM T;
-- 创建策略函数
CREATE OR REPLACE FUNCTION emp(p_schema VARCHAR2, p_object VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'table_id >= 100'; -- condition_expr
END;
-- 对数据库对象应用策略函数
BEGIN
dbms_rls.add_policy(object_schema => 'USERNAME',
object_name => 'T',
policy_name => 'VPD_TEST',
function_schema=> 'USERNAME',
policy_function => 'EMP');
-- 通过查询数据字典,确认数据库对象上是否有策略函数
SELECT * FROM dba_policies t
WHERE t.object_name = 'T';
SELECT * FROM TABLENAME; -- 查询出表中 'table_id >= 100' 的所有数据
-- 失效策略
BEGIN
bms_rls.drop_policy(object_schema => 'USERNAME'
,object_name=> 'T'
,policy_name => 'VPD_TEST');
END;
物化视图
特殊的物理表,有别于普通的数据视图。物化视图存储基于远程表的数据,也可以称为快照。oracle提供了主键物化视图(默认)和ROWID物化视图。
物化视图日志 如果想采用快速刷新,必须建立基于主表的物化视图日志。
CREATE MATERIALIZED VIEW LOG ON table WITH PRIMARY KEY;
CREATE MATERIALIZED VIEW table_90 --创建物化视图
BUILD IMMEDIATE --在视图编写好后创建
REFRESH FAST WITH PRIMARY KEY --根据主表主键增量刷新(FAST,增量)
ON DEMAND --在用户需要时,由用户刷新
ENABLE QUERY REWRITE --查询重写
AS
SELECT * FROM table WHERE d_id = 90; -- 筛选出table表中 'd_id = 90' 的所有数据,建立物化视图
--刷新
INSERT INTO table
VALUES
(208 ,'Steven' ,'Lee' ,'LEE' ,'123.123.1234' ,to_date('1998-06-13', 'YYYY-MM-DD') ,'AD_VP' ,16000 ,NULL ,100 ,90 ,'Executive');
select * from table_90; -- 数据中没有新插入的 table_id=208 数据
begin
DBMS_MVIEW.REFRESH('TABLE_90','f');
end;
select * from table_90; -- 数据中有新插入的 table_id=208 数据
--删除
DROP MATERIALIZED VIEW LOG ON table;
DROP MATERIALIZED VIEW table_90;
详见:Oracle 物化视图
闪回机制
Oracle数据库中提供一种机制可以用来查询之前一段时间内修改行原先的值。需要注意通过闪回的时效是有限制的,具体能闪回到多久之前的数据和数据库的设置有关系。
SELECT * FROM table WHERE expr; -- 删除某数据前先查询出看看是否是要删除的数据
DELETE FROM table WHERE expr;
COMMMIT; -- 提交事务
-- 闪回到5分钟之前
SELECT * FROM table AS OF TIMESTAMP SYSDATE-5/(24*60) WHERE expr;
-- 最后将查到的数据插入到 table 表中,
INSERT INTO table(…) VALUES(…);
over分析语句
与聚集函数(Min/Max/Avg/Sum)搭配
与分析函数(rank/dense_rank/row_number)搭配时建立在数据窗口(over在一定的数据库范 围进行数据分析),在一定的数据范围进行排序、汇总等。
Oracle 分析函数
sql – 练习注:OVER(PARTITION BY col_id ORDER BY col NULLS LAST ) 如果col中含有空值则将它排在最后一名,如果没有 NULLS LAST,将在第一名不符合逻辑
全局临时表
递归查询
SELECT [LEVEL], column, expr...
FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)]
WITH语句
同义词
CREATE SYNONY tablename FOR db.tablename;
- INSERT 增强功能
INSERT FIRST WHEN sal > 25000 THEN
INTO special_sal VALUES (deptid ,sal)
WHEN hiredate LIKE ('%00%') THEN
INTO hiredate_history_00 VALUES (deptid ,hiredate)
WHEN hiredate LIKE ('%99%') THEN
INTO hiredate_history_99 VALUES (deptid ,hiredate)
ELSE
INTO hiredate_history VALUES (deptid ,hiredate)
SELECT department_id deptid ,SUM(salary) sal ,MAX(hire_date) hiredate
FROM employees
GROUP BY department_id;
Group By 增强
使用Rollup 产生常规分组汇总行 以及分组小计
使用Cube 产生Rollup结果集 + 多维度的交叉表数据源
使用Grouping 函数能在Rollup 和 Cube的结果集中很明确的看出哪些行是针对那些列或者列的组合进行分组运算的结果的; 没有被Grouping到返回1,否则返回0
使用Grouping Set 来代替多次UNION权限
补充:
select sys_context('USERENV','SESSION_USER') from dual; -- 获取当前用户名信息
select * from v$version; -- 查看当前Oracle版本
- First/Last排名查询
--找出订单总额最多、最少的客户
SELECT min(customer_id)
KEEP ( DENSE_RANK FIRST ORDER BY sum(customer_sales) DESC) first,
min(customer_id)
KEEP ( DENSE_RANK LAST ORDER BY sum(customer_sales) DESC) last
FROM user_order
GROUP BY customer_id;
注:
min函数的作用是用于当存在多个First/Last情况下保证返回唯一的记录
keep是对排序结果保留2条记录
- 分析函数 Ntile
--找出订单总额排名前1/5的客户
SELECT region_id,
customer_id,
ntile(5) OVER( ORDER BY sum(customer_sales) DESC) tile
FROM user_order
GROUP BY region_id, customer_id;
- 窗口函数