2003-9-28 17:24
zdygk
第三章 UDB的概念<br />提纲 <br /> 熟练掌握DDL语句<br /> 了解表、视图、索引、模式、用户和组、别名等数据库对象的概念<br /> <br />3.1 建立表和其概念<br /> 3.1.1表(Table)<br /> 表是数据库的基本组成单元,是客观世界中实体的一种描述。表由行、列组成。一个表至多可有255列,表的每列描述了对应实体的一个属性,同一列的数据都具有相同的数据类型。表的每一行都描述了一个实体的信息。一个表最多只能有64GB数据。在创建表前,必须显式或者隐式地连接到已建立的数据库。<br /> SQL语言中CREAT TABLE创建一个新的表。表的创建者必须拥有:系统管理员SYSADM权限,或者数据库管理员DBADM权限,或者对该数据库拥有CREATETAB权限,如PUBLIC用户。<br /> 1.CREATE TABLE语句定义了表的列集、主键约束、引用约束、检查约束、数据存放的表空间等信息。完整的语法见图3.1。<br /><br /><br /> <br /><br /><br /> 图3.1 创建表语法图<br /> 。 tablename: 指明了新建表的名字。该表名可以是显式或隐式地限定,但这些表名不能是系统定义的目录表、视图、别名。前缀限定词也不能是SYSIBM,SYSCAT或者SYSTTAT这些保留字,缺省的限定词是该表的创建者的用户标识(这里限定词即该表的模式名)。<br /> 。 column_definition: 定义了表的属性集。<br /> 。 主键约束(primary-key-constraint)定义该表的主关键字,每个表只许有一个主关键字。<br /> 。 引用约束(referential-constraint)定义了外关键字的引用约束。<br /> 。 检查约束(check-constraint)定义了对数据列的检查约束。<br /> 。 DATA CAPTURE指出在使用数据传播管理器(Data Propagation Manager)时,如果该表发生数据传播,是否将有关信息写到日志库中去。<br /> 2. 表空间选项(tablespace_options)指出该表的索引存放的表空间名以及长字段数据存放的长型表空间名。语法见图3.2。<br /><br /> <br /> 图3.2 tablespace-options语法图<br />3. 表的属性定义(column-definition)指出各列列名、数据类型、是否主关键字、所引用的外关键字是否允许空值以及受到的检查约束等。语法见图3.3。<br /><br /> <br /><br />(1)lob_option_clause只适用于大对象数据类型(BLOB,CLOB和DBCLOB)和基于大对象数据的用户自定义类型。<br />(2)为了和DB2第一版兼容,关键字CONSTRAINT可以在定义references_clause的列定义中省略。<br /> 图3.4 column_definition语法图<br /> 。 NOT NULL禁止该列数据值为空。如果不用NOT NULL,该列可以包含空值,而且缺省值为空值。NOT NULL WTTH DEFAULT禁止列包含空值,并且提供非空缺省值。0是缺省值数字型值,空格是缺省定义字符串,当前日期、时间戳是日期、时间戳数据类型缺省值。<br /> 。 缺省短语(default_clause)指出该列列值缺省时的情况。<br /> 。 lob_options_clause指出该大对象列的修改操作否记录到日志库中去,以及大对象数据是否压缩等特性。<br /> 。 PRIMARY KEY定义了仅由一列构成主关键字的方法,等价于PRIMARY KEY(列名)。<br />3.1.2 数据类型<br /> 数据类型(data_type)指出系统中可用作数据列的数据类型的合法类型。语法见图3.5。<br /><br /> <br /> 图3.5 数据类型语法图<br /> 。 DEFAULT:给未指定列值或指定列值为DEFAULT的列指定一个缺省值。如果在该DEFAULT语句中,没有指明缺省值,则该缺省值视该列数据类型而定。语法见图3.6。<br /> <br /><br /><br /> 图3.6 default_clause语法图<br /> 。 cast_function<br /> 该说明只适用于:用户自定义类型、BLOB或时间日期型(日期DATE,时间TIME或者时间戳TIMESTAMP)的列设定缺省值时的类型转换。<br /> 6. lob_options_cluase(大对象数据选项)语法见图3.7。<br /><br /> <br /><br /> 图3.7 lob_options_clause语法图<br /> LOGGED表示对该列的任何修改都将记录到日志库,这样在以后需要时,可以恢复数据库。它是缺省设置。大于1GB的列不可以设置为LOGGED,大于10MB的列不推荐使用。COMPACT选项指定大对象数据应该占用最少的磁盘空间。<br />3.1.3 建立主外关键字的依赖表<br /> 建立两个表之间的联系,一个表为父表,另一个表为依赖表,父表有一个主关键字或唯一关键字,依赖表有一个主关键字和外关键字,依赖表的外关键字要引用父表的主关键字或唯一关键字。在插入父表数据时,只需检查主关键字约束和CHECK约束,而插入依赖表数据时,除要检查主关键字的约束外,还要检查外关键字是否与父表的主关键字或唯一关键字的值匹配或为空值。在删除父表数据时,要遵守所定义的删除规则。<br /> 7. 规则短语(rule_clause)定义了依赖表的操作。语法见图3.8。<br /><br /> <br /> 图3.8 规则短语语法图<br />8. 引用短语(references_clause)定义该数据列为外键。语法见图3.9 。<br /><br /> <br /><br /> 图3.9 引用短语语法图<br />9. 主键约束(primary-key-constraint)语法见图3.10。<br /> <br /><br />图3.10 primary-key-constraint语法图<br /> 。 PRIMARY KEY(COLUMN_NAME1,?,COLUMN_NAMEn)<br /> 定义了主键列的构成,主键列列值不能为空值。主键最多为16列,且总列长不超过255个字节。其中,数据类型为LOB,LONG,VARCHAR或者LONG VARGRAPHIC的列不可以作为主键列。<br /> 10. 引用约束(referential - costraint)语法见图3.11所示。<br />。 FOREIGN KEY(COLUMN_NAME1,?,COLUNM_NAMEn)定义了外键列的构成。和主键一样,外键最多为16列,且总列长不超过255个字节。因为外键列引用的是父表的主键列,所以外键列的数据类型不能是LOB、LONG、VARCHAR或者LONG VARGRAPHIC。<br /><br /> <br /><br /> 图3.11 引用约束语法图<br /> 。 REFERENCES table_name这里所引用的table-name必须是在目录表中用户定义的一个基表,但不能是系统创建的目录表。假设用户想创建表T1,它引用表T2,(这里T1、T2也可能是同一个表),它必须满足下列三个条件:<br /> (1) 表T2定义了一个主键;<br /> (2) 表T2拥有REFERENCE权限;<br /> (3) 表T1中指定的外键必须是T2的主键<br /> 从上述条件可以看出,表T2的主键和表T1的外键列列数相等,在这里T2为父表,T1为依赖表。<br /> 。 规则短语(rule_clause)定义了依赖表的操作。<br />11. 检查约束(check_constraint)语法见图3.12。<br /><br /> <br /><br />(1)为了与第一版兼容,constraint_name可以跟在FOREING KEY后(在没有CONSTRAINT关键字的情况下)。<br /> 图3.12 引用约束语法图<br /><br /> ON DELETE指明当父表中删除一行时,依赖表要采取的相应操作,有四种可能操作:<br /> (1). NO ACTION(缺省)RESTRICT指当父表删除一行且依赖表中部分行引用了该行主键值时,不做任何修改操作且报错。<br /> (2). CASCADE指明当父表删除一行时,其依赖其中相应的行均要被删除,即发生连锁删除操作。这种行为又称为数据传播(data propagation)。<br /> (3). SET NULL指明当父表中一行被删除,该依赖表相应行的外键的列(可设置为空值的列)被设置为空值。<br /> (4). ON UPDATE指明了在更新父表中某些元组时,依赖表将要遵循的规则,规则说明同ON DELETE子句。<br /> 下面举例说明怎样创建表。<br /> 例3.1 :在表空间DEPARTX内创建表TDEPT(DEPTNO,DEPTNAME,MGRNO,ADMRODEPT)。<br /> CREATA TABLE TDEPT ( DEPTNO CHAR(3), DEPTNAME CHAR(36) NOT NULL,<br /> BOTTOM_SALARY DECIMAL(9,2) NOT NULL WTTH DEFAULT, MGRNO CHAR(6),<br /> ADMRDEPT CHAR(3) NOT NULL,<br /> PRIMARY KEY (DEPTNO))<br /> IN DEPARTX;<br />该表用来记录某一部门的部门编号、部门名称、基准工资和上级主管部门,其中主键列为{DEPTNO}。<br />例3.2:在表空间HUMRES中创建表EMPLOYEE,表EMPLOYEE创建时受如下约束:<br /> 部门编号必须在10~100之间;<br /> 雇员职务只能是‘SALES’、‘MGR’、‘CLERK’中的一种;<br /> 自1986年受雇于公司的所有雇员年薪必须高于40,500美元。<br /> CREATE TABLE EMPLOYEE<br /> ( ID SMALLINT NOT NULL,<br /> NAME VARCHAR(9),<br /> DEPT SAMALLINT CHECK (DEPT BETWEEN 10 AND 100),<br /> JOB CHAR(5) CHECK(JOB IN ((sales(,(mgr(,(clerk())<br /> HIREDATE DATE,<br /> SALARY DECIMAL(7,9)<br /> COMM DECIMAL(7,2)<br /> PRIMARY KEY (id)<br /> CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE)>1986 OR SALARY > 40500)))<br />IN HUMRES<br /> <br /><br />3.2 视图<br /> 3.2.1 视图的概念<br /> 视图是从一个或几个基本表导出的表,也可从其他视图导出。某一用户可以定义一个或多个视图,同时经授权一个视图也可为多个用户共享,这一点与基本表类似。按ANSI/SPARC报告的观点,外模式(或子模式)是由若干基本表和若干视图组成。但视图是一个虚表,而基表是一个实表。虚表只有定义,没有对应的物理数据;而实表既有定义,又有对应的物理数据。虽然如此,视图一经定义就可和基表一样被查询、被删除,还可用来定义新的视图。但更新(增、删、改)视图的操作有一定限制。视图也是应用开发的辅助内容。<br />在数据库系统中,查询一个表的返回结果,有许多方法派生出来。在SQL中,建一个视图,只要写一个定义视图的查询并对该视图表中各列的名字加以说明(如不能从查询派生的列就必须加以说明)。<br /> SQL语句CREATE VIEW在一个或多个表或视图的基础上创建一个新的视图,创建视图要求视图创建者拥有SELECT ON TABLE的权限。<br /> 创建视图定义其语法图见3.13。<br /> <br /> 图3.13 创建视图语法图<br /><br /> · viewname定义了所创建的视图名,该视图句可以加模式名作前缀,也可以不加模式名。视图名不能和系统目录表、视图名、别等同名,模式名也不能是SYSIBM,SYSCAT或者SYSTAT中一个。<br /> · column_name用以说明该视图的列名集。<br /> · fullselect是视图定义的核心部分。视图的内容总是由执行SELECT语句而得到的。<br /> ·WTTH CHECK OPTION指明该视图中所插入或修改的行所受的约束必须和视图定义一致,如果视图是只读的,则不指定WTTH CHECK OPTION。<br />· CASCADE视图V上的WTTH CASCADE CHECK OPTION约束是指:它继承父视图的约束,而且将这种约束传递给依赖视图V的其他视图。<br /> . LOCAL 视图V上的WITH LOCAL CHECK OPTION约束是指:它不管继承父视图的约束,只管本视图的约束。<br /> 例3.3 :有一个表PROJECT,现要求在表PROJECT上建立一个视图MA_PROJ,它只含有表PROJECT中项目编以字母‘MA’开头的那些行。<br /> CREATE VIEW MA_PROJ<br /> AS SELECT * FROM PROJECT<br /> WHERE SUBSTR(PROJNO,1,2,)=(MA(<br /> 例3.4:对表PROJECT进行投影操作,选取其中的PROJNO项目编号、PROJNAME项目和RESPEMP(负责项目的人),组成视图MA_PROJ,其中PROJNO以字母(MA(开头。<br /> CREATE VIEW MA_PROJ<br /> AS SELECT PROJNO,PROJNAME,RESPEMP<br /> FROM PROJECT<br /> WHERE SUBSTR (PROJNO,1,2)=(MA(<br /> CREATE VIEW语句中的视图名允许是限定名或非限定定句。如名字是非限定时,系统给一个等价于当前用户标识的库模式名为缺省值(静态SQL语句,用户标识限定了程序,而动态SQL语句,用户标识取当前正执行程序的用户标识)。<br /> 视图中的列名在视图名后列出。如全部列名可从视图查询定义中派生,列名均可省略(例如,每个列名在SELECT子句中没给,说明它从表中直接派生)。下面给出仓库实例中几个视图实例:<br /> 例 3.5 FAST_QUOTES是小于10天交货全部QUOTATIONS信息的显示视图定义:<br /> CREATE VIEW fast _ quotes AS<br /> SELECT suppno, partno, price, responsetime<br /> FROM quotation<br /> WHERE responsetime<10;<br /> 例3.6 LOW_PRICES是列出每个零件最小价格的视图定义:<br /> CREATE VIEW low _ prices (partno, minprice) AS<br /> SELECT partno, min (price)<br /> FROM quotations<br /> GROUP BY partno;<br /> 例 3.7 OLD_ORDERS是列出早2个月前的订单视图定义,它连接3个表后,列出供货商名和零件描述,列名由底层表派生:<br /> CREATE VIEW old _ order AS<br /> SELECT o.patron, o.quantity, o.orderdate,<br /> s.name,p.description<br /> FROM order AS o, suppliers AS s, parts AS p<br /> WHERE s.suppno=o.suppno<br /> AND p.patron=o.partno<br /> AND o.orderdate+2MONTHS<CURRENT DATE;<br /> 建立了视图后,便对视图进行操作。<br /> 1.视图的查询<br /> 视图的查询格式和基本表一样,不过由于在定义视图时已经根据需要进行了限制,所以在视图查询时,就不必再写这些条件了。如在定义一个计算机图书资料的视图,称为COMPUTER BOOK,于是查询计算机图书资料SQL语句为<br /> SELECT *<br /> FROM COMPUTER BOOK<br />如果所加的条件不是定义视图所用的限制条件,则须加在WHERE后面,用显式表达。如找出价格超过2元的计算机图书资料,可表达为<br /> SELECT *<br /> FROM COMPUTER BOOK<br /> WHERE FRICE> 2.00<br /> 2.视图的更新<br /> 对视图的更新最终要转换成对基本表的更新,而视图是由基本表属性抽取组成的,这样插入和修改就不能随便进行,因为有可能破坏数据库的完整性。当然理论上讲,有些视图的某些行列是可以更新的,但判别是否会破坏数据的完整性并不容易。所以一般SQL的DBMS只允许对单个基本表导出的视图进行更新,对只读语句一定不能进行更新,并有下列限制:<br /> (1)若视图的字段由表达式或常数组成,则不允许对此视图执行INSERT和UPDATE操作,但可执行DELETE。<br /> (2)若视图的字段由集函数组成,则此视图不允许更新。<br /> (3)若视图定义中有GROUP BY子句,则此视图不允许更新。<br /> (4)若视图定义中有DISTINCT任选项,则此视图不允许更新。<br /> (5)若视图定义中有嵌套查询,且内外层的FROM子句中的表是相同的,则此视图不允许更新。<br /> (6)若视图由多个基本表导出,则此视图不允许更新。<br /> (7)一个不允许更新的视图所导出的视图不允许更新。<br />应当区分两种不同的情况,一种是从理论上讲已证明不可更新的视图,另一种是系统不支持更新的视图。一般来说,只读视图不可修改。<br /> 视图是体现数据库本质的最重要的特色和功能的。它简化了用户数据模型,提供了逻辑数据独立性,实现了数据共享和数据的安全保密。视图是数据库技术一个十分重要的功能。<br />注:请看数据库系统管理的视图的内容<br />3.3 建立索引和其概念<br />3.3.1 索引<br /> 建表时,为提高检索速度和保证列无重复行,对表的任何一列或多列都可建索引,而该列称为索引(key column)。建索引有3种目的:<br /> 1.为建索引列提供快速检索。改善某些特殊列或值的查询性能。<br /> 2.为建索引提供升序或降序功能。该功能对有ORDER BY和GROUP BY子句的查询特别有用。加快这些子句的实施。当然,这些子句也可以不用索引实施,系统只作简单的分类处理。<br /> 3.为表中某些列保证不出现重复行。因为在建唯一索引时,如列中有重复行,建唯一索引失败返回,利用这一性质,可处理列中重复行。<br /> 在表中,用户可按自己需求,组合各列作为索引项列,并对它建索引,但是,建索引要花费一定开销。主要指空间占用的开销。因为,建索引时,对列值要全部复制,再加上指针,都需占用空间。另一方面开销是在发生表修改时,每次对表的列值修改,相应索引必然要改。实际上,数据库的维护工作中,索引维护经验是很重要的实践内容。虽然,关系型数据库的数据,独立于库模型,允许增加或删除索引。但是,查询的每次执行,与索引的选择是相关的。<br /> 在UDB中,只有三种方法去实施对特殊列保证无重复行。一种方法是对列建唯一索引,另一种方法是对该列指定主关键字,最后一种方法是对该列建唯一关键字。如指定SERIALNO为EMPLOYEE表的主关键字或唯一关键字,为保证列无重复的行,对它建唯一索引。对一个表来说,主关键字只有一个,而唯一关键字可以有多个。建索引语法见图3.14所示。<br /><br />>-CREATE---------+--INDEX--index-name---------------------><br /> '-UNIQUE--'<br />----ON--+-table-name------+--(-----column-name--+----+---)-><br /> <br />>----*--+-------------------------------------+----------><br /> | '-INCLUDE---------(-----column-name---+---)--'<br /> >-----------+---*---+-------------------+---*-------------><br /> '-CLUSTER-' '-PCTFREE--integer--'<br /> +----------------------+--*-------------------------------><br /> '-MINPCTUSED--integer--'<br /> .-DISALLOW REVERSE SCANS--.<br />>------------------------+---*---------------------------><<br /> '-ALLOW REVERSE SCANS-----'<br /><br />图3.14 建索引语句语法<br /> 例 3.9 CREATE INDEX i1 ON suppliers (name);<br /> CREATE UNION INDEX i2 ON quotations (partno, suppno);<br /> CREATE INDEX i3 ON quotations (partno ASC, price DESC);<br /> 其中关键字ASC和DESC是升序和降序的限定表示。建索引上,有些限制:索引项列数不超过16;索引项列的总长度不超过255个字节。<br /> 提示:索引建好后,用RUNSTATS命令(在系统管理中讨论)去汇集统计信息,便于让优化器最佳利用索引。<br />3.3.2 索引的分类<br />按照索引的应用和结构可以有不同的分类方法。<br />(1) 聚集索引和非聚集索引<br />聚集索引不仅是把关键字相近的记录用指针逻辑地连在一起,而且把关键字相近的记录物理地存放在一起。每个表中仅能有一个聚集索引。我们一般建的索引均是非聚集索引,如要建立聚集索引,就要在建索引的命令中加CLUSTER子句。<br />(2) 唯一关键字索引和非唯一关键字索引<br />唯一关键字索引主要是建索引的关键字的值必须唯一,特别是在已存在的表上建唯一索引时,如有关键字的值不唯一,那么建索引失败。对主关键字和唯一关键字,系统会自动建唯一索引。在建索引时,要加UNION的子句。<br />(3) 复合关键字索引和包含关键字索引<br />如建索引,系统会针对关键字的升序或降序方式来帮助提高查询性能,对复合关键字会逐个地按升序或降序来索引。而对包含关键字索引,只对所要索引的关键字按序进行,对所包含的字段不按序进行,只是在索引中增加了字段,常常是对唯一关键字索引做包含字段。<br />注:请看数据库系统管理的有关索引的内容<br />3.4 建立模式<br />模式是数据库对象特征划分的结果集,它可以表示数据库对象集的特点,有一定的安全作用。数据库中所建的每一个对象都有模式,有隐式或显示地增加为对象的前缀。建用户时,系统会为每个用户建立与用户名同名的模式名。当建数据库中的对象时,如写明了它的模式名即对象的前缀,此模式名为该对象的模式;如未指明模式名,那么与当前用户名相同的模式名为当前对象的模式。建模式需要SYSADM 或SYSCTRL的权限。<br />例 3.10 建模式名MEL<br /> CREATE SHEMA MEL;<br />3.5 建立别名<br /> UDB为实现应用程序方便的在不同表上操作,提供了表的别名(alias)这一概念。将SQL语句应用的表名称为目标名,可在SQL语句中等价替代目标名的表名称为该表的别名。利用表名的别名,可使应用程序不修改就能在别的表上操作。<br /> 例如,假设在一个数据库中有2个表,表名为TEST. PARTS和PRODUCT.PARTS。如对TEST.PARTS表建别名如下:CREATE ALIAS parts FOR test. Parts;这样,只要将这个数据库与前面零件仓库应用程序连接,在执行时,应用程序将在TEST.PARTS表上操作。<br /> 如想用PRODUCT.PARTS表替代PARTS表,也可重新定义别名如下:<br /> DROP ALIAS parts<br /> CREATE ALIAS parts FOR product.parts;<br /> 重新连接新的数据库后,前面的应用实例可在PRODUCT.PARTS表上操作。可用REBIND命令重新连接,也可稳式重连接,即修改名命令时,系统会自动完成重新连接。<br /> 建别名语法如图3。15所示。<br /> <br /> 图3。15 建别名语句语法<br /> 语法图中的目标名可以是实际表,也可以是视图或另一个别名。甚至目标名是虚的,没有真正数据内容的。别名说明就是它的名字。用在SQL语句中的别名,它一定有目标名与其对应。如目标名还是别名,则经几层后最终应仍能检索到一个实际的表或视图。<br /> 在上面语法图中的别名,目标名可以是限定名或非限定名。对非限定名,系统都用authid当前名替代。因此,下列各语句均有效。<br /> CREATE ALIAS t1 FOR t2;<br /> CREATE ALIAS s3.t3 FOR t4;<br /> CREATE ALIAS t5 FOR s6.t6;<br /> CREATE ALIAS s7.t7 FOR s8.t8;<br /> <br />3.6 触发器<br /> 3.6.1 概念<br /> 数据库触发器(database trigger)是存储在数据库中的过程,当表被修改时它隐式地被激发(执行)。在UDB中允许在对表发出INSERT UPDATE或DELETE语句时隐式地执行所定义的过程,这些过程称为数据库触发器。触发器存储在数据库中,并与所相关表分别存储。触发器仅可在表上定义。触发器一般用于:<br /> ·自动地生成导出的列值;<br /> ·防止无效的事务;<br /> ·实施更复杂的安全性检查;<br /> ·在分布式数据库中实施跨越结点的引用完整性;<br /> ·实施复杂的事务规则;<br /> ·提供透明事件日志;<br /> ·提供高级的审计;<br /> ·维护同步表复制;<br /> ·收集关于存取表的统计。<br /> 触发器和说明性完整性约束都可用于约束数据的输入,但它们之间有一定区别:<br /> 说明性完整性约束是关于数据库数据总是为“真”的语句。一个完整性约束应用于表中已有数据和操纵表的数据任何语句。<br /> 而触发器约束事务不可应用于在定义触发器前已装入的数据,所以不能保证表中全部数据服从该触发器的规则。触发器实施瞬时约束,即在数据改变时实施约束。<br />3.6.2 触发器的组成 <br /> 一个触发器有三个基本部件:触发事件或语句、触发器的限制、触发器动作。<br /> 触发事件或语句:为引起触发器激发的SQL语句,是对指定表的INSERT、UPDATE或DELETE语句。则<br /> …UPDATE OF Part_on_Hand ON INVENTORY…<br />当表INVENTORY中一行的Part_on_Hand列修改时,激发该触发器。 <br /> 触发器的限制:为一布尔表达式,当触发器激发时条件必须为TRUE。触发器的限制是用WHEN子句指定。<br /> 触发器动作:为一个由SQL语句组成的块。当触发语句发出,触发器的限制计算得TRUE时,它被执行。在触发器动作的语句中,可使用触发器所处理的当前行的列值(新值、老值),使用形式为:<br /> NEW.列名 引用新值;<br /> OLD.列名 引用老值。<br /> 在定义触发器时可指定触发器动作执行次数:受触发语句影响是每一行执行一次,还是对触发语句执行一次。<br /> 行触发器(FOR EACH ROW):对受触发语句所影响的每一行,行触发器激发一次。<br /> 语句触发器(FOR EACH STATEMENT):该类型触发器对触发语句执行一次,不管其受影响行数。<br /> 定义触发器可以指定触发时间,指定激发器动作的执行相对于触发语句执行之后(after)或之前(before)。<br /> BEFORE触发器:该触发器执行触发器动作是在触发语句执行之前。<br /> AFTER触发器:该触发器执行触发器动作是在触发语句执行之后。<br /> 所以对每一触发语句一共可有四种类型触发器。<br /> 触发器的源代码存储在数据库中,在第一次执行时,触发器的源代码被编译,存储在共享池中。如果触发器从共享池中挤了,再使用时必须再重新编译。<br /><br />3.7 存储过程<br />3.7.1 存储过程应用的总体结构<br /> 一般程序执行过程当中都需要访问服务器的数据,这就需要通过网络进行通讯。<br /> 当一个应用程序在客户端机器运行时,每一个SQL语句是分别送往服务器的,每个SQL语句结果也是分别返回客户端程序的。然而,在有些时候,一段程序可能会包含大量的数据库活动而相对较少的交互式。在这种情况下,将这段程序以存储过程的形式放在服务器端就会十分有效,客户端机器只需一条指令即可访问存储过程,从而节省了网络上信息传递,提高了应用程序的效率。<br /> 一般程序的执行过程及存储过程应用的总体结构分别如图3.15,3.16所示。<br /> <br />图3.15 一般程序执行过程<br /> <br />图3.16 存储过程应用的总体结构<br /> 3.7.2 存储过程应用的特点<br /> 使用存储过程可给用户带来如下好处:<br /> 1.减少网络通讯量<br /> 应用程序可能需要处理大量的数据但只要求返回一部分数据,这样应用程序便可以把处理放到服务器端,只返回需要的结果,避免了大量的网络数据传输。<br /> 2.提高服务器使用率<br /> 有的应用程序需执行很多SQL语句,且不需要用户交互,这时应用程序使用服务器的频率很高,此时即可把这组语句放到一起送给服务器执行,不需要用户交互,这些语句越多,节省的网络通讯量就越大。一个应用程序执行一条SQL语句需要两次数据传递,而现在一组SQL语句也只需两次传递。<br /> 3.7.3 激发存储过程<br /> 用户可用以下的方式来建立和使用存储过程:使用DB2产品中提供的工具,用户可以使用任何一种DB2支持的宿主程序语言(C,C+ +,COBOL,FORTRAN,或REXX)来编写存储过程。然后就可以在客户程序中使用CALL语句来调用存储过程。CALL语句可以作为静态SQL 的语句使用,也可以在CLI程序中使用函数SQLPrepare和SQLExecute来调用。<br /> 3.7.4 存储过程的执行<br /> 一个完整的存储过程应用程序包含了两个部分:存储过程本身,它运行在服务器端;客户程序,它运行在客户端。存储过程应用程序要求在调用存储过程时客户端将所有的输入数据全部传递给存储过程,而仅当存储过程执行完毕后,才将结果数据返回给客户端。在存储过程执行时不允许客户程序与存储过程有任何的交互。例如,一个客户程序可以积累一些数据库的更新操作,将它们作为一个批文件传递给数据库的存储过程,存储过程返回一个代码说明整个的执行是成功还是遇到失败而回滚了。