马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
到2009年,甲骨文的数据库Oracle已经诞生了30周年,而MySQL却连它的一半时间都没有。微软的SQLServer仅仅比MySQL大两年,但是SQLServer的发布是建立在Sybase的基础上。oracle|工具|数据|数据库从工具(比方数据库表、索引、束缚、触发器等)中提取DDL命令的一般办法触及到的操纵包含从这些工具中提取元数据(metadata),并把这些数据存储在内存中。只管今朝有良多剧本能够完成如许的功效,可是它们一般都是不完全的大概过期的。侥幸的是,Oracle9.2供应了一个完成如许的功效的API:DBMS_METADATA程序包。
在良多情形下,数据库中数据的保护操纵请求我们提取多种工具(比方数据库表、索引、束缚、触发器等)的DDL(DataDefinitionLanguage,数据界说言语)。
比来我承当了一个义务,我必要编写一组数据库程序包来实行高功能的大批的数据删除(DELETE)操纵。如许的操纵请求我具有提取和存储数据库工具DDL的相干手艺。
提取和存储数据库工具的DDL的办法以下:
・创建与源表布局不异的数据表,可是它不带主键、备用键和内部键束缚。
・比方,利用MyTable_X,个中MyTable是要被删除的方针数据表。
・把必要保留的数据拔出新创建的数据表(MyTable_X)中。
・利用NOLOGGINGPARALLEL选项在新数据表上创建索引。
・在新数据表上创建束缚。
・MyTable和MyTable_X数据表举行互换。把主表更名为MyTable_T,把MyTable_X更名为MyTable。
・考证了局并删除MyTable_T表。
很分明,为了编写完成下面方针的代码,你必需提取数据库工具的元数据(界说和被选中的属性),并把它存储在内存中,如许在实行下面的操纵的时分才干够利用它。
在网上存在大批的剧本,它们能够从多种Oracle数据字典(user_tables、user_indexes、user_ind_columns、user_constraints、user_cons_columns等)中提取数据库工具的元数据,接着为特定的工具机关DDL命令。这些剧本的一个成绩是,它们一般是SQL*Plus剧本,它会天生客户端文本文件,而这个文件不克不及被服务器端代码会见。它们的次要成绩有:
・不完全:不克不及提取一切的选项,并组合进DDL语句中。
・过期了:这些剧本一般不撑持Oracle最新的数据库特征--分区(partitioning)、基于函数的索引、主动段空间办理(ASSM)等。这些剧本大概溃散或天生毛病的DDL语句。
成绩总结:只管有大批的从Oracle数据字典中提取数据库工具元数据的剧本,可是它们中的年夜多半要末不完全,要末过时了。
办理计划:利用DBMS_METADATA程序包,进修怎样用最好的、没有毛病的和易于保护的体例实行下面的事件。
利用Oracle的当地API:DBMS_METADATA程序包
Oracle数据库接纳增补PL/SQL程序包的情势供应了丰厚的事后包装好的API。Oracle9.2版本中引进的DBMS_METADATA程序包大概恰好合适你的需求。它包括了用于检索数据库工具界说的API。
我们将利用的API次要是DBMS_METADATA.GET_DDL函数。这个函数前往的工具界说SQL字符串是CLOB。它具有上面一些输出参数:
・object_typeVARCHAR2
・nameVARCHAR2
・schemaVARCHAR2DEFAULTNULL
・versionVARCHAR2DEFAULT’COMPATIBLE’
・modelVARCHAR2DEFAULT’ORACLE’,
・transformVARCHAR2DEFAULT’DDL’
上面创建了一个用于测试的EmpTest数据表,它带有索引和束缚:
createtableEmpTest
(
empNointegernotnull,
lastNamevarchar2(30)notnull,
firstNamevarchar2(20)notnull,
jobvarchar2(9)’
hireDatedate’
isActivenumber(1)
constraintEmpTest_CK1
check(isActivein(0,1)),
salarynumber(9,2),
commisionnumber(9,2),
deptNonumber(2),
constraintEmpTest_PK
primarykey(empNo),
constraintEmpTest_AK1
unique(lastName,firstName)
);
createindexEmpTest_HireDate_Salary
onEmpTest
(
salary,
hireDate
);
运转下面的剧本以后,就创建了一个带有三个索引(两个独一的和一个不惟一的索引)的EmpTest表:
selectindex_name,index_type,uniqueness
fromuser_indexes
wheretable_name=’EMPTEST’;
索引称号索引范例独一性EMPTEST_AK1NORMALUNIQUEEMPTEST_HIREDATE_SALARYNORMALNONUNIQUEEMPTEST_PKNORMALUNIQUE
EmpTest表还包含六个束缚:
・一个主键-EmpTest_PK
・一个备用键-EmpTest_AK
・一个反省束缚-EmpTest_CK1
・体系天生的(SYS_*)三个非空的束缚,称号以下:
束缚称号束缚范例索引称号SYS_C002144065CSYS_C002144066CSYS_C002144067CEMPTEST_CK1CEMPTEST_PKPEMPTEST_PKEMPTEST_AK1UEMPTEST_AK1
如今我们实行匿名的PL/SQL代码块来挪用DBMS_METADATA.GET_DDL函数,检索数据表的界说。
DBMS_OUTPUT程序包只能输入最长为255个字符的字符串,因为在处置数据表的DDL字符串的时分太简单凌驾这个限定,以是这是一个成绩。为懂得决这个成绩,我们利用了当地历程Show()(列表1所示)。
列表1:挪用DBMS_METADATA.GET_DDL()函数的PL/SQL代码块
declare
vClobclob;
vLongStringvarchar2(32767);
vOffSetpls_integer:=0;
vLengthpls_integer:=0;
vTablevarchar2(30):=’EmpTest’;
procedureShow(pVariablevarchar2,pLineSizepls_integer:=80)
is
begin
dbms_output.enable(1000000);
if(length(pVariable)>pLineSize)
then
dbms_output.put_line(substr(pVariable,1,pLineSize));
Show(substr(pVariable,pLineSize+1),pLineSize);
else
dbms_output.put_line(pVariable);
endif;
endShow;
begin
--猎取DDL
vClob:=dbms_metadata.get_ddl(’TABLE’,upper(vTable));
--猎取CLOB长度
vLength:=dbms_lob.GetLength(vClob);
dbms_output.put_line(’DDLlength:’||to_char(vLength));
vOffSet:=1;
dbms_lob.read(vClob,vLength,vOffSet,vLongString);
--封闭CLOB
if(dbms_lob.isOpen(vClob)>0)
then
dbms_lob.close(vClob);
endif;
Show(vLongString,80);
end;
列表1天生上面的输入信息:
DDLlength:461
CREATETABLE"BORIS"."EMPTEST"
("EMPNO"NUMBER(*,0)NOTNULLENABLE,
"LASTNAME"VARCHAR2(30)NOTNULLENABLE,
"FIRSTNAME"VARCHAR2(20)NOTNULLENABLE,
"JOB"VARCHAR2(9),
"HIREDATE"DATE,
"ISACTIVE"NUMBER(1,0),
"SALARY"NUMBER(9,2),
"COMMISION"NUMBER(9,2),
"DEPTNO"NUMBER(2,0),
CONSTRAINT"EMPTEST_CK1"CHECK(isActivein(0,1))ENABLE,
CONSTRAINT"EMPTEST_PK"PRIMARYKEY("EMPNO")
USINGINDEXPCTFREE10INITRANS2MAXTRANS255
STORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"TOOLS"ENABLE,CONSTRAINT"EMPTEST_AK1"UNIQUE("LASTNAME","FIRSTNAME")
USINGINDEXPCTFREE10INITRANS2MAXTRANS255
STORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"TOOLS"ENABLE)PCTFREE10PCTUSED40INITRANS1
MAXTRANS255NOCOMPRESSLOGGING
STORAGE(INITIAL65536NEXT1048576MINEXTENTS1MAXEXTENTS2147483645
PCTINCREASE0FREELISTS1FREELISTGROUPS1BUFFER_POOLDEFAULT)
TABLESPACE"TOOLS"
它运转的情形太好了,前往的数据表的DDL字符串带有主键EmpTest_PK、备用键EmpTest_AK1和反省束缚EmpTest_CK1。它创建了两个独一的索引来撑持主键和备用键束缚。这不是你必要的了局:你必要一个表,可是为了加速数据载进速率,它不要包括束缚和索引。只要在数据载进事情完成今后,你才创建索引和束缚。
包管工具的界说自力的别的一个缘故原由在于天真性:你大概必要改动工具创建的序次。
如今能够计划一个数据布局来存储工具的元数据了。
<FONTcolor=#000000>
[1][2][3]下一页
WindowsAzureSQLDatabase并不支持数据压缩和表分区之类的功能,而且SQLDatabase支持的Transact-SQL语言只是完整版的一部分。另外,因为解决方案提供商不能控制物理资源,所以他们不能将数据文件和索引分配给特定的硬件。 |