辽宁工程技术大学软件工程系第八章视图、序列、同义词管理辽宁工程技术大学软件工程系8.1.1创建普通视图具有CREATEVIEW权限就可以在自己的帐户下创建视图;具有CREATEANYVIEW权限就可以在自己的帐户下或其他帐户下创建视图;具有DROPVIEW或DROPANYVIEW就可以删除视图;辽宁工程技术大学软件工程系创建视图的语法CREATE[FORCE|NOFORCE]VIEWview_name[(alias[,alias]…)]ASSQLQuery[WITHCHECKOPTION[CONSTRAINTconstraint_name]]WITHREADONLY[CONSTRAINTconstraint_name]];辽宁工程技术大学软件工程系创建视图的语法CONSTRAINT约束WITHCHECKOPTION:不允许INSERT和UPDATE;WITHREADONLY:不允许INSERT、UPDATE和DELETE。辽宁工程技术大学软件工程系8.1.1创建普通视图Createviewdept30Asselectename,deptno,job,sal*12sal12Fromempwheredeptno=30;辽宁工程技术大学软件工程系创建连接视图CREATEVIEWemp_deptASSELECTemp.empno,emp.ename,emp.deptno,emp.sal,dept.dname,dept.locFROMemp,deptWHEREemp.deptno=dept.deptnoANDdept.locIN('DALLAS','NEWYORK','BOSTON');辽宁工程技术大学软件工程系创建连接视图对于连接视图来说,它的操作要遵循下面规则:1、一般规则连接视图的任何INSERT、UPDATE、DELETE操作在同时刻只能修改其下属表.2、UPDATE规则连接视图的带有WITHCHECKOPTION子句,则不能进行UPDATE.辽宁工程技术大学软件工程系创建连接视图3、DELETE规则连接视图存在一个保留关键字,则该连接视图可以进行删除;如果建立时带有WITHCHECKOPTION子句,则连接视图不能进行DELETE。4、INSERT规则:如果建立时带有WITHCHECKOPTION子句,则连接视图不能进行INSERT。辽宁工程技术大学软件工程系创建连接视图Createviewclerk(id_number,person,depart,position)Asselectempno,ename,deptno,jobFromempwherejob='clerk'Withcheckoptionconstraintwco;用户不能往clerk视图中作insert(或update)非'clerk'的记录。辽宁工程技术大学软件工程系关于withcheckoption默认情况下,由于行通过视图进行添加或更新,当其不再符合定义视图的查询的条件时,它们即从视图范围中消失。例如,可创建一个查询,从而定义一个视图以在表中检索所有员工薪水低于$30,000的行。如果该员工的薪水涨到了$32,000,则查询视图时该特定员工将不再出现,因其薪水不符合视图所设的标准。但是,辽宁工程技术大学软件工程系关于WITHCHECKOPTIONWITHCHECKOPTION子句强制所有数据修改语句均根据视图执行,以符合定义视图的where语句中所设的条件。如果使用该子句,修改行时需考虑到不让它在修改完后从视图中消失。任何可能导致行消失的修改都会被取消,并显示错误信息。这个选项可以确保数据库中正在修改的数据的完整性。辽宁工程技术大学软件工程系关于WITHCHECKOPTIONCREATEVIEWEMP_VIEW2(EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)ASSELECTEMPNO,ENAME,DEPT,JOB,HIREDATEFROMEMPWHEREDEPT=10WITHCHECKOPTION;下列SQL语句可能会导致不能更新:SQLUPDATEEMP_VIEW2SETDEPT=20WHEREDEPT=10;已更新0行。辽宁工程技术大学软件工程系检查无效视图select'alterview'||owner||'.'||object_name||'compile;'fromdba_objectswherestatus='INVALID'andobject_type='VIEW';辽宁工程技术大学软件工程系导出视图的语法setlinesize150setpagesize1000setarraysize8setfeedbackoffsetheadingoffsetlong5000colview_namefora20coltextfora80select'CREATEORREPLACEVIEW'||VIEW_NAME||'AS',TEXTFROMUSER_VIEWSorderBYVIEW_NAME;辽宁工程技术大学软件工程系8.2管理实体视图Oracle8i以后的版本提供可以创建实体视图(MATERIALIZEDVIEW),它确实存放有物理数据。实体视图包含定义视图的查询时所选择的基表中的行。对实体视图的查询就是直接从该视图中取出行。辽宁工程技术大学软件工程系创建实体视图前提要有授权创建实体视图的权限(CREATEMATERIALIZEDVIEW或CREATESNAPSHOT);必须有访问各个主表的权限,即有SELECTANYTABLE的系统权限。如果在另外的用户模式下创建实体视图,则:需要有CREATEANYMATERIALIZEDVIEW或CREATEANYSNAPSHOT、SELECTANYTABLE权限;必须有CREATETABLE、SELECTANYTABLE系统权限。辽宁工程技术大学软件工程系创建实体视图CREATEMATERIALIZEDVIEW[SNAPSHOT][schema.][materializede_view|snapshot][[[segment_attributes_clause|LOB_storage_clause|CACHE|NOCACHE]|[CLUSTERcluster(column1,…)]]patitioning_clausesparallel_clausebuild_clause]|[ONPREBUILTTABLE[WITH|WITHOUT]REDUCEDPRECISION]USINGINDEX[physical_attributes_clause|TABLESPACEtablespace]refresh_clauseFORUPDATE[DISABLE|ENABLE]QUERYREWRITEASsubquery;辽宁工程技术大学软件工程系创建实体视图示例:CREATEMATERIALIZEDVIEWmv1REFRESHFASTONCOMMITBUILDIMMEDIATEASSELECTt.month,p.prod_name,SUM(f.sales)ASsum_salesFROMtimet,productp,factfWHEREf.curDate=t.curDateANDf.item=p.itemGROUPBYt.month,p.prod_name;辽宁工程技术大学软件工程系创建实体视图例2.自动刷新的实体视图:下面语句创建一个复杂的实体视图all_emps,它查询DALLAS和BALTIMORE中的职工表:CREATEMATERIALIZEDVIEWall_empsPCTFREE5PCTUSED60TABLESPACEusersSTORAGE(INITIAL50KNEXT50K)USINGINDEXSTORAGE(INITIAL25KNEXT25K)REFRESHSTARTWITHROUND(SYSDATE+1)+11/24ASSELECT*FROMfran.emp@dallasUNIONSELECT*FROMmarco.emp@balt;辽宁工程技术大学软件工程系创建实体视图不考虑刷新的问题,上述实体化视图可简化为:CREATEMATERIALIZEDVIEWall_empsPCTFREE5PCTUSED60TABLESPACEusersASSELECT*FROMemp;注意:首先,在创建实体视图的表上应该有实体化视图日志CREATEMATERIALIZEDVIEWlogonscott.emp;辽宁工程技术大学软件工程系8.2.3与实体视图有关的数据字典1.DBA_MVIEW_AGGREGATES存放实体视图的基本信息2.DBA_MVIEW_ANALYSIS存放实体视图的附加信息3.DBA_MVIEW_DETAIL_RELATIONS存放实体视图的子查询等信息4.DBA_MVIEW_DETAIL_JOINS存放实体视图的列的连接关系信息5.DBA_MVIEW_DETAIL_KEYS存放实体视图的列或表达式的信息6.DBA_MVIEWS存放实体视图的基本信息辽宁工程技术大学软件工程系8.3管理序列序列是一个发布唯一数字的ORACLE对象,在需要时,每次按1或一定增量增加。序列通常用于产生表中的唯一主键或唯一索引等。序列(sequence)是Oracle提供用于产生唯一号的一个简单方法。用序列技术可以实现许多一般程序所不能完成的工作,比如产品加密的产品号等。辽宁工程技术大学软件工程系8.3管理序列1.Oracle序列号和高速缓存(Cache)Oracle的参数文件init.ora文件中有一个参数cache。它就是用于设置序列号的初始化参数。当init.ora文件设置cache大于0,并且在创建序列时设置了cache值时:在实例启动后,Oracle自动产品一组序列号放在缓存中以便加快访问速度;当这组序列号被用完时,Oracle有自动产生另外一组放序列号放在缓存中;当实例关闭或异常退出时,该组还未用完的序列号将丢失,从而产生跳号现象。为了避免序列号丢失现象产生,可以设置初始化参数为0,并创建序列时指定辽宁工程技术大学软件工程系建立序列CREATESEQUENCEemp_noINCREEMNTBy1STARTWITH1NOMAXVALUENOCYCLENOCACHE;辽宁工程技术大学软件工程系使用序列例:使用sequenceinsertintoorders(orderno,custno)values(order_seq.nextval,1032);updateorderssetorderno-orderno=order_seq.nextvalwhereorderno=10112;辽宁工程技术大学软件工程系使用序列一般情况下是在nextval使用之后才能使用currval,可以用它来产生同样的号,比如有一定货号有多种商品和数量:insertintolineitems(orderno,partno,quantity)values(order_seq.currval,20231,3);insertintoline_items(orderno,partno,quantity)values(order_seq.currval,29374,1);辽宁工程技术大学软件工程系创建序列在ORACLE8中,如果在建立序列的语句中未加上NOCACHE,则有可能在关闭系统再启动后产生跳号现象。如果你的系统要求不许跳号,请在创建序列时在后面加NOCACHE。辽宁工程技术大学软件工程系修改序列例1.将emp_no修改为步长为2,最大值为9999:ALTERSEQUENCEemp_noINCRMENTBy2MAXVALUE9999CYCLE;辽宁工程技术大学软件工程系查询序列视图与序列有关的视图有:ALL_SEQUENCESDBA_SEQUENCESUSER_SEQUENCES辽宁工程技术大学软件工程系8.4管理同义词Oracle的同义词(synonym)是模式的对象的别名。通过