db2 使用| 耗时:0.167秒|62522条结果

DB2联邦(DB2使用联邦功能链接DB2)

一、使用可视窗口创建联邦 1、打开控制中心,然后打开数据库,在其“联合数据库对象”文件右击单击“创建包装器”选项,打开创建包装器窗口,数据源选中DB2,添加包装器名称(名称只有不重复即可)。 切换到设置标签页,选中DB2_FENCED,使用其默认值“N”,“DB2_FENCED”属性用来指定包装
http://www.itnose.net/detail/487347.html 2014-01-23 18:34   [DB2]

DB2联邦(DB2使用联邦功能链接DB2)

一、使用可视窗口创建联邦 1、打开控制中心,然后打开数据库,在其“联合数据库对象”文件右击单击“创建包装器”选项,打开创建包装器窗口,数据源选中DB2,添加包装器名称(名称只有不重复即可)。 切换到设置标签页,选中DB2_FENCED,使用其默认值“N”,“DB2_FENCED”属性用来指定包装
http://www.itnose.net/detail/487346.html 2014-01-23 18:34   [DB2]

DB2 LOCATE 函数的使用

LOCATE 函数 [String] 返回一个字符串在另一个字符串中的位置。  语法 LOCATE( string-expression-1, string-expression-2 [, integer-expression ] )  参数
http://www.itnose.net/detail/6675021.html 2016-11-30 22:11   [DB2]

使用DB2查询的问题

连接DB2数据库进行查询语句时报错: com.ibm.db2.jcc.am.SqlDataException: [jcc][t4][10275][10041][3.61.86] ccsid、编码或语言环境不受支持:“UTF8”。 ERRORCODE=-4220
http://www.itnose.net/detail/6475651.html 2016-03-25 14:33   [JavaWeb]

DB2中的CASE使用

DB2中的CASE使用 1、CASE 某个字段 WHEN 某个值 THEN  赋予某个值 ELSE  赋予另外个值  END 2、或者: CASE 某个字段 WHEN 某个值 THEN  赋予另外个值 END 3、注意: THEN 和 ELSE
http://www.itnose.net/detail/487557.html 2014-01-23 18:35   [DB2]

BizTalk 如何使用 DB2 Adapter

串接来完成接下来的DEMO。 OK deploy succeeded 然后打开管理控制台,查看DB的schema 时候成功的部署了: 配置一个文件接收端口: 创建一个send&receive双向发送端口,使用db2 adapter,触发的方式绑定到第一个接收端口: 注意:这里的
http://www.itnose.net/detail/487550.html 2014-01-23 18:35   [DB2]

使用db2licm命令为DB2安装许可证

将不允许没有许可证的请求。 SOFT指定将把没有许可证的请求记录下来,但是不限制。  -l 列示具有可用许可证信息的所有产品。  -p 更新要在系统上使用的许可证策略类型。 可以指定关键字CONCURRENT、REGISTERED 或 CONCURRENTREGISTERED。另外,可以为“DB2
http://www.itnose.net/detail/497169.html 2014-01-24 17:24   [DB2]

DB2 LIKe

如果想在SQL LIKE里查询有下划线'_'或是'%'等值的记录,直接写成like 'XXX_XX',则会把'_'当成是like的通配符。SQL里提供了 escape子句来处理这种情况,escape可以指定like中使用的转义符是什么,而在转义符后的字符将被当成原始字符,这和C里的'\'很像,但是
http://www.itnose.net/detail/6436881.html 2016-01-13 15:00   [DB2]

DB2实例

instance=myinst 实例目录:此目录包含数据库管理器配置文件、系统数据库目录、节点目录、数据库连接服务目录以及与实例相关  的所有诊断日志和转储文件。实例目录随windows操作系统的版本不同而不同。要验证windows上的缺省目录,可  以使用db2
http://www.itnose.net/detail/518183.html 2014-02-05 14:45   [DB2]

DB2 日志

对数据库进行备份。   归档日志   归档日志不是默认状态,需要配置后才会起作用,DB2使用日志保留模式的时候数据库是可恢复的数据库,支持在线备份、前滚恢复和崩溃恢复。   配置DB2进入归档日志模式主要是靠Logarchmeth1和Logarchmeth2两个参数(注:Logretain参数在
http://www.itnose.net/detail/518157.html 2014-02-05 14:45   [DB2]

db2

;   ) not logged initially特性:如果经常对一个表进行批量插入、更新和删除操作,可以考虑在创建表的时候使用 not logged initially特性,这样做可以提高批量插入、更新和删除的性能。 db2 => create table nolog_tab
http://www.itnose.net/detail/518153.html 2014-02-05 14:45   [DB2]

DB2学习

1.为了使用ORG_ID,由于OCRM_F_MM_MKT_PLAN a 没有ORG_ID,但是OCRM_F_MM_EXECUTE_INST_DESC d 表里面有,可以使a表连接b表,创建临时表t。 select t.PLAN_S  AS MARKET_PLAN_COUNT
http://www.itnose.net/detail/518068.html 2014-02-05 14:43   [DB2]

DB2权限

简介介 在这个系列的 第 1 部分 中您学到,安装和操作 DB2 UDB V8.2 需要某些用户和组帐号。要记住的重点是,这些帐号是在 DB2 UDB 外的安全设施中定义的 ?? 通常是操作系统。用户帐号管理(包括密码策略、命名约定和组定义)都是在这个外部设施上进行的。 图 1. 身份验证和授权 当提交 DB2 请求时,DB2 UDB 与这个外部设施进行交互,从而检验提供的用户 ID 和密码。这种交互称为身份验证,显示在 图 1 的下半部分。DB2 UDB 依赖于这个外部安全设施对用户进行身份验证,只有在身份验证成功时,才授予对 DB2 UDB 资源的访问权。 身份验证成功之后,DB2 UDB 必须判断用户是否具有执行操作所需的权限。这个过程称为授权,显示在 图 1 的上半部分。DB2 UDB 使用两种内部机制来判断授权是否成功 ?? 权限级别和特权。在下面几节中,更详细地讨论这两个概念。 回页首 权限级别 DB2 UDB 定义了一个权限级别层次结构,用于将一组预先确定的管理 权限授予用户帐号组。这些管理权限包括能够对数据库进行备份、迫使用户离开系统、查看表数据,等等。 有四个实例权限级别(SYSADM、SYSCTRL、SYSMAINT、SYSMON)和两个数据库权限级别(DBAMD、LOAD)。在实例级上定义的权限级别应用于这个实例中的所有数据库。 图 2. DB2 UDB 中的权限级别层次结构 权限级别按照 图 2 所示的层次结构进行安排。在这个层次结构的顶部是 SYSADM 权限级别,这是用户在 DB2 UDB 中可以拥有的最高的权限级别。具有 SYSADM 权限的用户可以执行所有可用的 DB2 操作。SYSCTRL 和 SYSMAINT 权限级别提供了 SYSADM 权限的子集,可以管理系统,但是不允许访问表中的任何数据。SYSMON 权限提供了使用数据库系统监视器的能力。DBADM 权限允许用户在一个实例中的特定数据库上执行管理任务,还允许完全访问这个数据库中的数据和对象。LOAD 权限允许用户运行 LOAD 实用程序,这是 DB2 UDB 的高速批量数据装载器。 表 1 总结了每个权限级别及其用途 表 1. 每个权限级别的总结 权限级别 说明和用途 SYSADM DB2 UDB 中最高的管理权限级别 具有 SYSADM 权限的用户可以运行实用程序,发出数据库和数据库管理器命令,以及访问这个数据库管理器实例中任何数据库中任何表中的数据 提供控制这个实例中所有数据库对象的能力,包括数据库、表、视图、索引、包、模式、服务器、别名、数据类型、函数、过程、触发器、表空间、数据库分区组、缓冲池和事件监视器 供需要对实用程序和数据的完全访问权的 DB2 UDB 管理员使用 SYSCTRL 最高的系统控制权限级别 提供对数据库管理器实例和它的数据库执行维护和实用操作的能力 不允许直接访问数据库中的数据 具有连接数据库的隐式特权,并可以执行具有 SYSMAINT 和 SYSMON 权限的用户能够执行的功能 供管理一个包含敏感数据的数据库管理器实例的用户使用 SYSMAINT 次高的系统控制权限级别 提供对数据库管理器实例和它的数据库执行维护和实用操作的能力 不允许直接访问数据库中的数据 具有连接数据库的隐式特权,并可以执行具有 SYSMON 权限的用户能够执行的功能 供维护一个包含敏感数据的数据库管理器实例中的数据库的用户使用 SYSMON 提供获得数据库管理器实例及其数据库的快照的能力 供维护一个包含敏感数据的数据库管理器实例中的数据库,但是只需要诊断数据来进行问题判断的用户使用 不允许改变系统资源的使用 DBADM 对于一个实例中的一个特定数据库 的次高管理权限级别 允许用户运行某些实用程序、发出数据库命令以及访问数据库中任何表中的数据 供需要完全访问数据库对象和数据,但是不需要完整的维护权限的管理员使用 LOAD 允许用户调用 LOAD 实用程序 根据 LOAD 操作的模式,用户还需要被装载的表上的 INSERT 和 DELETE 特权 供只想批量装载一组新数据的用户使用2 对比了每个权限级别允许的常见管理操作。 表 2. 每个权限级别允许的操作的比较 功能 SYSADM SYSCTRL SYSMAINT SYSMON DBADM LOAD MIGRATE DATABASE YES NO NO NO NO NO GRANT/REVOKE DBADM YES NO NO NO NO NO UPDATE DBM CFG YES NO NO NO NO NO ESTABLISH/CHANGE SYSCTRL/SYSMAINT AUTHORITY YES NO NO NO NO NO UPDATE DB/NODE/DCS DIRECTORIES YES YES NO NO NO NO FORCE USERS OFF DATABASE YES YES NO NO NO NO CREATE/DROP DATABASE YES YES NO NO NO NO CREATE/DROP/ALTER TABLE SPACE YES YES NO NO NO NO RESTORE TO NEW DATABASE YES YES NO NO NO NO UPDATE DB CFG YES YES YES NO NO NO BACKUP DATABASE OR TABLE SPACE YES YES YES NO NO NO RESTORE TO EXISTING DATABASE YES YES YES NO NO NO PERFORM ROLLFORWARD RECOVERY YES YES YES NO NO NO START/STOP DATABASE INSTANCE YES YES YES NO NO NO RESTORE TABLE SPACE YES YES YES NO NO NO RUN TRACE YES YES YES NO NO NO OBTAIN MONITOR SNAPSHOTS YES YES YES YES NO NO CREATE/ACTIVATE/DROP EVENT MONITOR YES NO NO NO YES NO QUERY TABLE SPACE STATE YES YES YES NO YES YES PRUNE LOG HISTORY FILES YES YES YES NO YES NO QUIESCE INSTANCES YES YES NO NO NO NO QUIESCE DATABASES YES NO NO NO YES NO QUIESCE TABLE SPACE YES YES YES NO YES YES REORG TABLE YES YES YES NO YES NO RUN RUNSTATS UTILITY YES YES YES NO YES YES LOAD TABLE YES NO NO NO YES YES READ DATABASE TABLE DATA YES NO NO NO YES NO 授予/撤消实例级权限 建立实例级权限的办法是,将在外部安全设施中定义的用户组赋给相关的实例级权限参数(SYSADM_GROUP、SYSCTRL_GROUP、SYSMAINT_GROUP、SYSMON_GROUP)。例如,如果希望用户帐号 KATE 具有 SYSMAINT 权限,那么可以将 KATE 放进 MAINT 组,然后将实例参数 SYSMAINT_GROUP 更新为 MAINT。这样,MAINT 组中的任何用户都将具有 SYSMAINT 权限。要从 KATE 那里撤消 SYSMAINT 特权,只需从 MAINT 组中删除她,或者将 SYSMAINT_GROUP 参数的值改为另一个不包含她的组。在后一种情况下,如果 MAINT 组的其他成员不是新组的成员,那么他们的 SYSMAINT 权限也会被撤消。 实例级权限参数可以从命令行或 Control Center 进行修改。例如,要将 SYSMAINT_GROUP 参数的值改为 MAINT,可以在命令行上执行以下命令: 组名 在所有平台上,组名的长度必须小于等于 30 字节。 update dbm cfg using SYSADM_GROUP MAINT 要让修改生效,必须使用以下两个命令重新启动 DB2 UDB 实例: db2stop db2start 要确认修改已经生效,可以通过执行以下命令来查看参数的值: get dbm cfg 清单 1 中给出了前面的命令及其结果。还可以以相似的方式更新任何其他实例级权限参数。 清单 1. 使用命令行更新实例级权限参数 db2 => update dbm cfg using sysmaint_group maint DB20000I The UPDATE DATABASE MANAGER CONFIGURATION command completed successfully. db2 => db2stop 11/19/2005 21:19:03 0 0 SQL1064N DB2STOP processing was successful. SQL1064N DB2STOP processing was successful. db2 => db2start 11/19/2005 21:19:09 0 0 SQL1063N DB2START processing was successful. SQL1063N DB2START processing was successful. db2 => get dbm cfg Database Manager Configuration Node type = Enterprise Server Edition with local and remote clients ..... SYSADM group name (SYSADM_GROUP) = SYSCTRL group name (SYSCTRL_GROUP) = SYSMAINT group name (SYSMAINT_GROUP) = MAINT SYSMON group name (SYSMON_GROUP) = ..... 要使用 Control Center 修改实例级权限参数,应该打开 Control Center,展开 All Systems 文件夹,展开目标系统,展开 Instances 文件夹,右击目标实例(在这个例子中是 DB2),并选择 Configure Parameters 项(见 图 3)。 图 3. 打开 Control Center 中的 configure parameters 对话框 滚动参数列表(图 4)并找到相关的权限级别参数。点击参数值旁边的按钮来改变它的值。在图 4 所示的例子中,将 SYSMAINT_GROUP 参数的值改为 MAINT。 图 4. 在 Control Center 中修改 SYSMAINT_GROUP 参数 必须停止并重新启动实例,对参数的修改才会生效。在 Control Center 中,再次右击目标实例,并选择 Stop 项。如果提示对是否停止实例进行确认,那么点击 OK 按钮。再次右击目标实例,并选择 Start 项。然后就可以检查参数是否已经生效了。 在 Windows 上的默认 DB2 UDB 安装中,这些实例级权限参数默认为 NULL。这意味着任何属于本地 Administrators 组的用户帐号自动继承这些权限。因此,强烈建议明确地将这些参数的值改为特定的组名,以避免意外的/未授权的访问。在 Linux 和 UNIX 安装上,这不是个大问题,因为 NULL 值默认表示实例拥有者的主组,而这个组在安装之后默认情况下只包含实例拥有者的用户 ID。但是,明确地设置这些参数仍然是好的做法。 以相似方式作为数据库特权授予和撤消数据库级权限(比如 DBADM、CONNECT、CREATETAB 和 LOAD)。这在下一节中讨论。 回页首 特权 实例权限级别这种机制用于将一组预先定义的管理权限授予一组用户帐号,而特权是明确分配给单独用户或组的,允许他们在数据库对象上执行特定操作(例如,创建和删除索引)。特权严格地定义了用户可以执行的任务。例如,用户可能具有读一个表的数据的特权,但是不能更新此数据。 图 5. DB2 UDB 权限和特权的层次结构 图 5 显示 DB2 UDB 中不同的权限和特权级别。范围从表上的特权到模式和存储过程上的特权。图 5 的上部显示前一节描述的实例权限级别。注意 SYSADM 和 DBADM 权限自动获得虚线下面对于某个数据库的所有权限和特权。 表 3 总结了对于用户或用户组可以授予和撤消的数据库权限类型。只有具有 SYSADM 或 DBADM 权限的用户可以授予和撤消这些权限。 表 3. 数据库级权限的总结 数据库权限   CONNECT 允许用户连接数据库 BINDADD 允许用户在数据库中创建新的包 CREATETAB 允许用户在数据库中创建新的表 CREATE_NOT_FENCED 允许用户注册定义为 NOT FENCED 的用户定义函数(UDF)或存储过程 IMPLICIT SCHEMA 允许用户在尚不存在的模式中创建对象(它自动地创建模式)* QUIESCE_CONNECT 允许用户连接处于 quiesced 状态的数据库 CREATE_EXTERNAL_ROUTINE 允许用户注册外部例程(用 C 和 Java 等外部语言编写的例程) *SYSIBM 成为隐式创建的模式的所有者,PUBLIC 组被授予在这个模式中创建对象的特权。 表 4 总结了对于用户或用户组可以授予和撤消的惟一一种表空间特权(USE)。USE 特权不能对 SYSCATSPACE 或任何系统临时表空间使用。 表 4. 表空间特权的总结 表空间特权   USE 允许用户在指定的表空间中创建表 表 5 总结了对于用户或用户组可以授予和撤消的模式特权类型。 表 5. 模式特权的总结 模式特权   CREATEIN 允许用户在模式中创建对象 ALTERIN 允许用户在模式中修改对象 DROPIN 允许用户从模式中删除对象 表 6 总结了对于用户或用户组可以授予和撤消的表/视图特权。 表 6. 表和视图特权的总结 表/视图特权   CONTROL 授予用户在表和视图上的所有特权,以及将这些特权(除了 CONTROL)授予别人 ALTER 允许用户在表中添加列、在表和它的列上添加或修改注释、添加主键或惟一约束以及创建或删除表检查约束 DELETE 允许用户从表或视图中删除行 INDEX 允许用户在表上创建索引 INSERT 允许用户在表或视图中插入数据 REFERENCES 允许用户创建和删除外键,这需要指定关系中的父表 SELECT 允许用户从表或视图中检索行、在表上创建视图以及运行 EXPORT 实用程序 UPDATE 允许用户修改表、视图或者表或视图中某些列中的数据;用户可以只在特定列上具有这种特权 表 7 总结了对于用户或用户组可以授予和撤消的惟一一种索引特权(CONTROL)。 表 7. 索引特权的总结 索引特权   CONTROL 允许用户删除索引 表 8 总结了对于用户或用户组可以授予和撤消的包特权类型。“静态和动态 SQL 考虑因素” 一节更详细地讨论包概念。 表 8. 包特权的总结 包特权   CONTROL 允许用户重新绑定、删除或执行包,以及将这些特权(除了 CONTROL)授予别人 BIND 允许用户重新绑定现有的包 EXECUTE 允许用户执行包 表 9 总结了对于用户或用户组可以授予和撤消的惟一一种例程特权(EXECUTE)。 表 9. 例程特权的总结 例程特权   EXECUTE 允许用户调用例程,从例程创建函数(只应用于函数),以及在任何 DDL 语句(比如 CREATE VIEW、CREATE TRIGGER 或定义约束时)中引用例程 表 10 总结了对于用户或用户组可以授予和撤消的序列特权类型。 表 10. 序列特权的总结 序列特权   USAGE 允许用户对序列使用 NEXTVAL 和 PREVVAL 表达式 ALTER 允许用户使用 ALTER SEQUENCE 语句修改序列属性 授予特权 与实例级权限相似,可以使用命令语法或 Control Center 授予和撤消特权。要想授予或撤消特权,必须有数据库连接。图 6 显示表和视图特权的 GRANT 语句的语法图。其他数据库对象的 GRANT 语句语法是相似的,请参考 DB2 UDB 文档。 图 6. 表和视图的 GRANT 语句语法图 例如,要使用 GRANT 语句向用户 JEFF 授予 ACCOUNT 表的 INSERT 特权,那么发出以下语句: GRANT INSERT ON TABLE account TO USER jeff 要向 SALESREPS 组授予 CUSTOMER 表的 SELECT 特权,那么发出以下语句: GRANT SELECT ON TABLE customer TO GROUP salesreps 在向用户或组授予权限和特权时必须小心,因为 DB2 UDB 允许将这些特权授予不存在的帐号。如果以后创建了同名的帐号,那么这个帐号会自动获得以前授予的所有权限和特权。 还可以使用 Control Center 授予特权,办法是展开 All Databases 文件夹,展开目标数据库,展开包含感兴趣的数据库对象的文件夹,右击这个对象,并选择 Privileges 项。在 图 7 中,展开 SAMPLE 数据库中的 Tables 文件夹,右击 EMPLOYEE 表并选择 Privileges 项。 图 7. Control Center 中的表特权对话框 在表特权对话窗口中,根据要向用户还是组授予特权,选择 User 或 Group。如果用户/组不在列表中,那么点击 Add User 或 Add Group 按钮添加用户或组。通过点击适当特权的下拉框并选择 Yes、No 或 Grant,从而指定应该向用户或组授予哪些特权。选择 Yes 意味着应该授予特权,选择 No 意味着应该不授予特权,选择 Grant 意味着应该授予此特权和向其他用户/组授予此特权的特权。点击 Grant All 按钮向指定用户或组授予所有可用的特权。点击 Revoke All 按钮从指定用户或组撤消所有可用的特权。 在 图 7 中可以看到,用户 MARK 只被授予 EMPLOYEE 表上的 INSERT 特权,这意味着 MARK 只能在这个表中插入数据,不能读或更新它。当然,这假设 MARK 不是具有这些特权或 SYSADM/DBADM 权限的组的成员。 向用户与组授予特权 在上面的例子或 GRANT 语句语法图中可以看出,可以分别使用 TO USER 或 TO GROUP 子句指定是向用户还是向组授予特权。如果没有指定这两个子句之一,但是指定的名称在操作系统中只定义为组,那么假设是 GROUP。如果指定的名称在操作系统中只定义为用户,或者没有定义,那么假设是 USER。如果指定的名称在操作系统中同时定义为用户和组,那么返回一个错误。作为最佳实践,我们建议在 GRANT 语句中总是包含 TO USER 或 TO GROUP 子句,以避免任何二义性。 PUBLIC 组 DB2 UDB 在内部使用一个伪组 PUBLIC,可以对它授予和撤消特权。PUBLIC 实际上并不是外部安全设施中定义的一个组,而是一种向成功经过身份验证的用户分配特权的方式。可以对 PUBLIC 组授予和撤消特权,就像对其他组一样。例如,要从 PUBLIC 组撤消 IMPLICIT_SCHEMA 权限,可以发出以下语句: REVOKE IMPLICIT_SCHEMA ON DATABASE FROM PUBLIC 重要的是,要理解向 PUBLIC 组授予特权的安全影响。任何提供了有效用户 ID 和密码的用户都能够执行 PUBLIC 组有权执行的操作。 WITH GRANT OPTION 许多数据库对象特权还允许在 GRANT 语句中包含 WITH GRANT OPTION 子句。这使您能够将一种特权授予用户或组,同时使用户或组的成员能够将同一特权授予别的用户/组。例如,以下语句将 ACCT 模式上的 ALTERIN、CREATEIN 和 DROPIN 特权授予组 G1,同时允许组 G1 的成员将这些特权授予别的用户或组: GRANT ALTERIN, CREATEIN, DROPIN ON SCHEMA ACCT TO GROUP G1 WITH GRANT OPTION CONTROL 特权 不能使用 WITH GRANT OPTION 子句向别的用户或组授予对象的 CONTROL 特权。这种特权必须专门授予用户或组,并只能由具有 SYSADM 或 DBADM 权限的用户执行。 WITH GRANT OPTION 只能用于包、例程、模式、表、视图和表空间的 GRANT 语句。 撤消特权 REVOKE 语句用于撤消以前授予的特权。图 8 显示表和视图的 REVOKE 语句的语法图。同样,其他数据库对象的 REVOKE 语法是相似的,请参考 DB2 UDB 文档。 图 8. 表和视图的 REVOKE 语句语法图 例如,要从用户 JEN 撤消 STAFF 表上的 ALTER 特权,可以发出以下语句: REVOKE ALTER ON TABLE staff FROM USER jen 要从 JEN 撤消 STAFF 表上的所有特权,可以发出以下语句: REVOKE ALL PRIVILEGES ON TABLE staff FROM USER jen 还可以使用 Control Center 撤消特权,操作方式与授予特权相似。只需重新打开对象特权对话窗口,如前面的 图 7 所示。要撤消一种特权,只需将此特权的下拉列表改为 NO,或者点击 Revoke All 按钮撤消与此对象相关的所有特权。 要撤消数据库对象上的特权,必须具有 DBADM 权限、SYSADM 权限或此对象上的 CONTROL 特权。注意,拥有 WITH GRANT OPTION 特权并不足以撤消这一特权。要从另一个用户撤消 CONTROL 特权,必须具有 SYSADM 或 DBADM 权限。 从用户或组撤消特权是撤消其他任何帐号授予他的特权。但是从用户或组撤消特权并不撤消这个用户/组授予别的帐号的同一特权。例如,假设用户 BEN 将 SELECT WITH GRANT OPTION 授予用户 RICK,然后 RICK 将 SELECT 授予用户 RAVI 和 CHRIS。如果以后 BEN 从 RICK 撤消了 SELECT 特权,那么 RAVI 和 CHRIS 仍然拥有 SELECT 特权。 从组中的一个成员撤消特定特权 还有一种情况:希望将一种特权授予一个组,然后只从这个组中的一个成员撤消这一特权。但是,不能撤消并未明确授予的特权。在这种情况下,有两种办法: 可以从这个组中删除这个成员;或者创建一个只包含组中其他成员的新组,并将特权授予这个新组。 可以从这个组撤消特权,然后向组的各个成员分别授予特权。 授予和撤消数据库权限 也使用 GRANT 语句将数据库级权限(比如 DBADM、LOAD 和 CREATETAB)授予用户或组。例如,以下语句将 DBADM 权限授予用户 SALLY: GRANT DBADM ON DATABASE TO USER sally 以下语句将 LOAD 权限授予组 MAINT: GRANT LOAD ON DATABASE TO GROUP maint 如果 LOAD 操作定义为 REPLACE,那么具有 LOAD 权限的用户还需要 INSERT 特权(为了将数据装载到表中)和 DELETE 特权。 撤消 DBADM 权限 要撤消 DBADM 权限,必须具有 SYSADM 权限。 要撤消数据库级权限,使用 REVOKE 语句。例如,要从组 MAINT 撤消 LOAD 权限,可以发出以下语句: REVOKE LOAD ON DATABASE FROM GROUP maint 回页首 隐式特权 在某些情况下,当用户创建一个数据库对象(比如表或包)时,或者授予 DBADM 权限级别时,数据库管理器会隐式地将某些特权授予用户。重要的是,要了解授予了哪些隐式特权以及这些隐式特权的安全影响。表 11 总结了授予隐式特权的情况。 表 11. 对于不同操作授予的隐式特权的总结 操作 向执行此操作的用户授予的隐式特权 创建新数据库 将 DBADM 权限以及 BINDADD、CONNECT、CREATETAB、CREATE_EXTERNAL_ROUTINE、CREATE_NOT_FENCED_ROUTINE、IMPLICIT_SCHEMA、LOAD 和 QUIESCE_CONNECT 权限授予创建者(SYSADM 或 SYSCTRL) 将 BINDADD、CREATETAB、CONNECT 和 IMPLICIT_SCHEMA 授予 PUBLIC 将每个成功绑定的实用程序上的 BIND 和 EXECUTE 特权授予 PUBLIC 将系统编目表和视图上的 SELECT 授予 PUBLIC 将 USERSPACE1 表空间上的 USE 特权授予 PUBLIC 将 SYSFUN 模式中的所有函数上的 EXECUTE WITH GRANT 特权授予 PUBLIC 将 SYSIBM 模式中的所有过程上的 EXECUTE 特权授予 PUBLIC 授予 DBADM 权限 授予 BINDADD、CONNECT、CREATETAB、CREATE_EXTERNAL_ROUTINE、CREATE_NOT_FENCED_ROUTINE、IMPLICIT_SCHEMA、LOAD 和 QUIESCE_CONNECT 模式 在明确创建时,将 CREATEIN、ALTERIN、DROPIN 授予创建这个模式的用户 在隐式创建时,将 CREATEIN 授予 PUBLIC 创建对象(表、索引、包) 将 CONTROL 授予对象创建者 创建视图 只有在用户拥有视图定义中引用的所有表、视图和别名的 CONTROL 特权时,授予 CONTROL 特权 例如,假设最初将 DBADM 权限授予用户 PAUL,以后决定撤消此权限。要从 PAUL 撤消 DBADM 权限,可以使用以下语句: REVOKE DBADM ON DATABASE FROM USER paul 在执行这个命令之后,PAUL 不再拥有 DBADM 权限;但是,他仍然拥有数据库上的 GRANT、BINDADD、CONNECT、CREATETAB、CREATE_EXTERNAL_ROUTINE、CREATE_NOT_FENCED_ROUTINE、IMPLICIT_SCHEMA、LOAD 和 QUIESCE_CONNECT 权限,这些权限是原来将 DBADM 权限授予 PAUL 时隐式授予的。需要从 PAUL 明确地撤消这些权限。 一种好的安全实践是,在创建新数据库之后,明确地撤消隐式授予 PUBLIC 的许多特权。这可以保护系统,确保只有应该访问数据库的用户才能这么做。 回页首 静态和动态 SQL 考虑因素 如果在编译时一个 SQL 语句的语法是完全已知的,那么这个语句就称为静态 SQL。反之就是动态 SQL 语句,其语法直到运行时才知道。 在静态和动态 SQL 之间,处理特权的方式有一些差异。这些差异之一是如何处理组成员关系。一般来说,只对于动态 SQL 和非数据库对象授权(比如实例级命令和实用程序),需要考虑组成员关系。这种一般规则的一个例外发生在特权被授予 PUBLIC 时;在这种情况下,在处理静态 SQL 时也考虑组成员关系。 另一个差异是实际进行授权的时间。如果用静态 SQL 语句编写一个程序,那么必须先在数据库中创建包(包含 SQL 语句的优化且可执行形式的数据库对象),然后相关的程序才能执行包中包含的 SQL 语句。对静态 SQL 的授权发生在编译时或绑定时。在运行时,用户只需要有包上的 EXECUTE 特权,就能够执行其中的语句。这意味着用户不能直接访问底层数据库对象。对底层数据库对象的访问只能通过包中的特定语句进行。对于动态 SQL 语句,授权针对每个语句进行。执行语句的用户必须具有适当的特权,才能在运行时执行语句,特权可以是明确授予他们的,也可以是通过组成员关系授予的。 例如,假设在一个嵌入式 SQL 应用程序中有以下的静态 SQL 语句: EXEC SQL SELECT col INTO :hostvar FROM table123; 假设包含这个语句的应用程序文件已经预先编译了,产生了绑定文件 sampleapp.bnd。如果开发人员 BARBARA 希望将这个文件绑定到数据库(因此创建一个包),那么她需要具有 TABLE123 上的 SELECT 特权,才能成功执行 BIND 命令。这个规则有一个例外,即如果 PUBLIC 组已经被授予了这个特权,那么就不需要明确授予她这个特权。BARBARA 还需要 BINDADD 权限(如果这是一个新的包)或 BIND 特权(如果这是一个现有的包,她希望将它重新绑定到数据库,例如因为数据库统计值最近更新了)。 包也可能包含动态 SQL,在这种情况下,需要的特权取决于在对包进行预编译或绑定到数据库时 RECOMPILE/BIND 命令的 DYNAMICRULES 子句所指定的值。如果包是使用 DYNAMICRULES RUN(默认值)绑定的,那么要想使用其中的动态 SQL,运行动态 SQL 应用程序的用户必须具有发出每个 SQL 请求所需的特权,以及包上的 EXECUTE 特权。特权可以被授予用户的 ID、用户所在的任何组或 PUBLIC。 如果应用程序是使用 DYNAMICRULES BIND 选项绑定的,那么 DB2 UDB 将包所有者的用户 ID 与应用程序包关联起来。这使运行这个应用程序的任何用户能够继承与包所有者的用户 ID 相关联的特权。 例如,假设以上例子中的应用程序文件也包含动态 SQL,如 清单 2 所示: 清单 2. 一个嵌入式 SQL 应用程序中的动态 SQL EXEC SQL BEGIN DECLARE SECTION; char hostVarStmt[50]; short hostVarDeptnum; EXEC SQL END DECLARE SECTION; strcpy(hostVarStmt, "DELETE FROM org WHERE deptnum = ?"); EXEC SQL PREPARE Stmt1 FROM :hostVarStmt; hostVarDeptnum = 15; EXEC SQL EXECUTE Stmt1 USING :hostVarDeptnum; 如果 BARBARA 希望将同一个绑定文件绑定到数据库,那么她需要 BINDADD 权限(如果这是一个新的包)或 BIND 特权(如果这是一个现有的包)。因此,假设 BARBARA 使用以下的 BIND 命令绑定这个文件: BIND sampleapp.bnd QUALIFIER u1 OWNER u2 DYNAMIC RULES RUN 在这个例子中,所有未限定的 SQL 语句(即没有使用模式名限定其中的数据库对象的语句)会使用模式 U1。因为使用了 OWNER 子句,用户 U2 会拥有这个包。因为 BARBARA 指定了 DYNAMIC RULES RUN 子句,所以会检查运行这个应用程序(执行这个包)的用户是否具有执行动态 SQL 的特权。 但是,如果 BARBARA 使用以下的 BIND 命令绑定这个文件,那么会检查包的所有者是否具有执行动态 SQL 的特权: BIND sampleapp.bnd QUALIFIER u1 OWNER u2 DYNAMIC RULES BIND 在这个例子中,包的所有者被指定为 U2。因此,在运行时检查用户 U2 的特权,而不是检查运行应用程序的用户的特权。 例程特权 EXECUTE 特权应用于数据库中所有类型的例程,包括函数、过程和方法。用户一旦被授予一个例程的 EXECUTE 特权,他就可以调用这个例程,从例程创建函数(只应用于函数),以及在任何 DDL 语句(比如 CREATE VIEW 或 CREATE TRIGGER)中引用例程。对于这个例程中访问的对象,不需要具有对应的特权。 回页首 在 DB2 UDB 中如何维护特权/权限 实例级权限 实例级权限级别(SYSADM、SYSCTRL、SYSMAINT 和 SYSMON)和组成员关系是在 DB2 UDB 之外定义的,因此不会反映在系统编目表中。 DB2 UDB 将关于特权的信息存储在七个系统编目视图中: SYSCAT.DBAUTH - 数据库特权 SYSCAT.COLAUTH - 表和视图列特权 SYSCAT.INDEXAUTH - 索引特权 SYSCAT.PACKAGEAUTH - 包特权 SYSCAT.SCHEMAAUTH - 模式特权 SYSCAT.TABAUTH - 表和视图特权 SYSCAT.TBSPACEAUTH - 表空间特权 可以像查询任何其他视图一样查询这些视图。例如,要查明用户 EMMA 拥有哪些表特权,可以发出 清单 3 所示的命令: 清单 3. 查询 SYSCAT.TABAUTH 视图来了解特权信息 SELECT substr(grantor,1,8) AS grantor, SUBSTR(grantee,1,8) AS grantee, granteetype AS gtype, SUBSTR (tabschema,1,8) AS schema, SUBSTR (tabname,1,8) AS tabname, controlauth AS ctl, alterauth AS alt, deleteauth AS del, indexauth AS idx, insertauth AS ins, selectauth AS sel, refauth AS ref, updateauth AS upd FROM syscat.tabauth WHERE grantee = 'EMMA' GRANTOR GRANTEE GTYPE SCHEMA TABNAME CTL ALT DEL IDX INS SEL REF UPD ------- -------- ----- -------- -------- --- --- --- --- --- --- --- --- INST1 EMMA U INST1 TABLE1 Y G G G G G G G 被授权者类型(GTYPE)‘U’ 意味着被授权者(拥有此特权的帐号)是一个用户帐号。GTYPE 值 ‘G’ 意味着被授权者是一个组帐号。在其他列中,‘Y’ 意味着拥有此特权,‘N’ 意味着不拥有此特权,‘G’ 意味着拥有此特权并可以授予其他人。在 清单 3 中,可以看出用户 EMMA 具有表 TABLE1 上的 CONTROL 特权,以及所有其他可用的表特权,包括将这些特权授予其他人的能力。 隐式授予的特权 由系统授予用户的特权的授予者是 SYSIBM。 要查明具有特权的所有帐号,可以查询每个系统编目视图并使用 UNION 操作符将结果组合在一起,如 清单 4 所示: 清单 4. 判断具有特权的所有授权名称 SELECT DISTINCT GRANTEE, GRANTEETYPE, 'DATABASE' FROM SYSCAT.DBAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'TABLE ' FROM SYSCAT.TABAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'PACKAGE ' FROM SYSCAT.PACKAGEAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'INDEX ' FROM SYSCAT.INDEXAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'COLUMN ' FROM SYSCAT.COLAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SCHEMA ' FROM SYSCAT.SCHEMAAUTH UNION SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SERVER ' FROM SYSCAT.PASSTHRUAUTH ORDER BY GRANTEE, GRANTEETYPE, 3 还可以使用 Control Center 查明一个用户或组具有的所有特权。操作方法是,打开 Control Center,展开 All Databases 文件夹,展开目标数据库,展开 Users and Group Objects 文件夹,展开 DB Users 或 DB Groups 文件夹,并双击感兴趣的用户或组的行。在 图 9 中,打开了 SAMPLE 数据库中用户 MARK 的特权对话框。选择 Database 选项卡,会看到用户 MARK 具有 CONNECT 和 LOAD 权限。要撤消这些权限,可以不选中权限旁边的复选框。 图 9. 在 Control Center 中打开修改用户(特权)对话框 GET AUTHORIZATIONS 命令 DB2 UDB 有一个 GET AUTHORIZATIONS 命令,这是一个报告当前用户的特权的便捷命令。这个命令使用在数据库管理器配置文件和授权系统编目视图(SYSCAT.DBAUTH)中找到的值。清单 5 显示发出这个命令的结果: 清单 5. GET AUTHORIZATIONS 命令 db2 => get authorizations Administrative Authorizations for Current User Direct SYSADM authority = NO Direct SYSCTRL authority = NO Direct SYSMAINT authority = NO Direct DBADM authority = NO Direct CREATETAB authority = NO Direct BINDADD authority = NO Direct CONNECT authority = NO Direct CREATE_NOT_FENC authority = NO Direct IMPLICIT_SCHEMA authority = NO Direct LOAD authority = NO Direct QUIESCE_CONNECT authority = NO Direct CREATE_EXTERNAL_ROUTINE authority = NO Direct SYSMON authority = NO Indirect SYSADM authority = YES Indirect SYSCTRL authority = NO Indirect SYSMAINT authority = NO Indirect DBADM authority = NO Indirect CREATETAB authority = YES Indirect BINDADD authority = YES Indirect CONNECT authority = YES Indirect CREATE_NOT_FENC authority = NO Indirect IMPLICIT_SCHEMA authority = YES Indirect LOAD authority = NO Indirect QUIESCE_CONNECT authority = NO Indirect CREATE_EXTERNAL_ROUTINE authority = NO Indirect SYSMON authority = NO 直接 权限意味着此权限是明确授予此用户的。间接 权限意味着此用户属于具有此权限的组。如果用户被明确授予了此权限,同时又属于具有此权限的组,那么他同时具有直接和间接权限。 回页首 决定所需的特权/权限级别 通常,组织中的不同用户需要不同的数据库访问级别。例如,与数据库管理员相比,客户服务代表需要更受限制的访问级别。本节给出几个场景,并讨论在每个场景中需要的权限和特权。 场景 1 Tony 是财务部门的一位分析师,他每天早上运行查询,查明公司的商店的收益率。 在这个场景中,Tony 可以被授予他感兴趣的数据库上的 CONNECT 特权,以及他需要访问的所有表上的 SELECT 特权。 场景 2 Janet 是一位数据库管理员,负责公司中所有数据库的所有数据库维护活动。她的职责包括进行备份、在需要时恢复数据库、进行存储管理并运行跟踪。她应该不能访问数据库中的任何数据。 在这个场景中,Janet 可以被授予 SYSMAINT 权限。如果 SYSMAINT 太受限制了,也可以考虑授予 SYSCTRL 权限。 场景 3 Jim 是一位应用程序开发人员,他开发和测试数据库管理器应用程序。他还可以创建包含测试数据的表。 在这个场景中,Jim 需要一个或多个数据库上的 BINDADD、BIND、CONNECT 和 CREATETAB,某些特定的模式特权,以及某些表上的特权。如果他用一种外部编程语言(比如 C 或 Java)开发例程,那么可能还需要 CREATE_EXTERNAL_ROUTINE。 场景 4 Susan 是营销部门的一位规划师,她在每天晚上需要将从商店收到的新数据装载进 PRODUCT_SALES 表,从而判断新的销售趋势。 在这个场景中,Susan 需要数据库上的 CONNECT 特权、LOAD 权限以及 PRODUCT_SALES 表上的 INSERT 和 SELECT 特权。 回页首 使用模式控制对数据库对象的访问 新的 DB2 UDB 数据库管理员经常问的一个问题是,如何为用户创建适当的环境,让他们能够创建和删除自己拥有的数据库对象,同时限制其他用户访问这些对象。给每个用户提供一个他自己专用的物理数据库可以解决这个问题,但是这不是优化的解决方案。更好的解决方案可能是通过使用模式控制数据库对象
http://www.itnose.net/detail/518042.html 2014-02-05 14:42   [DB2]

DB2 UDF

DB2 9 使用启示(733 检验)认证指南,第 9 部分: 用户界说的例程(3)   将定制的和复杂的业务逻辑集成到 SQL 语句中 用户界说的 SQL 函数 建立函数 SQL 函数的建立和在使用程序中的运用都很苟且。CREATE FUNCTION 语句界说函数的特征和逻辑,并将函数的特征和逻辑存储在 DB2 系统编目中。该利用被称为注册函数。 清单 1 显露了一个简化版本的 CREATE FUNCTION 语法图,前面有对其紧张部分的疏解: 清单 1. CREATE FUNCTION 语法图 >>-CREATE FUNCTION--function-name-------------------------------> >--(-- -------------------------------- --)--*------------------> | .-,--------------------------. | | V | | '---parameter-name--data-type1- -' >--RETURNS-- -data-type2----------------- --*-------------------> '- -ROW--- --| column-list |-' '-TABLE-' .-LANGUAGE SQL-. >-- ------------------------- --*-- -------------- --*----------> '-SPECIFIC--specific-name-' .-NOT DETERMINISTIC-. .-EXTERNAL ACTION----. >-- ------------------- --*-- -------------------- --*----------> '-DETERMINISTIC-----' '-NO EXTERNAL ACTION-' .-READS SQL DATA---------. >-- ------------------------ --*-- ----------------- --*--------> -CONTAINS SQL----------- | | '-MODIFIES SQL DATA------' >--| SQL-function-body |---------------------------------------> column-list: .-,-----------------------. V | |--(----column-name--data-type3- --)----------------------------| SQL-function-body: |-- -RETURN Statement----------- -------------------------------| '-dynamic-compound-statement-' CREATE FUNCTION 语句的最罕见的子句是: function-name:函数名。 RETURNS type : 所建立的函数的类型。 可用的类型有 scalar、row 和 table。在前面的“标量函数”、“行函数” 和 “表函数” 这几个末节中,您将更详尽地学习这几种类型。欲指定一个标量函数,只需标识前去的数据类型(不须要运用环节字 SCALAR)。 SPECIFIC:可以为函数指定一个特定的称号,而不是让 DB2 为之指定一个系统天生的专一称号。在运用重载(overloaded)函数 ?? 即具有相通称号,但是所带参数的数目差别的函数时,这一点很有用。 DETERMINISTIC: 指定能否每当以相通的一组输出参数实行函数时,都前去相通的成就。 确定性(Deterministic)函数网罗数学函数和不依赖于表中数据或改变数据源的函数。 EXTERNAL ACTION: 指定函数对内部程序能否有影响。 [READS|CONTAINS|MODIFIES] SQL: 指定函数如何经过 SQL 与数据库交互。 SQL-function-body: 这是函数的中心,其中网罗逻辑。 回页首 CREATE FUNCTION 语句 本节供应很多代码实例,以展示 CREATE FUNCTION 语句中各子句的意义。 RETURNS RETURNS 子句确定建立的函数的类型。紧张的三种类型是 scalar、row 和 table。如清单 2 中的例子所示,标量函数前去单个数据类型值: 清单 2. 一个复杂的标量函数 CREATE FUNCTION tan (x DOUBLE) RETURNS DOUBLE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN SIN(x)/COS(x) 如 清单 3 中的例子所示,行函数将一个用户界说类型分化到它的差别部分中: 清单 3. 一个复杂的行函数 CREATE FUNCTION fromperson (p person) RETURNS ROW (name VARCHAR(10), firstname VARCHAR(10)) LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN VALUES (p..name, p..firstname) 如 清单 4 中的例子所示,表函数前去一个表的 0 到多个行。表可以在 SQL 语句中建立,也可以在编程逻辑中建立。 清单 4. 一个复杂的表函数 CREATE FUNCTION deptemployees (deptno CHAR(3)) RETURNS TABLE ( empno CHAR(6), lastname VARCHAR(15), firstname VARCHAR(12), deptname VARCHAR(36) ) LANGUAGE SQL READS SQL DATA NO EXTERNAL ACTION DETERMINISTIC RETURN SELECT empno, lastname, firstnme, deptname FROM employee, department WHERE employee.workdept = department.deptno SPECIFIC SPECIFIC 子句用于为函数供应一个特定的标识符。当在函数中添加解释、删除解释或许将解释变为源代码时,可以运用这个标识符。当运用重载函数时,标识符也特别有用。 清单 5 中的两个函数演示了函数重载。第一个函数将两个数相加。第二个函数将字符串 new_ 与一个输出字符串拼接起来。注意,这两个函数有相通的函数名,但是输出参数的数目纷比方样。 清单 5. 重载标量函数 CREATE FUNCTION joinData (x INT, y INT) RETURNS DOUBLE SPECIFIC join_int2 LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN x y 奸骗奸骗* CREATE FUNCTION joinData (x VARCHAR(10)) RETURNS VARCHAR(15) SPECIFIC join_str LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN 'new_' || x 当必须对函数举办维护,比方为函数添加解释或删除函数时,供应 SPECIFIC 称号的益处就很领略了。在上述情形下,仅仅发出一条 DROP FUNCTION joinData 语句还不敷。DB2 不知道您要援用哪个函数。这时须要供应齐备的函数签名,比方 DROP FUNCTION joinData(int, int),以便指定想要消除的 joinData 函数。但是,要是为函数供应一个 SPECIFIC 称号,那么只需运用那个称号来援用该函数 ?? 比方 DROP SPECIFIC FUNCTION join_int2。 DETERMINISTIC DETERMINISTIC 子句用于指定一个函数能否总是前去相通的值。然后,DB2 可以运用该信息来优化调用函数的体式格局,要是之前该函数已经实行过一次,而前去的值又是确定的,那么 DB2 可以将函数的值缓存起来。要是函数运用了公用寄存器,或许调用了非确定性函数,那么该函数就曲直好坏确定性函数。 清单 6 展示了确定性标量函数的一个例子,清单 7 展示了非确定性标量函数的一个例子: 清单 6. 一个确定性标量函数 CREATE FUNCTION joinData (x INT, y INT) RETURNS DOUBLE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN x y 清单 7. 一个非确定性标量函数 CREATE FUNCTION futureDate (x INT) RETURNS DATE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION NOT DETERMINISTIC RETURN CURRENT DATE x MONTHS 关于每个 (x,y) 输出对,清单 6 中函数的实行成就总是一样的。但是,清单 7 中的函数并不总是产生相通的值,由于它须要获取今后日期。 EXTERNAL ACTION 该子句指定一个函数能否更改数据库之外的任何工具。要是函数要实行会产生内部影响的举措,那么必须将该选项设置为 EXTERNAL ACTION。比方,关于修解释件系统中的文件或许更改内部源中的数据的函数,就须要运用该子句。 [CONTAINS|READS|MODIFIES] SQL 该选项让 DB2 知道一个函数如何与数据库交互。交互体式格局有以下几种选择: CONTAINS SQL: 疏解函数中可以运用既不读取也不修正 SQL 数据的 SQL 语句。 READS SQL DATA: 疏解函数中可以运用不修正 SQL 数据的 SQL 语句。 MODIFIES SQL DATA: 疏解函数中可以运用静态复合语句中所支撑的统统 SQL 语句。 回页首 函数划定例则 函数有一些限定须要特别注意: 要是一个 SQL 函数多处援用一个日期或时辰寄存器,那么统统援用都要前去相通的值。 SQL 函数的主体不能网罗对其本身或许调用它的其他函数或体式格局的递归调用。 SQL 函数运用的言语理论上是存储进程运用的 SQL PL 言语的一个子集。因此,在存储进程中可以运用的某些言语布局在函数中不能运用。 回页首 在函数中运用复合语句 复合 SQL 语句是网罗在一个 BEGIN...END 块中的一组语句。这个块中的 SQL 语句被当作一个单位。 清单 8 显露了静态复合 SQL 块的语法图: 清单 8. 静态复合 SQL 语句的语法图 >>- ------------- --BEGIN ATOMIC--------------------------------> | (1) | '-label:------' >-- ----------------------------------------- ------------------> | .-------------------------------------. | | V | | '--- -| SQL-variable-declaration |- --;- -' '-| condition-declaration |----' >-- ---------------------------------- --END-- ------- -------->< | .-,----------------------------. | '-label-' | V | | '---| SQL-routine-statement |--;- -' SQL-variable-declaration: .-,-----------------. V | |--DECLARE----SQL-variable-name- --data-type--------------------> .-DEFAULT NULL------------. >-- ------------------------- ----------------------------------| '-DEFAULT--default-values-' condition-declaration: |--DECLARE--condition-name--CONDITION--FOR----------------------> .-VALUE-. .-SQLSTATE-- ------- -. >-- --------------------- --string-constant---------------------| SQL-routine-statement: |-- -CALL---------------------------------------------- --------| -FOR----------------------------------------------- - ----------------------------------- --fullselect- | | .-,-----------------------. | | | | V | | | | '-WITH----common-table-expression- -' | -GET DIAGNOSTICS----------------------------------- -IF------------------------------------------------ -INSERT-------------------------------------------- -ITERATE------------------------------------------- -LEAVE--------------------------------------------- -MERGE--------------------------------------------- -searched-delete----------------------------------- -searched-update----------------------------------- -SET Variable-------------------------------------- -SIGNAL-------------------------------------------- '-WHILE---------------------------------------------' 在以下的几个末节中,将重点引见复合语句的一些紧张的组成部分。 DECLARE DECLARE 答应您在块内声明变量。其数据类型可以是除了 XML 数据类型之外的任何用户界说的类型或规范的 SQL 数据类型。要是未给定数据类型的默许值,当声明它时将自动地设置为空。以下是一些示例: DECLARE myInt INTEGER; DECLARE myChar CHAR(6); DECLARE myInt2 INTEGER DEFAULT 0; DECLARE myChar2 VARCHAR(100) DEFAULT NULL; CONDITION HANDLING The CONDITION HANDLING:今朝,函数尚不能运用该选项。 SQL 节制语句 注意,并不是 SQL 存储进程中支撑的统统语句在 UDF 中都受支撑。而且,下面语法图中的某些语句只在表函数中受支撑。另有一些语句,比方 CALL 语句,在函数中运用它们时也有一些限定。 既然进程语句在函数中的运用与在存储进程中的运用存在很多差别,下面的末节“存储进程”将接洽 SQL 复合语句的更低级的用法,并供应一些例子。 回页首 标量函数 SQL 标量函数是最罕见的一种 SQL 函数。它前去单个受支撑的 DB2 数据类型的值。 清单 9 中的复杂例子演示了如何将逻辑嵌入到一个函数中,而不是嵌入到一个客户机使用程序中。函数 CHANGESAL 是运用一行进程代码建立的: RETURN sal * 2。其他部分则组成了函数的界说。该函数以一个雇员的薪水(一个 DOUBLE 值)作为输出。它也可以采用其他数字型值,比方一个 INTEGER,由于 DB2 会隐式地举办类型强迫转换。 清单 9. 一个复杂的标量用户界说函数 CREATE FUNCTION changeSal (v_sal DOUBLE) RETURNS DOUBLE LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN v_sal * 2 清单 10 展示了如何将函数作为 SQL 语句的一部分实行: 清单 10. 实行 CHANGESAL 用户界说函数 SELECT empno, changeSal(salary) AS newSalary FROM employee WHERE edlevel > 19 Result from the DB2 sample database: EMPNO NEWSALARY ------ ---------------------- 000030 1.96500000000000E 005 标量函数平常比这个例子更复杂一些,普通会网罗更复杂的逻辑和其他 SQL 语句。 清单 11 展示了一个更复杂的标量函数,该函数前去抵达所要求的教诲水平的雇员数目,要求的教诲水平是在函数的输出部分指定的: 清单 11. 一个更复杂的用户界说函数 CREATE FUNCTION edCount (v_edLevel DOUBLE) RETURNS INT LANGUAGE SQL READS SQL DATA NO EXTERNAL ACTION RETURN SELECT count(*) FROM employee WHERE edLevel = v_edLevel 然后,可以在一条 SQL 语句中运用该函数,如下面的 清单 12 所示: 清单 12. 实行 EDCOUNT 用户界说函数 SELECT edLevel, edCount(edLevel) AS edQuantity FROM employee GROUP BY edlevel Result from the DB2 sample database: EDLEVEL EDQUANTITY ------- ----------- 12 3 14 7 15 2 16 14 17 7 18 7 19 1 20 1 在背景,当调用 SQL 函数时,DB2 采用函数逻辑,并将其内联(in-line)到 SQL 语句中。这意味着,SQL 语句中的函数调用理论上被函数逻辑调换。于是,DB2 优化器会根据整个语句,而不是语句的一部分来建立最佳接见会面谋划。如许可以?失?失更好的总体味见谋划。比方,清单 13 显露了根据 清单 10 从头编写的 SQL 语句: 清单 13. 根据清单 10 从头编写的 SQL 语句 SELECT empno, sal * 2 AS newSalary FROM employee WHERE edlevel > 19 与原先复杂的 SQL 语句比拟,清单 13 中显露的 SQL 语句的内联要更复杂一些。 清单 14 显露了从头编写的语句: 清单 14. 根据清单 12 从头编写的 SQL 语句 SELECT Q3.$C0 AS "EDLEVEL", Q6.$C0 AS "EDQUANTITY" FROM (SELECT Q2.$C0 FROM (SELECT Q1.EDLEVEL FROM TEDWAS.EMPLOYEE AS Q1) AS Q2 GROUP BY Q2.$C0) AS Q3, (SELECT COUNT(* ) FROM (SELECT $RID$ FROM TEDWAS.EMPLOYEE AS Q4 WHERE (Q4.EDLEVEL = DOUBLE(Q3.$C0))) AS Q5) AS Q6 回页首 行函数 行 函数并不是只前去一行数据,以是不能望文生义。理论上,行函数用于将一个布局化数据类型转换成它的各个组件。用户界说的布局化类型(UDST)是用户界说的网罗对一个或多个 DB2 数据类型的援用的数据类型。因此,要是在数据库中运用 UDST,那么只能运用行函数。行函数只能被界说为 SQL 函数。 清单 15 中的 PERSON 工具即是一个 UDST 的例子。它网罗一个 lastName 字段和一个 firstName 字段。行函数 FROMPERSON 可以用于从 PERSON 类型的实例中提取特定的字段。 清单 15. 一个复杂的行函数 CREATE TYPE person_t AS ( lastname VARCHAR(20), firstname VARCHAR(20)) MODE DB2SQL CREATE FUNCTION fromperson (p person_t) RETURNS ROW (lname VARCHAR(20), fname VARCHAR(20)) LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC RETURN VALUES (p..lastname, p..firstname) 回页首 表函数 DB2 函数一个更为强年夜的方面是它们可以或许前去整个数据表,而非单个值。这将翻开您可在 SQL 语句中运用的很多信息源。您不用指向一个数据库表,而是可以编写 C 函数以指向实时数据流,比方股票市场的数据。 表函数理论上很苟且编写。表函数不像标量函数那样只前去一个数据值,而是前去一个表中的多行数据,如 清单 16 所示: 清单 16. 一个复杂的表函数 CREATE FUNCTION getEnumEmployee(p_dept VARCHAR(3)) RETURNS TABLE ( enum INT, empno VARCHAR(6), lastname VARCHAR(15), firstnme VARCHAR(12) ) SPECIFIC getEnumEmployee RETURN SELECT ROW_NUMBER() OVER(), e.empno, e.lastname, e.firstnme FROM employee e WHERE e.workdept = p_dept 该函数罗列一个部分中的一群雇员。它接收一个 VARCHAR 类型的输出参数。该函数前去的表由 4 个列组成,第一列是 INTEGER 类型,其他列是 VARCHAR 类型。该函数前去 SELECT 语句所界说的一组行。 SELECT 语句的第一个列是一个特别表达式,它运用 DB2 的聚合函数。该表达式为每一行前去一个整数值,这个值从 1 匹面,逐行加 1。其他列的值是从 EMPLOYEE 表中提取的,但是只适用于部分编号与输出参数的值婚配的行。可以看到, ROW_NUMBER() OVER() 表达式稀罕异常便于为成就集天生一个连气儿的数字序列 ?? 理论上,是为成就汇合的每一行编号。 欲调用一个表函数,必须在盘考的 FROM 子句中援用它,并将它包装在名为 TABLE 的函数中。 清单 17 演示了如何调用清单 16 中所示的表函数: 清单 17. 调用 GETENUMEMPLOYEE 表函数 SELECT * FROM TABLE(getEnumEmployee('E11')) AS myNewTable Result from the DB2 sample database: ENUM EMPNO LASTNAME FIRSTNME ----------- ------ --------------- ------------ 1 000090 HENDERSON EILEEN 2 000280 SCHNEIDER ETHEL 3 000290 PARKER JOHN 4 000300 SMITH PHILIP 5 000310 SETRIGHT MAUDE 6 200280 SCHWARTZ EILEEN 7 200310 SPRINGER MICHELLE 当运用表函数时,要记着一些限定。首先,必须知道函数将前去的表中的列数和数据类型。要是一个函数援用一个表的统统列,但是后来那个表又添加了列,那么该函数能够不会按预期运转。比方,假定建立了 清单 18 中所示的表和函数,然后又运用一个 ALTER 语句为那个表添加了一列: 清单 18. 复杂的表和表函数 CREATE TABLE testTab ( varOne INTEGER, varTwo INTEGER ) CREATE FUNCTION returnAllTest (v_v1 int) RETURNS TABLE (v_varOne INT, v_varTwo INT) LANGUAGE SQL READS SQL DATA NO EXTERNAL ACTION RETURN SELECT * FROM testTab WHERE varOne = v_v1 ALTER TABLE testTab ADD varThree int 在这种情形下,对该函数的调用不再按预期的那样前去网罗统统三个列的表,而是只前去该表建立时界说的两个列。之以是会出现这种情形,是由于函数的界说中运用了 *,该标志是在建立时剖析的,而不是在运转时剖析的。
http://www.itnose.net/detail/510741.html 2014-01-26 16:06   [DB2]

  1  2  3  4  5 下一页>