51CTO技术论坛 » Oracle 10g / 9i » 请教表分区可否跟用户建立关系        上一帖     下一帖    查看完整版本

页: [1]

银色天使2008-7-23 10:30
请教表分区可否跟用户建立关系

项目有这么个需求,一个表记录很多,到上千万条,
其中记录的是20个县的消费明细记录,
按照这20个县可以把这个大表分成20个表分区,
有个想法,是要对应建立20个用户,
每个用户只能看到他自己对应分区的内容,看不到其他分区的内容,
这样可以通过角色来设置吗?
如果角色不行通过什么办法能实现呢?
比较急啊,先谢谢大家~

national2008-7-24 01:04
[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]]

特爱蚂蚁2008-7-24 01:04
数据按时间建分区表  一般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;

就搞定了   方便多了

银色天使2008-7-24 01:26
先谢谢蚂蚁,
我的目的是要把用户的访问控制跟分区结合起来,
一个用户只能访问特定分区,这个是主要需求,这个有办法实现么?

wenaini2008-7-25 03:51
可以使用视图或者VPD实现

银色天使2008-7-26 08:00
不好意思啊,点了才发现这个悬赏是一次性都给了一个人的,谢谢大家帮忙。



相关文章:
oracle9i如何在windows2003下做双机
我与Oracle数据库11g的亲密接触
Oracle数据库的升级技术文档
关于一个检索
怎样安装ORBit-0.5.17.tar.bz2

查看完整版本: 请教表分区可否跟用户建立关系


Powered by 51CTO.COM