飘飘悠悠 发表于 2015-1-16 22:38:20

MYSQL网站制作之ORACLE 的Virtual Private Database的全...

DBaaS向客户提供了许多与其他云服务相类似的优势:一个灵活的、可扩展的MySQL学习教程、按需服务的平台,它以自助服务和便捷管理为导向,可以对环境中的资源进行调配。oracle
ORACLE的VirtualPrivateDatabase的全新体验

===============================================

接待人人同我交换:小白enhydra_boy@tom.com

接待转载,请保存本声明,感谢!

================================================

在入手下手对ORACLE的VirtualPrivateDatabase的先容之前,笔者想就ROW-RULEcontrol(行纪录级会见把持)的观点复杂地说几句。

行纪录级会见把持成绩的提出和意义?

企业的使用体系都离不开数据库体系,数据库体系的权限把持是很主要的一个环节,年夜型数据库体系(ORACLE、DB2、SYBASE、MSSQLSERVER)都供应完美的用户办理机制,从而能够周密地把持数据库工具(表、视图、函数、存储历程、程序包等等)的会见。可是,这常常是工具级其余。

跟着商务需求地不休地提出,呈现了关于行纪录把持的请求:

1)数据查询和报表输入数据必要可以举行无效地断绝,如在一个复杂地发卖数据统计使用中,年夜区司理、区域司理和发卖员查询的数据就分歧。

2)ASP(使用服务供给商)体系呈现,在体系布局上,就呈现了很多企业用户的数据城市寄存在统一个数据库种,可是体系必要可以无效地断绝。

为了满意如许的需求,在营业数据表必要中加上一些字段来举行把持,使用的开辟常常会另行开辟良多代码来完成行纪录把持。可是,跟着营业的变更,我们会发明开辟和保护这类办理需求的本钱愈来愈高。

我们必要寻觅一种新的办理计划,可以使使用体系的架构计划复杂,扩大性强,办理和保护的本钱很低。

ORACLE8i的一个新特征VirtualPrivateDatabase

ORACLE8i供应了一个新的特征,来完成行级划定规矩的把持,称之为VirtualPrivateDatabase。充实使用8i供应的VirtualPrivateDatabase手艺,能够完成,一个数据库Schema的数据同时给多个数据库用户会见,可是又能很好地断绝各自的数据内容。明显,这已不是本来的工具级的把持的观点。

上面是笔者的体验,写上去,供人人参考。我先经由过程一个复杂的例子,来讲明ORACLE8i的这个新特征(需ORACLE8i的企业版才撑持)。

情况:Windows2000Server+ORACLE8.1.7(EnterpriseEdition)

在SCOTT用户下,有一个Customers表,纪录着客户材料,今后为每一个客户分派一个ORACLE数据库上岸账号,客户能够上岸,查询本人的定单情形。那末,我们必要做的就是可以把每一个上岸账号和客户代码对应起来。就是说要完成一个映照干系,固然,经由过程本人建干系映照表,写代码做,也能够完成,可是ORACLE8I把这统统变地十分复杂(我接上去的先容城市环绕着ORACLE8i这项手艺是我们的事情怎样加倍复杂,怎样加倍简单把持,请记着,这是笔者写这篇文章的目标)。

--创建一个SECUSR的账号,用于权限把持用

connectsystem/manager@oracle;

createusersecusridentifiedbysecusr;

grantconnect,resource,dbatosecusr;

--把Customers的查询权力付与secusr

connectscott/tiger@oracle;

grantselecton"Customers"tosecusr;

--毗连到secusr用户

connectsecusr/secusr@oracle;

--创立高低文

createcontextCustomer_contextUSINGsecusr.CUSTOMER_SECURITY_CONTEXT;

--创立程序包customer_security_context

createorreplacepackage

secusr.customer_security_contextis

procedureset_customerid;

end;



createorreplacepackagebody

secusr.Customer_security_contextis

procedureset_customeridis

begin

IFSYS_CONTEXT(USERENV,SESSION_USER)=SCOTTTHEN

DBMS_SESSION.SET_CONTEXT(customer_context,customerid,ALFKI);

ENDIF;

end;

end;



--受权

grantexecuteonsecusr.Customer_security_contexttopublic;

ORACLE8i中供应了Context(毗连高低文)的观点,相似于asp中的session,你能够为以后这个毗连设置多个全局变量,纪录信息,这个信息一向坚持到毗连被开释。下面的代码,就是为用SCOTT账号上岸的毗连,举行了一次客户代码的映照(SCOTT->ALFKI),并且,随时能够SYS_CONTEXT来查询。

详细代码以下:

SQL>connectscott/tiger@oracle;

已毗连。

SQL>executesecusr.Customer_security_context.set_customerid;

PL/SQL历程已乐成完成。

SQL>selectSYS_CONTEXT(CUSTOMER_CONTEXT,CUSTOMERID)FROMDUAL;

SYS_CONTEXT(CUSTOMER_CONTEXT,CUSTOMERID)

--------------------------------------------------------------------------------

ALFKI

可是,我觉的还不敷,可以做到每一个毗连创建的时分,就主动完成这类映照,使人乐意的是,ORACLE8i供应了体系级的触发器,让我轻松地完成。

--SCOTT用户上岸触发器

connectsystem/manager@oracle

CREATEORREPLACETRIGGERscott.tg_set_usr_context

AFTERLOGONONDATABASE

BEGIN

secusr.customer_security_context.set_customerid;

END;

--断失落connection,从头上岸

Oracle8iEnterpriseEditionRelease8.1.7.0.0-Production

WiththePartitioningoption

JServerRelease8.1.7.0.0-Production



SQL>CONNECTscott/tiger@oracle

已毗连。

SQL>selectSYS_CONTEXT(CUSTOMER_CONTEXT,CUSTOMERID)FROMDUAL;

SYS_CONTEXT(CUSTOMER_CONTEXT,CUSTOMERID)

--------------------------------------------------------------------------------

ALFKI

SQL>

好了,够复杂吧。

接纳VirtualPrivateDatabase怎样到达SQLDML上的数据把持会见请求呢?

VirtualPrivateDatabase手艺能够对一张表的纪录设置DML操纵的过滤战略。ORACLE8i供应了POLICY的观点,而且为此装备了一套体系程序包,来完成设置。上面,我来先容一下:

connectsecusr/secusr@oracle

--做一个函数,前往对应的过滤前提

createorreplacepackagesecusr.customer_securityis

functioncustomer_sec

returnVARCHAR2;

end;



createorreplacepackagebodysecusr.customer_security

is

functioncustomer_sec(d1varchar2,d2varchar2)

returnvarchar2

IS

begin

IFSYS_CONTEXT(USERENV,SESSION_USER)IN(SYS,SYSTEM,SECUSR)THEN

RETURNNULL;

ELSE

RETURNcustomerid=||SYS_CONTEXT(CUSTOMER_CONTEXT,CUSTOMERID)||;

ENDIF;

end;

end;



--设置表数据的支解过滤

EXECUTEDBMS_RLS.ADD_POLICY(SCOTT,"Customers",Customers_sec_Policy,

SECUSR,

customer_security.customer_sec,

SELECT,UPDATE,DELETE);

customer_security程序包的customer_sec函数完成了,依据但前的CONTEXT中CUSTOMERID的内容,来前往一个过滤的战略,函数的参数情势是流动的。经由过程dbms_rls程序包的ADD_POLICY历程,把战略前提同表绑定以来,今后,每次select,update,delete城市主动使用这个战略。

好了,如今我们来测试一下

--用SCOTT上岸,只能看到本人的信息

SQL>connectscott/tiger@oracle;

已毗连。

SQL>selectcustomerid,cityfrom"Customers";



CUSTOMERIDCITY

----------------------------------------

ALFKIBerlin

--用SYSTEM上岸,能够看到一切的

SQL>connectsystem/manager@oracle;

已毗连。

SQL>selectcustomerid,cityfrom"SCOTT"."Customers";

CUSTOMERIDCITY

----------------------------------------

ALFKIBerlin

ANATRMéxicoD.F.

ANTONMéxicoD.F.

AROUTLondon

BERGSLule?D.F.

BLAUSMannheim

BLONPStrasbourg

BOLIDMadrid

BONAPMarseille

BOTTMTsawassen

BSBEVLondon

十分好,完整满意了请求,如今能够宁神地把SCOTT账号给客户(ALFKI)了,客户能够查询本人的定单情形,固然只能是本人的。

SQL>SELECTa.orderid,a.customerid,a.orderdate,

2sum(c.UnitPrice*c.Quantity*(1-c.Discount))asTotalMoney

3FROM"Orders"a,"Customers"b,"OrderDetails"c

4wherea.customerid=b.customeridanda.orderid=c.orderid

5groupbya.orderid,a.customerid,a.orderdate;



ORDERIDCUSTOMERIDORDERDATETOTALMONEY

----------------------------------------------------------------------

10643ALFKI25-8月-97814.5

10692ALFKI03-10月-97878

10702ALFKI13-10月-97330

10835ALFKI15-1月-98845.8

10952ALFKI16-3月-98471.2

11011ALFKI09-4月-98933.5

已选择6行。

上面,让我总结一下VirtualPrivateDatabase的长处:

l供应了一种可行的、牢靠的、对用户完整通明的行划定规矩把持计划

同本人创建一套用户把持权限分歧,VirtualPrivateDatabase对用户是通明的,你的使用程序不必往思索这点,你的使用程序必要的是加倍会合于你的营业处置历程的完成,而不要让数据断绝把持,成为你营业处置的一个历程。你能够完整先开辟功效使用,然后再加上数据断绝的把持,而这类把持,是基于背景数据库体系的,这类变化与现有的使用程序完整兼容,不会引发现有的程序不克不及运转

l把持加倍周密,不但关于营业体系才无效

因为接纳的是背景数据库手艺,以是这类把持,对一切的使用(除营业体系,数据库办理工具等等)都起到了把持感化。比拟之下,接纳本人的权限把持的使用中,只能做到在营业体系的使用中无效,而其他(sqlplus,sqlplusworksheet等等)就完整没无效果。并且年夜多体系都接纳利用一个数据库账号上岸到体系的计划,在这类情形下,这个账号关于营业数据库一样平常来讲操纵权限很高,而这个账号一旦泄露,打击者使用sqlplus工具能够方各处夺取数据。

l和用使用程序本人完成的办法比拟,这类手艺加倍天真,并且便于办理,同时开辟本钱也是最低的。

接纳了这类行纪录把持手艺,不必要经由过程使用程序完成,年夜年夜地简化了使用体系地庞大性,同时也让你的体系的布局很明晰,而呈现毛病的大概性就更低了。固然,你本人创建的把持体系也能够做到ORACLE8i的功效,可是会年夜年夜加年夜开辟本钱。

l关于ASP(使用服务供给商)体系,满意了用户数据寄存在一同,但又可以自力分隔会见的请求。笔者以为,这项手艺,关于构建ASP使用体系的用户出格有效,充实使用ORACLE供应的新手艺,让你的体系加倍平安、牢靠。

总之,VirtualPrivateDatabase是一个功效壮大的行级划定规矩把持手艺,是ORACLE8i供应给我们的一个强无力的特征,充实地使用,能够年夜小节省软件开辟本钱。

笔者以为VirtualPrivateDatabase手艺是一个十分有效的手艺,而在SQLServer2000和SybaseASE12.5中,没有看到相似的手艺。










“对于MySQL数据库,无论是在开发方面,还是支持方面,现在有大量强大的MySQL学习教程可以选择。每一个新手开发者可以轻松地使用MySQL数据库进行开发。

莫相离 发表于 2015-1-19 19:56:48

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

灵魂腐蚀 发表于 2015-1-25 21:03:28

我个人认为就是孜孜不懈的学习

因胸联盟 发表于 2015-2-4 02:04:32

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

飘灵儿 发表于 2015-2-9 10:19:06

对于微软系列的东西除了一遍遍尝试还真没有太好的办法

小妖女 发表于 2015-2-27 05:37:36

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

分手快乐 发表于 2015-3-8 22:32:52

始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。

小女巫 发表于 2015-3-16 16:23:18

其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。

海妖 发表于 2015-3-22 23:37:54

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)
页: [1]
查看完整版本: MYSQL网站制作之ORACLE 的Virtual Private Database的全...