|
请教表分区可否跟用户建立关系
项目有这么个需求,一个表记录很多,到上千万条,
其中记录的是20个县的消费明细记录,
按照这20个县可以把这个大表分成20个表分区,
有个想法,是要对应建立20个用户,
每个用户只能看到他自己对应分区的内容,看不到其他分区的内容,
这样可以通过角色来设置吗?
如果角色不行通过什么办法能实现呢?
比较急啊,先谢谢大家~ |
|
[color=red][b]此回复于2008-07-26 16:00被 [url=http://bbs.51cto.com/profile-uid-8519.html]银色天使[/url] 评为最佳答案[/b][/color]
你可以在特定的表分区上建立视图,然后将这些视图的权限授予特定的用户,这样就可以解决特定用户访问特定分区的问题。
还是举个例子吧。
我用redhat用户登陆
CREATE TABLE emp (
id INT PRIMARY KEY,
name VARCHAR2(20),
dept INT)
PARTITION BY RANGE (dept)
(PARTITION p1 VALUES LESS THAN (2),
PARTITION p2 VALUES LESS THAN (3)
);
INSERT INTO emp VALUES (1, 'zhangsan', 1);
INSERT INTO emp VALUES (2, 'lisi', 2);
INSERT INTO emp VALUES (3, 'wangwu', 2);
INSERT INTO emp VALUES (4, 'zhaoliu', 1);
CREATE VIEW emp_dept1_vu AS
SELECT *
FROM emp PARTITION (p1);
CREATE VIEW emp_dept2_vu AS
SELECT *
FROM emp PARTITION (p2);
有两个用户分别为user1, user2
GRANT SELECT ON emp_dept1_vu TO user1;
GRANT SELECT ON emp_dept2_vu TO user2;
接下来你分别用user1, user2登陆
SELECT * FROM redhat.emp_dept1_vu;
SELECT * FROM redhat.emp_dept2_vu;
如果需要的话你还可以建立同义词
[[i] 本帖最后由 national 于 2008-7-24 15:28 编辑 [/i]] |
|
数据按时间建分区表 一般10天一个分区
建新表空间的时候把存档最久的分区删掉
删掉很简单:先删表分区,再删表空间
代码送给楼主了
[Copy to clipboard] [ - ]
CODE:
create or replace procedure P_Create_BILLPART_partition(Vmon IN varchar2)
is
S_Path varchar2(200); --数据文件存放地
billindex varchar2(20); --索引名
partitonnem varchar2(20); -- 分区名和表空间名
S_Spacename varchar2(20); --数据文件名.dbf
S_SpacenameAdd varchar2(20); --数据文件名.dbf
Vdate Varchar2(20); --后半段数据文件和分区名
SDate Date ; --开始时间
Ndatesum number; --建几个表空间
Nsql varchar2(2000);
Ldate Varchar2(20); -- less than date
begin
SDate:=To_date(Vmon||'01','YYYYMMDD'); -- 开始时间,更改月份即可
S_Path:='F:\'||Vmon||'\'; --数据文件存地
Ndatesum:=3; --生成几天的表空
For i in 1..Ndatesum Loop
Vdate:=to_char(SDate,'MM')||'0'||to_char(i);
billindex:='BillInd_'||Vdate;
partitonnem:='BillPart_'||Vdate;
S_Spacename:='BillPart_'||Vdate||'.dbf';
S_SpacenameAdd:='BillPart_'||vdate||'add.dbf';
Nsql:='create tablespace '||partitonnem||' datafile '''||S_Path||S_Spacename||''' size 1024M reuse ';
Nsql:=Nsql || 'autoextend on next 5m maxsize unlimited, '''|| S_Path||S_SpacenameAdd||''' SIZE 400M REUSE ';
Nsql:=Nsql || 'AUTOEXTEND ON NEXT 5m MAXSIZE Unlimited default storage (initial 10M next 10M MINEXTENTS 3 MAXEXTENTS Unlimited PCTINCREASE 0)';
execute immediate Nsql;
Nsql:='create tablespace '||billindex||' datafile '''||S_Path||billindex||'.dbf'' size 215m autoextend on next 5m maxsize unlimited default storage (initial 10M next 10M pctincrease 0)';
execute immediate Nsql;
Ldate:=to_char(SDate+(i*10),'YYYYMMDD');--10天一个分区
Nsql:='alter table particu_bill add partition '||partitonnem||' values less than ('''||Ldate||''') tablespace '||partitonnem||' nologging storage(initial 10m next 10m minextents 1 maxextents unlimited pctincrease 0)';
execute immediate Nsql;
Nsql:='alter index IND_PARTICU_YHHM rebuild partition '||partitonnem||' tablespace '||billindex||' storage(initial 10m next 5m maxextents unlimited pctincrease 0)';
execute immediate Nsql;
Nsql:='alter index IND_PARTICU_YHHM nologging';
execute immediate Nsql;
End Loop;
end P_Create_BILLPART_partition;
比如要删一个月数的数据
alter table tablename drop partition partitionname10;
alter table tablename drop partition partitionname20;
alter table tablename drop partition partitionname30;
drop tablespace tablespacename10;
drop tablespace tablespacename20;
drop tablespace tablespacename30;
就搞定了 方便多了 |
|
先谢谢蚂蚁,
我的目的是要把用户的访问控制跟分区结合起来,
一个用户只能访问特定分区,这个是主要需求,这个有办法实现么? |
|
| 不好意思啊,点了才发现这个悬赏是一次性都给了一个人的,谢谢大家帮忙。 |
相关文章: oracle9i如何在windows2003下做双机 我与Oracle数据库11g的亲密接触 Oracle数据库的升级技术文档 关于一个检索 怎样安装ORBit-0.5.17.tar.bz2
Powered by 51CTO.COM
|