﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-๑۩۞۩๑空间站๑۩۞۩๑-文章分类-IBM</title><link>http://www.blogjava.net/i369/category/22055.html</link><description>北极心空</description><language>zh-cn</language><lastBuildDate>Fri, 27 Jul 2007 03:17:00 GMT</lastBuildDate><pubDate>Fri, 27 Jul 2007 03:17:00 GMT</pubDate><ttl>60</ttl><item><title>DB2使用经验备忘</title><link>http://www.blogjava.net/i369/articles/132086.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 24 Jul 2007 08:48:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/132086.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/132086.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/132086.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/132086.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/132086.html</trackback:ping><description><![CDATA[1.安装DB2后可以通过命令窗口这样的命令行方式或控制中心这样的图形界面方式来操作，而如果你的数据库服务端不在本机，则还需要在&#8220;客户机配置辅助程序&#8221;中做一个客户端连接的配置。
<p>　　2.控制中心中无法增删改数据，只能编写sql语句来实现而quest提供的工具虽然能增加数据，但居然无法用复制、粘贴和Tab键，必须逐个输入，然后用<a class=10 style="COLOR: blue" href="http://product.it168.com/list/b/0220_1.shtml" target=_blank><u>鼠标</u></a>点击切换现存数据看来可以在单元格中编辑修改，但实际却无法commit，呵呵，还是老老实实写u<a class=10 style="COLOR: blue" href="http://digital.it168.com/files/zsxf.asp" target=_blank><u>pda</u></a>te语句，至于删除数据，更是非写delete语句不可。不过可以用pb以单元格方式编辑数据，相应的一个缺点是编辑数据的按钮和删除表的按钮太近，万一点错了删除表的按钮，pb可是不作提示就把表给删了的，faint</p>
<p>　　3.DB2的视图里不能直接用order by语句，必须这样写 select &#215; from(select a，b，c from table1 order by a)as　tab</p>
<p>　　这种写法的前提是你已经打过补丁了</p>
<p>　　4.<a class=10 style="COLOR: blue" href="http://storage.it168.com/" target=_blank><u>存储</u></a>过程的问题:</p>
<p>　　DB2提供ltrim函数和rtrim函数，但偏偏不提供trim函数，如果你希望去除字符两端的空格，对不起，必须用ltrim(rtrim()) 的方式调用insert 语句里面居然不能用表达式赋值，必须把值先赋给一个变量调用其他存储过程时竟然不能用常量做参数，必须把这个常量的值赋给一个变量，再以这个变量为参数</p>
<p>　　select * from table fetch first n rows only 语句居然在存储过程里不可用</p>
<p>　　5.存储过程里可以使用动态sql,但函数里却不可以使用,kao</p>
<p>　　6. 遇到commit或rollback时自动关闭游标，所以需要慎重使用单独提交。</p>
<p>　　proc builder老是在调试中<a class=10 style="COLOR: blue" href="http://product.it168.com/list/b/0205_1.shtml" target=_blank><u>内存</u></a>不足，屏幕花掉。而如果断点调试时暂停不进行下去的时间稍微长一点就会提示超时，受不了。</p>
<p>　　7.开发中遇到的一个问题</p>
<p>　　在使用 日期变量+1 MONTHS OR 日期变量-1 MONTHS 的方式取日期时，比如日期变量值为 2004-02-29时，存储过程里将日期变量+1 MONTHS 赋值给另一</p>
<p>　　日期变量时会出错。相应SQLSTATE为01506(db2 ? 01506): 对 DATE 或TIMESTAMP值进行了调整，以校正算术运算得出的无效日期。</p>
<p>　　如果要获取的只是下一月份，可采用的替代方法是获取当前日期所在月份的第一天作为基准后+1 MONTHS OR -1 MONTHS</p>
<p>　　8.哈哈,今天帮别人弄存储过程的经验@04.08.05</p>
<p>　　搞了半天搞不定，一查原来的文档才了，原来tmd该死的DB2的存储过程，是转换为C后，进行编译的。因此在数据库服务器上要安装一个C编译器才能完成存储过程的编译。并且需要使用DB2SET命令，设置DB2_SQLROUTINE_COMPILER_PATH指向C编译器的安装路径。如:db2set</p>
<p>　　DB2_SQLROUTINE_COMPILER_PATH=E:\ProgramFiles\MicrosoftVisualStudio\VC98\Bin\vcvars32.bat</p>
<p>　　9.对变量的赋值不能用select ..into ..方式而要用set v=(select ..)的方式，代码示例如下。</p>
<p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
    <tbody>
        <tr>
            <td style="WORD-WRAP: break-word" bgColor=#f3f3f3>drop function SXFM.ISORDERSUBMITDATE;<br>CREATE FUNCTION SXFM.ISORDERSUBMITDATE(IN_ROW_ID DECIMAL(16,0)) <br>&nbsp; RETURNS DATE<br>&nbsp; LANGUAGE SQL<br>BEGIN ATOMIC<br>DECLARE V_SUBMIT_DATE DATE;<br>DECLARE V_SELL_ID DECIMAL(16, 0);<br>DECLARE V_BUY_ID DECIMAL(16, 0);<br><br>set V_SELL_ID = (SELECT COALESCE(RECEIVE_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);<br>set V_BUY_ID = (SELECT COALESCE(PAY_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);<br>set V_SUBMIT_DATE = (SELECT DATE(MAX(A.SUBMIT_DATE)) FROM AM_AUDIT_QUEUE A,SM_USER B,SM_USER C<br>WHERE A.TABLE_CODE='IS_ORDER' AND A.TABLE_ROW_ID=IN_ROW_ID<br>AND A.AUDIT_EMP_ID=C.ROW_ID AND C.BRANCH_ID=V_BUY_ID&nbsp;&nbsp; --审核方为付款方<br>AND A.SUBMIT_EMP_ID=B.ROW_ID AND B.BRANCH_ID=V_SELL_ID); --提交方为收款方<br><br>RETURN V_SUBMIT_DATE;<br>END;<br>#SYNC 10;<br></td>
        </tr>
    </tbody>
</table>
</p>
<p>　　10.DB2的游标打开后遇到commit和rollback默认是会关闭的。保持游标打开的方法是在定义游标时加上with hold选项</p>
<p>　　11.F:导出某张表的数据，且该表包含long varchar型数据，该如何操作Q:Export:db2 con<a class=10 style="COLOR: blue" href="http://corp.it168.com/corp/88_index.shtml" target=_blank><u>nec</u></a>t to [dbname] user [user] using [password]db2move [dbname] export -tn [tablename] -u [user] -p[password] (单表)db2move [dbname] export -tn [tablename1,tablename2,...] -u [user] -p [password] (多表)Import:db2move [dbname] import</p>
<p>&nbsp;</p>
<p>=============================================================================</p>
<p><strong>DB2上机操作指令指南</strong></p>
<br>1. 启动实例(db2inst1):
<p>　　db2start</p>
<p>　　2. 停止实例(db2inst1):</p>
<p>　　db2stop</p>
<p>　　3. 列出所有实例(db2inst1)</p>
<p>　　db2ilist</p>
<p>　　5.列出当前实例:</p>
<p>　　db2 get instance</p>
<p>　　4. 察看示例配置文件:</p>
<p>　　db2 get dbm cfg|more</p>
<p>　　5. 更新数据库管理器参数信息:</p>
<p>　　db2 u<a class=10 style="COLOR: blue" href="http://digital.it168.com/files/zsxf.asp" target=_blank>pda</a>te dbm cfg using para_name para_value</p>
<p>　　6. 创建数据库:</p>
<p>　　db2 create db test</p>
<p>　　7. 察看数据库配置参数信息</p>
<p>　　db2 get db cfg for test|more</p>
<p>　　8. 更新数据库参数配置信息</p>
<p>　　db2 update db cfg for test using para_name para_value</p>
<p>　　10.删除数据库:</p>
<p>　　db2 drop db test</p>
<p>　　11.连接数据库</p>
<p>　　db2 con<a class=10 style="COLOR: blue" href="http://corp.it168.com/corp/88_index.shtml" target=_blank>nec</a>t to test</p>
<p>　　11.列出所有表空间的详细信息。</p>
<p>　　db2 list tablespaces show detail</p>
<p>　　12.列出容器的信息</p>
<p>　　db2 list tablespace containers for tbs_id show detail</p>
<p>　　13.创建表:</p>
<p>　　db2 ceate table tb1(id integer not null,name char(10))</p>
<p>　　14.列出所有表</p>
<p>　　db2 list tables</p>
<p>　　12.插入数据:</p>
<p>　　db2 insert into tb1 values(1,&#8217;sam&#8217;);</p>
<p>　　db2 insert into tb2 values(2,&#8217;smitty&#8217;);</p>
<p>　　13.查询数据:</p>
<p>　　db2 select * from tb1</p>
<p>　　14.数据:</p>
<p>　　db2 delete from tb1 where id=1</p>
<p>　　15.创建索引:</p>
<p>　　db2 create index idx1 on tb1(id);</p>
<p>　　16.创建视图:</p>
<p>　　db2 create view view1 as select id from tb1</p>
<p>　　17.查询视图:</p>
<p>　　db2 select * from view1</p>
<p>　　18.节点编目</p>
<p>　　db2 catalog tcp node node_name remote server_ip server server_port</p>
<p>　　19.察看端口号</p>
<p>　　db2 get dbm cfg|grep SVCENAME</p>
<p>　　20.测试节点的附接</p>
<p>　　db2 attach to node_name</p>
<p>　　21.察看本地节点</p>
<p>　　db2 list node directory</p>
<p>　　22.节点反编目</p>
<p>　　db2 uncatalog node node_name</p>
<p>　　23.数据库编目</p>
<p>　　db2 catalog db db_name as db_alias at node node_name</p>
<p>　　24.察看数据库的编目</p>
<p>　　db2 list db directory</p>
<p>　　25.连接数据库</p>
<p>　　db2 connect to db_alias user user_name using user_password</p>
<p>　　26.数据库反编目</p>
<p>　　db2 uncatalog db db_alias</p>
<p>　　27.导出数据</p>
<p>　　db2 export to myfile of ixf messages msg select * from tb1</p>
<p>　　28.导入数据</p>
<p>　　db2 import from myfile of ixf messages msg replace into tb1</p>
<p>　　29.导出数据库的所有表数据</p>
<p>　　db2move test export</p>
<p>　　30.生成数据库的定义</p>
<p>　　db2look -d db_alias -a -e -m -l -x -f -o db2look.sql</p>
<p>　　31.创建数据库</p>
<p>　　db2 create db test1</p>
<p>　　32.生成定义</p>
<p>　　db2 -tvf db2look.sql</p>
<p>　　33.导入数据库所有的数据</p>
<p>　　db2move db_alias import</p>
<p>　　34.重组检查</p>
<p>　　db2 reorgchk</p>
<p>　　35.重组表tb1</p>
<p>　　db2 reorg table tb1</p>
<p>　　36.更新统计信息</p>
<p>　　db2 runstats on table tb1</p>
<p>　　37.备份数据库test</p>
<p>　　db2 backup db test</p>
<p>　　38.恢复数据库test</p>
<p>　　db2 restore db test</p>
<img src ="http://www.blogjava.net/i369/aggbug/132086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-07-24 16:48 <a href="http://www.blogjava.net/i369/articles/132086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在DB2中创建第一个触发器</title><link>http://www.blogjava.net/i369/articles/132069.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 24 Jul 2007 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/132069.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/132069.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/132069.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/132069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/132069.html</trackback:ping><description><![CDATA[<p><a name=0><span class=atitle2><strong>简介</strong></span></a><br><br>当特定事件在 IBM&#174; <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a>&#174; Universal Database&#8482; 数据库中发生时，您就可以激活 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">触发器</em>来执行其他一些操作。在本文中，您将在触发器的世界里遨游，看看如何通过触发器来增强数据库中的业务规则。您还将学习如何使用 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a> UDB Version 8.1 的控制中心来帮助您创建一个应用于简单业务场景的简单触发器。 </p>
<p><a name=N1005E><span class=atitle3>什么是触发器</span></a><br><br>当一个指定的 SQL 操作（如 DELETE，INSERT，或者是 UPDATE 操作）作用于某张表时，一个定义了一组操作的触发器就可以被激活。触发器并不像参照完整性约束和检查约束那样，我们甚至可以使用对其他表来进行更新。</p>
<p><a name=N10067><span class=atitle3>业务场景</span></a><br><br>将一项技术应用于真实世界的一个场景总是有益的。出于教学的目的，让我们在一个银行相关环境中研究触发器，在该模拟环境中，我们仅仅建立了一张表。再次强调，这是被简化了的！我们将要做的是，运用触发器来促进银行提供的透支保护。例如，一个银行客户有一个支票帐户（checking account）和一个储蓄帐户（saving account）。当从支票帐户中取款的金额超过了该帐户的余额时，就会发生一次自动的转帐（叫做透支保护），即自动从客户的储蓄帐户转帐过来。当然，这必须符合一定的条件，即储蓄帐户中必须有足够多的钱来补偿透支的金额。</p>
<p><a name=1><span class=atitle2>开始</span></a><br><br>像上面所提及的，我们的银行仅仅包含一张表。在这张表中，我们将存入客户的支票帐户和储蓄帐户的余额等信息。每个客户通过其社会保险号码来标识。下面是对该表的描述：</p>
<p><strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">表 1. 对 ACCTTABLE 的描述 <br><br></strong></p>
<table cellSpacing=1 cellPadding=5 width=500 border=1>
    <tbody>
        <tr vAlign=top>
            <td><strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Column Name</strong> </td>
            <td><strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Column Type</strong> </td>
            <td><strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Nullable?</strong> </td>
        </tr>
        <tr vAlign=top>
            <td>SSN*</td>
            <td>Varchar(11)</td>
            <td>NO</td>
        </tr>
        <tr vAlign=top>
            <td>LastName</td>
            <td>Varchar(30)</td>
            <td>NO</td>
        </tr>
        <tr vAlign=top>
            <td>FirstName</td>
            <td>Varchar(30)</td>
            <td>NO</td>
        </tr>
        <tr vAlign=top>
            <td>SavingBalance</td>
            <td>Decimal (Precision: 7, Scale: 2)</td>
            <td>NO</td>
        </tr>
        <tr vAlign=top>
            <td>CheckingBalance</td>
            <td>Decimal (Precision: 7, Scale: 2)</td>
            <td>NO</td>
        </tr>
    </tbody>
</table>
* 表示主键
<p>请使用 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a> 命令行处理器为上面的表创建一个数据库。将数据库命名为 <code><font face=新宋体>bnkdb。</font></code> </p>
<p><code><font face=新宋体>db2 =&gt; create database bnkdb</font></code> </p>
<p>接下来，连接到该数据库。我假设您已经在您的机器上有了一个用户名为 <code><font face=新宋体>db2admin</font></code> <code><font face=新宋体>，</font></code> 密码为 <code><font face=新宋体>db2admin </font></code>的帐号。 </p>
<p><code><font face=新宋体>db2 =&gt; connect to bnkdb user db2admin using db2admin</font></code> </p>
<p>现在，创建 <code><font face=新宋体>accttable </font></code>表： </p>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>db2 =&gt; create table accttable(ssn varchar(30) not null primary key,
            lastname varchar(30) not null, firstname varchar(30) not null,
            savingbalance decimal(7,2) not null, checkingbalance decimal(7,2) not null)
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p>现在向所创建的表中加入两条记录：</p>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>db2 =&gt; insert into accttable values
            ('111-11-1111','Bhogal','Kulvir',1500.00,1000)
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>db2 =&gt; insert into accttable values
            ('222-22-2222','Guy','Someother',2000.00,4000)
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
<p>触发器可以在对表的一次 INSERT、 DELETE 或者 UPDATE 操作 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">之前</em>或 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">之后</em>启动。在我们的例子中，您将创建一个在对ACCTTABLE&nbsp;表执行 UPDATE <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">操作之前</em>启动的触发器。在触发器术语中，INSERT、 DELETE 或者 UPDATE 这些使得触发器启动的事件被称作 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">触发事件。</em>触发器的启动是在触发事件之前还是之后则称为触发器的 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">激活时间</em>。 </p>
<p><a name=2><span class=atitle2>使用 Control Center 创建触发器</span></a><br><br>打开 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a> Control Center 开始创建触发器，展开您创建的数据库（即 bnkdb），鼠标右键点击 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Triggers</strong> 选项并且选择 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Create....</strong>. </p>
<p><a name=fig1><strong>图 1. 创建触发器</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=365 alt="Figure 1." src="http://www.51cto.com/files/uploadimg/20051028/1745110.gif" width=305 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>在 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Create Trigger</strong> 屏幕中，可以指定触发器所在的模式。请选择 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a>ADMIN 模式。记住，触发器是与表相关的，所以我们需要选择相关表的模式。然后请再次选择 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a>ADMIN 模式： </p>
<p><a name=fig2><strong>图 2. 选择模式</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=163 alt="Figure 2." src="http://www.51cto.com/files/uploadimg/20051028/1745111.gif" width=324 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>在同一个屏幕中, 需要指定一个触发器的名字。将触发器命名为 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OVERDRAFT</strong>。而且，需要指定与该触发器相关的表的名字。这里选择您创建的 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ACCTTABLE</strong>。 </p>
<p><a name=fig3><strong>图 3. 选择您创建的表</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=102 alt="Figure 3." src="http://www.51cto.com/files/uploadimg/20051028/1745112.gif" width=334 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>在 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Time to trigger action</em>区域中，选择 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Before</strong>。 </p>
<p><a name=fig4><strong>图 4. 选择 Before</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=207 alt="Figure 4." src="http://www.51cto.com/files/uploadimg/20051028/1745113.gif" width=218 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>在 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Operation that causes the trigger to be executed</em>区域中选择 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Update of columns</strong> 操作并且指定被操作列为 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">CHECKINGBALANCE</strong>： </p>
<p><a name=fig5><strong>图 5.</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" style="ZOOM: 90%" height=203 alt="Figure 5. Specify the column name" src="http://www.51cto.com/files/uploadimg/20051028/1745114.gif" width=422 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>点击 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Triggered action</strong>标签页来创建该触发器： </p>
<p><a name=fig6><strong>图 6. 构建触发器</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=96 alt="Figure 6." src="http://www.51cto.com/files/uploadimg/20051028/1745115.gif" width=355 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p><a name=N101BE><span class=atitle3>指定临时变量</span></a><br><br><a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a> UDB 能够跟踪在启动触发器的那条语句之前和之后的一行的状态。请在 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Correlation name for the old rows</em> 一栏中填入 <code><font face=新宋体>OLDROW，</font></code> 在 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Correlation name for the new rows</em> 一栏中填入 <code><font face=新宋体>NEWROW</font></code> ： </p>
<p><a name=fig7><strong>图 7. 指定 NEWROW</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" style="WIDTH: 498px" height=138 alt="Figure 7." src="http://www.51cto.com/files/uploadimg/20051028/1745116.gif" width=562 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>注意，您也许无法指定其中的一个 correlation name，因为它依赖于引起触发器启动的特定操作和激活时间的组合。例如，假设您的触发器选择的 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Time to trigger action</strong> 是 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Before</strong>，触发事件是 DELETE 语句。在这种情况下，我们就无法指定一个 "Correlation name for the new rows"。为什么呢？因为在执行了一个删除操作以后，新行是不存在的。 </p>
<p>因为您创建的触发器是在 UPDATE <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">之前</em>被激活，所以不能编辑 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Temporary table for the old rows</strong> 和 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Temporary table for the new rows</strong>选项。 </p>
<p>您将注意到，在这种情况下（一个在 UPDATE 之前被激活的触发器），您只能指定触发器针对 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">每</em> <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行</em>而不是针对每个 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">语句</em>触发。 <br></p>
<p><a name=fig8><strong>图 8. 触发器触发于每行</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=53 alt="Figure 8." src="http://www.51cto.com/files/uploadimg/20051028/1745117.gif" width=322 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>引起触发事件的语句可能会同时影响数据库中的多行。"For each Row" 选项意味着触发器将在每一行被修改时激活。另一方面，"For each statement" 选项（"before" 型触发器是不允许的）则意味着触发器定义的操作只在调用一次 SQL 语句后执行一次。</p>
<p>可以点击 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Show SQL</strong>按钮来看看底层的 SQL 语句到目前为止是什么样子： </p>
<p><a name=fig9><strong>图 9. Show SQL 框</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=198 alt="Figure 9." src="http://www.51cto.com/files/uploadimg/20051028/1745118.gif" width=398 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p><a name=N1022C><span class=atitle3>构建触发动作</span></a><br><br>现在该创建触发动作了。我们的业务规则是支票帐户的余额必须低于 0 才能激活该触发器。也就是说，我们需要指定 search-condition 为 <code><font face=新宋体>NEWROW.CHECKINGBALANCE&lt;0</font></code> 。我们之所以指定 <code><span class=boldcode><font face=新宋体>NEWROW.CHECKINGBALANCE </font></span></code>是因为需要分析在 update 操作之后支票帐户的余额将会是多少。 </p>
<p><a name=N10240><span class=atitle3>创建触发器主体</span></a><br><br>现在我们将要在 Triggered Action 文本区域中替换 <code><font face=新宋体>triggered-SQL-statement</font></code> （参见下面）。 </p>
<p><a name=fig10><strong>图 10. 创建触发器语句</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" style="WIDTH: 498px" height=198 alt="Figure 10." src="http://www.51cto.com/files/uploadimg/20051028/1745119.gif" width=551 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>用来替换的代码如下:</p>
<p>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>declare overage decimal (7,2);
            set overage = (NEWROW.CHECKINGBALANCE*-1);
            if overage&gt;OLDROW.SAVINGBALANCE then SIGNAL SQLSTATE '70001'
            ('Overdraft Protection Unsuccessful');
            else set newrow.savingbalance =
            oldrow.savingbalance-overage, newrow.checkingbalance = 0;
            end if;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>让我们一句一句地仔细研究一下这段代码。在触发器主体中，可以声明将要在主体中使用的变量。我们使用下面这行代码来声明变量： <code><font face=新宋体>decimal(7,2)declare overage decimal (7,2)</font></code> ; 这样就定义了一个类型为 <code><font face=新宋体>decimal(7,2)</font></code> <code><font face=新宋体>、</font></code> 名为 <code></code>overage <code></code>的变量。 </p>
<p>下一步我们将 overage 变量的值设置为 <code><font face=新宋体>(NEWROW.CHECKINGBALANCE*-1)</font></code> ; </p>
<p>我们将使用该算式计算出我们想要从支票帐户取出的超额(overage)的数目。指定 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><code><font face=新宋体>NEWROW.CHECKINGBALANCE</font></code> </strong>是因为我们需要分析支票帐户的余额在 <em xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">update 操作发生后</em>是多少。 </p>
<p><code><font face=新宋体>set overage = (NEWROW.CHECKINGBALANCE*-1);</font></code> </p>
<p><a name=N10295><span class=atitle3>发出错误条件信号</span></a><br><br>如果违反了您在触发器中定义的业务规则，就可以使用 SIGNAL 语句来抛出一个错误条件信号。在我们的例子中，不允许有人拥有的支票帐户余额为负数。如果有人想要将支票帐户的余额列更新为一个负数，我们就可以试着看看在储蓄帐户中是否有足够多的钱来补偿这个负数。如果没有，那么就可以发出一条 SQL 状态为 '70001' 的信息 "'Overdraft Protection Unsuccessful"。</p>
<p>认识到包含 SIGNAL 语句的效果是很重要的。SIGNAL 语句回滚由触发语句（也就是我们的 update 语句）尝试的更改。SIGNAL 语句也将回滚在触发器内发生的更改。此外，假设我们是使用 Java&#8482; 应用程序来与数据库进行交互的，并且试图执行一次会触发我们的触发器并违反业务规则的 update 操作。Java 应用程序将接受我们所指定的 SQLSTATE 以及值为 -438 的 SQLCODE。在这行中我们使用 SIGNAL SQLSTATE 属性：</p>
<p>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>if overage&gt;OLDROW.SAVINGBALANCE then SIGNAL SQLSTATE '70001'
            ('Overdraft Protection Unsuccessful');
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>该行说明，如果我们的 overage 比储蓄帐户的余额数目还要大，那么就需要抛出一个危险信号。</p>
<p><a name=N102A8><span class=atitle3>转帐</span></a><br><br>如果储蓄帐户的余额数目足够补偿超出的数目，这时就会发生转帐。如果满足这种条件，我们将对新行作两处修改：</p>
<ol xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <li>修改 "new row" 的 savingbalance 列，将其减去 overage 以促成透支转帐。
    <li>将支票帐户的余额设置为 0。我们使用下面的代码来完成：</li>
</ol>
<p>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>
            else set newrow.savingbalance = oldrow.savingbalance-overage,
            newrow.checkingbalance = 0; end if;
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><a name=N102BE><span class=atitle3>最终结果</span></a><br><br>可以再次通过 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Show SQL</strong>按钮来看看最后的结果： </p>
<p><a name=fig11><strong>图 11.显示 SQL</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=262 alt="Figure 11." src="http://www.51cto.com/files/uploadimg/20051028/17451110.gif" width=458 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p>在点击 <strong xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Close</strong>之后，您将看到 OVERDRAFT 触发器已经创建好了： </p>
<p><a name=fig12><strong>图 12. 创建 OVERDRAFT 触发器</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" style="WIDTH: 498px" height=176 alt="Figure 12." src="http://www.51cto.com/files/uploadimg/20051028/17451111.gif" width=600 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p><a name=3><span class=atitle2>测试</span></a><br><br>可以通过一个 update 语句来进行测试。打开命令行编写下面的语句：</p>
<p>
<table cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc border=1>
    <tbody>
        <tr>
            <td>
            <pre><code>db2=&gt; update accttable set checkingbalance = -500 where ssn='111-11-1111'
            </code></pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>根据我们创建的业务逻辑，这个 update 操作将启动该触发器，由于支票帐户透支，该触发器将从 savingbalance 列取出 500.00 到支票帐户。因此，SSN 为 111-11-1111 的帐户的 checkingbalance 会变成 0.00 而 savingbalance 将变成 1000.00（原来的余额 1500 － 透支的 500）。下面的查询验证了该结果：</p>
<p><a name=fig13><strong>图 13. 查询</strong></a><br><br><img class=fit-image onmousewheel="javascript:return big(this)" height=125 alt="Figure 13." src="http://www.51cto.com/files/uploadimg/20051028/17451112.gif" width=478 onload="javascript:if(this.width>498)this.style.width=498;" xmlns:dw="http://www.ibm.com/developerworks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> </p>
<p><a name=4><span class=atitle2><strong>尾声</strong></span></a><br><br>您已经在一个假想的业务场景中创建了一个 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a> 触发器。触发器是 <a style="FONT-SIZE: 14px; COLOR: #0000ff; TEXT-DECORATION: none" href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/index_old.html?S_TACT=105AGX52&amp;S_CMP=techcto" target=_blank>DB2</a> 数据库的一个非常强大的特性，您可以使用它将业务逻辑分化到关系数据库这边。如果考虑到有多个应用程序都将与同一个数据库进行交互，您就会发现这种分化是非常强大的。在一个大型企业中，您可能多次遇到过这样的情况，即不知道要创建的是怎样一个将与数据库交互的应用程序。与其只是希望这些应用程序遵守被认为是您的组织机构的戒律的业务规则，还不如使用触发器作为您工具箱中的一种工具，以确保现在和将来与数据库进行交互的所有的应用程序强制遵守这些业务规则。一个触发器只能关联一个表，而不能关联一个视图。您也许可以考虑使用 INSTEAD OF 触发器来与视图交互。</p>
<p><br></p>
<img src ="http://www.blogjava.net/i369/aggbug/132069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-07-24 15:47 <a href="http://www.blogjava.net/i369/articles/132069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Q 复制和 Consistent Change Data 表</title><link>http://www.blogjava.net/i369/articles/131319.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Jul 2007 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/131319.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/131319.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/131319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/131319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/131319.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%">
            <p id=subtitle>扩展您的架构</p>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><img height=18 alt=developerWorks src="http://www-128.ibm.com/developerworks/cn/i/dw.gif" width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <table class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=0 width=150 border=0>
                            <tbody>
                                <tr>
                                    <td class=v14-header-1-small>文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td class=no-padding width=150>
                                    <table cellSpacing=0 cellPadding=0 width=143 border=0>
                                        <img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8>
                                        <form name=email action=https://www.ibm.com/developerworks/secure/email-it.jsp>
                                            <input type=hidden value="即将发布的 Q Replication 将支持一种新的目标表，即 Consistent Change Data (CCD) 表。探索 Q Replication 用户之所以需要这些表的原因，并考虑在使用 CCD 表作为目标的情况下，可能出现的一些新的复制架构。学习如何定义和使用 CCD 表，这需要对 Q Replication 的安装和配置有基本的了解。另外，还看看在使用 CCD 表作为目标的情况下有哪些限制。" name=body><input type=hidden value="Q 复制和 Consistent Change Data 表" name=subject><input type=hidden value=cn name=lang>
                                            <script language=JavaScript type=text/javascript>
                                            <!--
                                            document.write('
                                            <tr valign="top">
                                                <td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                                <td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td>
                                                <td width="122">
                                                <p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                                </td>
                                            </tr>
                                            ');
                                            //-->
                                            </script>
                                            <tbody>
                                                <tr vAlign=top>
                                                    <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                    <td width=16><img height=16 alt=将此页作为电子邮件发送 src="http://www.ibm.com/i/v14/icons/em.gif" width=16 vspace=3></td>
                                                    <td width=122>
                                                    <p><a class=smallplainlink href="javascript:document.email.submit();"><strong><font color=#5c81a7 size=2>将此页作为电子邮件发送</font></strong></a></p>
                                                    </td>
                                                </tr>
                                                <noscript>
                                                <tr valign="top">
                                                    <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td class="small" width="122">
                                                    <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                                    </td>
                                                </tr>
                                                </noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><br><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br></td>
                    </tr>
                </tbody>
            </table>
            <p>级别: 中级</p>
            <p><a href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#author"><u><font color=#996699>Sean Byrd</font></u></a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#97;&#98;&#121;&#114;&#100;&#64;&#117;&#115;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#81;&#32;&#22797;&#21046;&#21644;&#32;&#67;&#111;&#110;&#115;&#105;&#115;&#116;&#101;&#110;&#116;&#32;&#67;&#104;&#97;&#110;&#103;&#101;&#32;&#68;&#97;&#116;&#97;&#32;&#34920;"><u><font color=#5c81a7>sabyrd@us.ibm.com</font></u></a>), Americas Techworks SME, IBM<br></p>
            <p>2006 年 7 月 10 日</p>
            <blockquote>即将发布的 Q Replication 将支持一种新的目标表，即 Consistent Change Data (CCD) 表。探索 Q Replication 用户之所以需要这些表的原因，并考虑在使用 CCD 表作为目标的情况下，可能出现的一些新的复制架构。学习如何定义和使用 CCD 表，这需要对 Q Replication 的安装和配置有基本的了解。另外，还看看在使用 CCD 表作为目标的情况下有哪些限制。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p><a name=N10041><span class=atitle>简介</span></a></p>
            <p>Consistent Change Data (CCD) 表一直是 SQL Replication 中一种流行的目标表。通过支持 CCD 表作为另一种目标选项，对于熟悉 Q Replication 的人来说，他们就可以利用这种新功能了。这时您可能要问，&#8220;为什么我应该在我的复制架构中考虑 CCD 表？&#8221; CCD 表通过关联的跟踪机制暴露数据，以便准确地描绘源表的事务历史。换句话说，CCD 允许重现源表的历史。让我们看看用到 CCD 的三个例子。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N1004A><span class=atitle>使用 CCD</span></a></p>
            <p><strong>历史表</strong> —— 在任何系统中，都会有一些关键的表需要能够恢复或重建。通过将关键的源表复制到一个 CCD 目标表，就可以逐个事务地从头开始重建这个表。更棒的是，如果表中输入了坏的数据，CCD 记录还允许您查看哪些行受到影响，让您很容易改变主意，或者正确地更新所需的值。</p>
            <p><strong>扇出场景登台（Fan out scenario staging）表</strong> —— 传统上，CCD 目标表用于帮助创建扇出架构，将一个源复制到多个目标。这意味着之前 SQL Replication 不能接受的一些高吞吐量的工作负载现在可以被复制到多个目标了。</p>
            <p><strong>不受支持的数据库登台表</strong> —— 对于将数据放到 Q Replication 受支持的结构之外的数据库中这一任务而言，CCD 目标表也是一种理想的方法。有了最新的修复包（用于 Oracle 和 Sybase 的修复包版本为 9；用于 Microsoft SQL Server 和 Informix 的修复包版本为 10），DB2&#174; 之外的数据库可以作为 Q Replication 的目标数据库，不过仍然有很多目标数据库不可用。虽然 CCD 目标表不能自动将数据复制到不受支持的目标数据库中，但是它通过用户应用程序暴露数据。所以，只需简单地从 IBMSNAP_OPERATION 列选择数据到一个动作变量，然后结合对源列的值的选择，使用一个用于 insert、update 和 delete 的 case 语句，便可以将事务复制到任何您想在其上编程的数据源。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10064><span class=atitle>实现 CCD</span></a></p>
            <p>接下来我们看看如何创建 CCD 目标表。本节假设您已经知道如何配置 Q Replication —— 因此着重讲解队列映射和队列订阅的创建。以前，当选择一种目标表类型时（如果使用 Replication Center's Create Queue Subscription 向导的话，就在这个向导中的第 5 步），您有两个选择 —— 表或存储过程。现在您可以选择 CCD Table，但是必须指定您想要哪种类型的 CCD。如果使用的是 ASNCLP，那么语法如下：</p>
            <br><a name=example1><strong>清单 1. ASNCLP CCD 语法</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>
                        &gt;&gt;-CREATE QSUB--+------------+--+-------------------------+-----&gt;
                        '-SUBTYPE--U-'  '-USING REPLQMAP--mapname-'
                        ...
                        trg-clause
                        &gt;--+-------------------------------+----------------------------&gt;
                        '-TYPE--+-USERTABLE-----------+-'
                        +-STOREDPROC----------+
                        +-NICKNAME------------+
                        '-CCD--| ccd-clause |-'
                        ...
                        ccd-clause
                        |--+--------------------+--+-------------------+----------------&gt;
                        '-CONDENSED--+-ON--+-'  '-COMPLETE--+-ON--+-'
                        '-OFF-'                '-OFF-'
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>要创建一个 CCD，必须指定两个新属性 —— condensed（压缩的）和 complete（完整的）。<a href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#table1"><u><font color=#996699>表 1</font></u></a> 展示了这些属性如何影响目标表的创建：</p>
            <br><a name=table1><strong>表 1. 完整的还是压缩的？</strong></a><br>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="What do complete and condensed mean?" border=0>
                <tbody>
                    <tr>
                        <th><br></th>
                        <th>是</th>
                        <th>否</th>
                    </tr>
                    <tr>
                        <td>complete</td>
                        <td>目标表创建好之后，其中填充有源表中的所有行。</td>
                        <td>目标表创建好之后为空。</td>
                    </tr>
                    <tr>
                        <td>condensed</td>
                        <td>目标表只包含行中最近被更改的值。</td>
                        <td>目标表包含所有行的所有历史值。</td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>创建 CCD 目标表只要做这些就可以了。那么，有了 CCD 表之后，如何使用它呢？让我们将这些值与之前介绍的那些用法联系起来。</p>
            <br><a name=table2><strong>表 2. 最佳匹配</strong></a><br>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Best fit for table types" border=0>
                <tbody>
                    <tr>
                        <th>complete</th>
                        <th>condensed</th>
                        <th>用法</th>
                    </tr>
                    <tr>
                        <td>是</td>
                        <td>是</td>
                        <td>这种配置将支持扇出到多个目标。</td>
                    </tr>
                    <tr>
                        <td>是</td>
                        <td>否</td>
                        <td>这是标准的历史表。每个源行和目标的记录使得表和事务可以被重建。还可以根据这种版本的 CCD 表创建新的用户拷贝。</td>
                    </tr>
                    <tr>
                        <td>否</td>
                        <td>是</td>
                        <td>这种版本的 CCD 表用于扇出场景的登台表，在该场景中，远程已经存在用户数据的一个拷贝。由于缺少源行，因此不能从这种类型的 CCD 表创建新的用户拷贝。</td>
                    </tr>
                    <tr>
                        <td>否</td>
                        <td>否</td>
                        <td>这种 CCD 表用于作为只需要访问被更改的数据的应用程序的登台表。</td>
                    </tr>
                </tbody>
            </table>
            <br><br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10103><span class=atitle>表格式</span></a></p>
            <p>接下来我们看看 CCD 表与源表有什么不同。CCD 表与源表的不同在于多了几个附加的列：</p>
            <br><a name=table3><strong>表 3. CCD 列</strong></a><br>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Additional columns for CCD tables" border=0>
                <tbody>
                    <tr>
                        <th>列名</th>
                        <th>描述</th>
                        <th>数据类型</th>
                    </tr>
                    <tr>
                        <td>IBMSNAP_INTENTSEQ</td>
                        <td>这是一个序号，惟一地标识一次更改。</td>
                        <td>CHAR(10) FOR BIT DATA</td>
                    </tr>
                    <tr>
                        <td>IBMSNAP_OPERATION</td>
                        <td>该列表明对一个记录的操作的类型：<br>I -- Insert<br>U -- Update<br>D -- Delete</td>
                        <td>CHAR(1)</td>
                    </tr>
                    <tr>
                        <td>IBMSNAP_COMMITSEQ</td>
                        <td>这是一个序号，描述事务的提交顺序。</td>
                        <td>CHAR(10) FOR BIT DATA</td>
                    </tr>
                    <tr>
                        <td>IBMSNAP_LOGMARKER</td>
                        <td>这是数据被提交的时间。</td>
                        <td>TIMESTAMP</td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p>这些列附件在行的后面，因此该 CCD 表可用于创建其他拷贝，更新其他拷贝，或者使应用程序可以访问事务历史。如果启用了数据库审计功能，那么 CCD 表中还可能提供以下几列：</p>
            <br><a name=table4><strong>表 4. 审计列</strong></a><br>
            <table class=data-table-1 cellSpacing=0 cellPadding=0 width="100%" summary="Audit columns for CCD tables" border=0>
                <tbody>
                    <tr>
                        <th>列名</th>
                        <th>描述</th>
                        <th>数据类型</th>
                    </tr>
                    <tr>
                        <td>IBMSNAP_AUTHID</td>
                        <td>与事务相关联的授权 ID。这一列同时可用于 DB2 for Linux&#174;、UNIX&#174; 和 Windows&#174; 以及 z/OS&#174;。对于 z/OS，这是主授权 ID。</td>
                        <td>CHAR(128)</td>
                    </tr>
                    <tr>
                        <td>IBMSNAP_AUTHTKN</td>
                        <td>与事务相关联的授权标志。这一列仅用于 DB2 z/OS，它是相关 ID。对于 DB2 Linux、UNIX 和 Windows，这一列的值为 NULL。</td>
                        <td>CHAR(12)</td>
                    </tr>
                    <tr>
                        <td>IBMSNAP_PLANID</td>
                        <td>与事务相关联的计划名称。这一列仅用于 DB2 z/OS。对于 DB2 for Linux、UNIX 和 Windows，这一列的值为 NULL。</td>
                        <td>CHAR(128)</td>
                    </tr>
                    <tr>
                        <td>IBMSNAP_UOWID</td>
                        <td>这个工作单元的日志记录中的工作单元标识符。这一列同时可用于 DB2 for Linux、UNIX 和 Windows 以及 DB2 z/OS。</td>
                        <td>CHAR(10)</td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p>如果手动创建 CCD 目标表，则语法应该像下面这个例子一样。注意，&lt;user data columns&gt; 的数据类型应该与源表中相应的列的数据类型一致。</p>
            <br><a name=example2><strong>例 2. CCD 目标表的 DDL</strong></a><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>
                        CREATE TABLE CCD (
                        IBMSNAP_INTENTSEQ CHAR(10) FOR BIT DATA NOT NULL,
                        IBMSNAP_OPERATION CHAR(1) NOT NULL,
                        IBMSNAP_COMMITSEQ CHAR(10) FOR BIT DATA NOT NULL,
                        IBMSNAP_LOGMARKER TIMESTAMP NOT NULL,
                        IBMSNAP_AUTHID CHAR(128),
                        IBMSNAP_AUTHTKN CHAR(12),
                        IBMSNAP_PLANID CHAR(128),
                        IBMSNAP_UOWID CHAR(10) FOR BIT DATA,
                        &lt;user data columns&gt;
                        );
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N101C6><span class=atitle>限制</span></a></p>
            <p>幸运的是，您只需清楚三个限制，另外再注意一点：<br>
            <ol>
                <li>CCD 目标表只在单向架构中有效。
                <li>CCD 目标表不能是别名。
                <li>CCD 表中必须有惟一性约束 —— 可以通过主键或者源表或 CCD 表上的惟一索引实现。 </li>
            </ol>
            <br>另外一个您可能失察的地方是 delete 的行为。如果您在使用一个压缩 CCD 表，那么在处理 delete 操作时，现有的行将被更新，而 IBMQREP_OPERATION 列将被设为 &#8216;D&#8217;。如果这一行不存在，那么该行将被忽略，并且被记录到异常表中。对于非压缩 CCD 表，所有事务都生成新的行。delete 会生成一个新行，其中仍然使用当前各列的值，但是 IBMQREP_OPERATION 列被设为 'D'。
            <p>&#160;</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0605byrd/#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N101DF><span class=atitle>结束语</span></a></p>
            <p>关于这个话题就讲到这里了。希望本文提供的信息能帮助您利用扩展的架构，并将数据暴露给更多的用户。</p>
            <br><br>
            <p><a name=resources><span class=atitle>参考资料 </span></a></p>
            <strong>学习</strong><br>
            <ul>
                <li>您可以参考本文在 developerWorks 全球网站上的 <a href="http://www.ibm.com/developerworks/db2/library/techarticle/dm-0605byrd/index.html?S_TACT=105AGX52&amp;S_CMP=cn-a-db2" target=_blank><u><font color=#5c81a7>英文原文</font></u></a>。 <br><br>
                <li><a href="http://www.ibm.com/developerworks/db2/roadmaps/qrepl-roadmap-v8.2.html"><u><font color=#996699>Q Replication Version 8.2 Information roadmap</font></u></a> (developerWorks)：这里可以找到更多关于 Q replcation 的参考资料，Q replcation 是 WebSphere Information Integrator Replication Edition 和 WebSphere Information Integrator Replication for z/OS 中提供的功能。 <br><br>
                <li>&#8220;<a href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505burner/index.html"><u><font color=#5c81a7>到 Oracle 和 Sybase 的 Q 复制快速入门 </font></u></a>&#8221;（developerWorks，2005 年 5 月）：遵循逐步指南完成 WebSphere Information Integrator Replication Edition 中联邦功能的设置。 <br><br>
                <li><a href="http://www.ibm.com/developerworks/cn/db2/zones/db2ii/"><u><font color=#5c81a7>developerWorks WebSphere Information Integration 资源页面</font></u></a>：扩展您在 WebSphere Information Integration 产品方面的技能。 <br><br>
                <li><a href="http://www.ibm.com/developerworks/cn/db2"><u><font color=#5c81a7>developerWorks 信息管理专区</font></u></a>：扩展您在所有 IBM Information Management 产品方面的技能。 <br><br>
                <li>随时关注 <a href="http://www.ibm.com/developerworks/cn/offers/techbriefings/"><u><font color=#5c81a7>developerWorks 技术事件和网络广播</font></u></a>。 </li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/131319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-07-19 17:31 <a href="http://www.blogjava.net/i369/articles/131319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何用代理键实现 DB2 UDB 主键</title><link>http://www.blogjava.net/i369/articles/131318.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Jul 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/131318.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/131318.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/131318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/131318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/131318.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10 height=18></td>
            <td width="100%"><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1><br><a class=bctl href="http://www.ibm.com/developerworks/cn/"><font color=#999999 size=2>developerWorks 中国</font></a><span class=bct><font color=#cccccc size=2>&nbsp;&nbsp;&gt;&nbsp;&nbsp;</font></span><a class=bctl href="http://www.ibm.com/developerworks/cn/db2/"><font color=#999999 size=2>Information Management</font></a><font size=2><font color=#cccccc><span class=bct>&nbsp;&nbsp;&gt;</span><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=1><br></font></font>
            <h1>如何用代理键实现 DB2 UDB 主键</h1>
            <p id=subtitle>考察生成惟一序列数字的几种选择</p>
            <img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1></td>
            <td class=no-print width=192><img height=18 alt=developerWorks src="http://www.ibm.com/developerworks/cn/i/dw.gif" width=192></td>
        </tr>
    </tbody>
</table>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
            <td width="100%">
            <table class=no-print cellSpacing=0 cellPadding=0 width=160 align=right border=0>
                <tbody>
                    <tr>
                        <td width=10><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=10></td>
                        <td>
                        <table cellSpacing=0 cellPadding=0 width=150 border=0>
                            <tbody>
                                <tr>
                                    <td class=v14-header-1-small>文档选项</td>
                                </tr>
                            </tbody>
                        </table>
                        <table class=v14-gray-table-border cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td class=no-padding width=150>
                                    <table cellSpacing=0 cellPadding=0 width=143 border=0>
                                        <img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8>
                                        <form name=email action=https://www.ibm.com/developerworks/secure/email-it.jsp>
                                            <input type=hidden value="如何将代理键（surrogate key）用作 DB2 UDB 中的主键？代理键是生成惟一序列号的一种有效方法。从本文中可以了解三种实现方法：使用传统方法、使用键管理器和使用新的 DB2 UDB 特性。" name=body><input type=hidden value="如何用代理键实现 DB2 UDB 主键" name=subject><input type=hidden value=cn name=lang>
                                            <script language=JavaScript type=text/javascript>
                                            <!--
                                            document.write('
                                            <tr valign="top">
                                                <td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td>
                                                <td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送" /></td>
                                                <td width="122">
                                                <p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                                </td>
                                            </tr>
                                            ');
                                            //-->
                                            </script>
                                            <tbody>
                                                <tr vAlign=top>
                                                    <td width=8><img height=1 alt="" src="http://www.ibm.com/i/c.gif" width=8></td>
                                                    <td width=16><img height=16 alt=将此页作为电子邮件发送 src="http://www.ibm.com/i/v14/icons/em.gif" width=16 vspace=3></td>
                                                    <td width=122>
                                                    <p><a class=smallplainlink href="javascript:document.email.submit();"><strong><font color=#5c81a7 size=2>将此页作为电子邮件发送</font></strong></a></p>
                                                    </td>
                                                </tr>
                                                <noscript>
                                                <tr valign="top">
                                                    <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td>
                                                    <td class="small" width="122">
                                                    <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                                    </td>
                                                </tr>
                                                </noscript>
                                            </form>
                                        </tbody>
                                    </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><br><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br></td>
                    </tr>
                </tbody>
            </table>
            <p>级别: 初级</p>
            <p><a href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0407zhang/index.html#author"><u><font color=#996699>Jason Zhang</font></u></a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#115;&#111;&#110;&#122;&#64;&#99;&#97;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#22914;&#20309;&#29992;&#20195;&#29702;&#38190;&#23454;&#29616;&#32;&#68;&#66;&#50;&#32;&#85;&#68;&#66;&#32;&#20027;&#38190;"><u><font color=#5c81a7>jasonz@ca.ibm.com</font></u></a>), 软件开发人员, IBM<br></p>
            <p>2004 年 9 月 01 日</p>
            <blockquote>如何将代理键（surrogate key）用作 DB2 UDB 中的主键？代理键是生成惟一序列号的一种有效方法。从本文中可以了解三种实现：传统方法，使用键管理器，以及使用新的 DB2 UDB 特性。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
            <p><a name=N1003B><span class=atitle>简介</span></a></p>
            <p>使用代理键解决方案是为了发现一种生成惟一序列号的有效方法。本文描述了三种实现： </p>
            <ul>
                <li>使用传统方法。
                <li>使用键管理器。
                <li>使用 DB2 UDB 特性。 </li>
            </ul>
            <p>代理键也叫 <em>内键（internal key）</em>。当创建一个表时，可以添加一个额外的列作为代理键。这个列应该是 NOT NULL，并且没有商业意义。可以将该代理列指定为主键列。例如可以有一个数字代理列。代理键的值从某一个数字开始，例如 "1"，以这个数字作为该列在表中第一行的值，之后的每一行中该列的值都按 1 递增。 </p>
            <p>例如，如果我们有表 EMPLOYEE：</p>
            <table cellSpacing=0 cellPadding=0 width=600 border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TABLE EMPLOYEE (	FIRSTNAME		CHAR(64),
                        LASTNAME		CHAR(64),
                        SALARY 			DECIMAL(10, 2))
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>那么可以添加一个代理键列 SERIALNUMBER，并将其指定为主键列。这样，这个表的定义就变为：</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TABLE EMPLOYEE (	SERIALNUMBER	BIGINT NOT NULL,
                        FIRSTNAME	CHAR(64),
                        LASTNAME	CHAR(64),
                        SALARY 		DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>那么，怎样将惟一的值赋给每一行的 SERIALNUMBER 列呢？首先需要为代理键生成惟一的值。下面我将讨论三种可行的解决方案。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0407zhang/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10068><span class=atitle>使用传统方法</span></a></p>
            <p><a name=N1006E><span class=smalltitle><strong><font face=Arial>解决方案的思想</font></strong></span></a></p>
            <p>传统方法是使用简单的 SQL 或触发器生成惟一的值。</p>
            <p><a name=N10077><span class=smalltitle><strong><font face=Arial>示例</font></strong></span></a></p>
            <p>以表 EMPLOYEE 为例。您可以在 INSERT 语句中实现代理键生成函数：</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES ((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1,
                        &#8216;John&#8217;, &#8216;Smith&#8217;, 999.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>SQL 语句 " <code>(SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1</code> " 将找出最大的 SERIALNUMBER 并将其加 1，这样新行就有一个惟一的 SERIALNUMBER。 </p>
            <p>这样做存在的一个问题是，当将第一行插入表中时，可能会得到如下错误： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>SQL0407N  Assignment of a NULL value to a NOT NULL.
                        SQLSTATE=23502.
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>得到上述错误的原因是，当表为空时，" <code>SELECT MAX(SERIALNUMBER) FROM EMPLOYEE</code> " 的返回为 NULL。因此，我们必须使用 <code>COALESCE()</code> 来处理这个问题： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES (COALESCE((SELECT MAX(SERIALNUMBER)
                        FROM EMPLOYEE), 0)+1, &#8216;John&#8217;, &#8216;Smith&#8217;, 999.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>另一种传统方法是使用触发器来生成代理键： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TRIGGER AUTOSURROGATEKEY NO CASCADE
                        BEFORE INSERT ON EMPLOYEE
                        REFERENCING NEW AS N
                        FOR EACH ROW
                        MODE DB2SQL BEGIN ATOMIC
                        SET N.SERIALNUMBER = COALESCE((SELECT MAX(SERIALNUMBER)
                        FROM EMPLOYEE), 0)+1;
                        END
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p><a name=N100A8><span class=smalltitle><strong><font face=Arial>优点及问题</font></strong></span></a></p>
            <p>传统方法易于理解，而且容易在所有系统上实现。但是，这种实现实际上会导致事务处理系统中出现并发问题。因为该实现只允许一次执行一条 INSERT 操作。 </p>
            <p>因此，在获得最大的 SERIALNUMBER 之前，" <code>SELECT MAX(SERIALNUMBER) FROM EMPLOYEE</code> " 必须等待其他所有事务完成对表 EMPLOYEE 的 INSERT 或 UPDATE 操作。例如，如果有两个事务正在对 EMPLOYEE 表进行 INSERT 操作，那么其中有一个事务会被另一个事务阻塞。显然，这种&#8220;逐次插入&#8221;的解决方案不适合多用户的事务处理系统。 </p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0407zhang/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100B8><span class=atitle>使用键管理器</span></a></p>
            <p><a name=N100BE><span class=smalltitle><strong><font face=Arial>解决方案的思想</font></strong></span></a></p>
            <p>很多大型的应用程序使用键管理器方法维护所有表的代理键。键管理器可以是一个助手类。每当需要向表插入一个行时，便可以调用键管理器生成新的键值，然后将获得的键值插入新行。</p>
            <p><a name=N100C7><span class=smalltitle><strong><font face=Arial>示例</font></strong></span></a></p>
            <p>首先，需要创建表 KEYS 来记录每个表的当前代理键值。键管理器类将使用该表生成新键值。</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TABLE KEYS (	TABLENAME		CHAR(256),
                        COLNUMNAME		CHAR(256),
                        SURROGATEKEYVALUE	BIGINT,
                        INCREMENT		BIGINT,
                        PRIMARY KEY(TABLENAME, COLNUMNAME));
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>第二，将新表（例如表 EMPLOYEE）注册到表 KEYS 中。</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO KEYS (TABLENAME, COLUMNNAME, SURROGATEKEYVALUE,
                        INCREMENT) VALUES (&#8216;EMPLOYEE&#8217;, &#8216;SERIALNUMBER&#8217;, 0, 1);
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>第三，编写 KeyManger 类来维护每个已注册表的代理键。KeyManager 将提供两个方法：</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>/**
                        *Intialize the KeyManger
                        */
                        KeyManager.singleton();
                        /**
                        *Return the unique surrogate key value according to the input table
                        *name and column name.
                        */
                        KeyManager. GetSurrogateKey(String tableName, String columnName);
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>要查看更详细的 KeyManger 的代码，请参考附录。 </p>
            <p>第四，调用 KeyManger 来获得主键值： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>&#8230;
                        KeyManager km = KeyManager.singleton();
                        Long surrogateKey = km.getSurrogateKey("EMPLOYEE", "SERIALNUMBER");
                        &#8230;
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p><a name=N100EC><span class=smalltitle><strong><font face=Arial>优点和问题</font></strong></span></a></p>
            <p>显然，键管理器是模块化设计的一个很好的例子。键管理器封装了代理键生成函数。这种实现也易于定制。您可以在 KEYS 表中为 SURROGATEKEYVALUE 或 INCREMENT 指定不同的值，以得到不同的代理键。而且，这种实现可以在大多数数据库系统上实施。但是，为了进行维护，需要一个单独的表和编写代码。所以，这种方法更适合于大型的跨数据库系统。 </p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0407zhang/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N100F5><span class=atitle>使用 DB2 UDB 特性</span></a></p>
            <p>DB2 UDB 提供了三种方法来生成惟一值。您可以使用这些方法来实现代理键。</p>
            <ul>
                <li>DB2 UDB Version 6.1 中的 GENERATE_UNIQUE() SQL 函数。
                <li>DB2 UDB Version 7.2 中 CREATE TABLE 语句的 IDENTITY 选项。
                <li>DB2 UDB Version 7.2 中的 SEQUENCE 对象。 </li>
            </ul>
            <p><a name=N1010A><span class=smalltitle><strong><font face=Arial>GENERATE_UNIQUE()</font></strong></span></a></p>
            <p><strong>解决方案的思想</strong> </p>
            <p>GENERATE_UNIQUE() 最初是在 DB2 UDB Version 6.1 中提供的一个 SQL 函数。该函数返回当前系统时间戳。我们可以使用该函数为代理键列生成惟一值。</p>
            <p><strong>示例</strong> </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TABLE EMPLOYEE (	SERIALNUMBER	CHAR(13) FOR BIT
                        DATA NOT NULL,
                        FIRSTNAME		CHAR(64),
                        LASTNAME		CHAR(64),
                        SALARY 			DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>然后可以用下面的 SQL 语句插入一行：</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(GENERATE_UNIQUE(), &#8216;John&#8217;, &#8216;Smith&#8217;, 999.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p><strong>优点和问题</strong> </p>
            <p>这里需要清楚两件事情。</p>
            <p>首先，当多个事务在同一时刻插入行时，GENERATE_UNIQUE() 可能会返回相同的时间戳。在这种情况下，GENERATE_UNIQUE() 不能为每个事务生成一个惟一的返回值，因而这种方法不适合有大量事务的系统。</p>
            <p>第二，一旦系统时钟需要向后调整，那么 GENERATE_UNIQUE() 将可能返回重复的值。 </p>
            <p>由于上述限制，我决不会在生产系统中使用 GENERATE_UNIQUE()。但是，当您需要在有限的时间内完成一个原型时，这也许是一种选择。 </p>
            <p><a name=N1013C><span class=smalltitle><strong><font face=Arial>CREATE TABLE 语句中的 IDENTITY 选项</font></strong></span></a></p>
            <p><strong>解决方案的思想</strong> </p>
            <p>IDENTITY 是 DB2 UDB Version 7.1 和后期版本提供的 CREATE TABLE 语句中的一个选项。在创建表时，可以将某个列指定为 IDENTITY 列。对于每条 INSERT 语句，DB2 将负责为其中的这一列生成一个惟一的值。 </p>
            <p><strong>示例</strong> </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TABLE EMPLOYEE (	SERIALNUMBER	BIGINT NOT NULL
                        GENERATED ALWAYS AS IDENTITY
                        (START WITH 1, INCREMENT BY 1),
                        FIRSTNAME	CHAR(64),
                        LASTNAME	CHAR(64),
                        SALARY 		DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>然后可以用下面的语句插入一行： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE (FIRSTNAME, LASTNAME, SALARY) VALUES
                        ( &#8216;John&#8217;, &#8216;Smith&#8217;, 999.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>INSERT 语句不需要指定 SERIALNUMBER 列的值。DB2 UDB 将根据列的定义自动生成惟一值，即 "GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)"。</p>
            <p><strong>优点和问题</strong> </p>
            <p>IDENTITY 函数在大多数情况下是代理键函数的一个好的解决方案。DB2 import 和 export 实用程序也支持 IDENTITY 选项。</p>
            <p>然而，在某种情况下，这种解决方案不大方便。在运行 INSERT 语句之后，应用程序将永远都不知道放入了主键列中的是什么值。如果应用程序必须继续向子表插入一个行，那么它就不得不对父表运行一条 SELECT 语句，以得到主键值。不过，如果这一点对于您的系统不成问题的话，那么使用 IDENTITY 选项是一个好主意。 </p>
            <p><a name=N1016B><span class=smalltitle><strong><font face=Arial>SEQUENCE 对象</font></strong></span></a></p>
            <p><strong>解决方案的思想</strong> </p>
            <p>SEQUENCE 对象是在 DB2 UDB Version 7.2 中引入的一个特性。用户可以在数据库中创建一个 SEQUENCE 对象，就像创建表对象或视图对象一样，然后从 SEQUENCE 中请求值。DB2 保证用户每次可以得到一个惟一的序列值。 </p>
            <p><strong>示例</strong> </p>
            <p>您可以在数据库中创建一个 SEQUENCE 对象：</p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE SEQUENCE EMPSERIAL
                        AS BIGINT
                        START WITH 1
                        INCREMENT BY 1
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>如果有一个如下所示的 EMPLOYEE 表： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>CREATE TABLE EMPLOYEE (	SERIALNUMBER	BIGINT NOT NULL,
                        FIRSTNAME		CHAR(64),
                        LASTNAME		CHAR(64),
                        SALARY 		DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>那么可以用下面的语句插入一个行： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'John', 'Smith', 99.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>在这里使用 " <code>NEXTVAL FOR EMPSERIAL</code> " 从 SEQUENCE 中获得惟一值。 </p>
            <p>您可以使用 " <code>PREVVAL FOR EMPSERIAL</code> " 获得当前连接会话中最近生成的序列值。应用程序就可以知道放入主键列中的是什么值，从而继续向子表插入一个行。这里，&#8220;在当前连接会话中&#8221;这一点很重要，这意味着 "PREVVAL" 将只返回在相同连接会话中生成的值。 </p>
            <p>例如，考虑这样的情况：有两个应用程序连接到数据库，并按照如下顺序运行下面的 SQL 语句。 </p>
            <p>（假设 SEQUENCE " <code>EMPSERIAL</code> " 的当前值是 3）。 </p>
            <p>应用程序 1： <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Martin', 'Wong', 1000.00)</pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br></p>
            <p>从 EMPSERIAL 生成的 " <code>NEXTVAL</code> " 是 4。 </p>
            <p>应用程序 2： <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Patrick', 'Chan', 99.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br></p>
            <p>从 EMPSERIAL 生成的 " <code>NEXTVAL</code> " 是 5。 </p>
            <p>应用程序 1： <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br></p>
            <p>" <code>PREVVAL</code> " 将返回 4，而不是 5。 </p>
            <p>而且， <code>PREVVAL</code> 和 <code>NEXTVAL </code>的值不会受事务回滚的影响。 </p>
            <p>例如，假设 SEQUENCE " <code>EMPSERIAL</code> " 的当前值是 30。某个应用程序开始了一个事务： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'William', 'Chen', 99.99)
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>执行 <code>ROLLBACK </code>操作。 </p>
            <p>然后，如果运行： </p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br>
            <p>则 " <code>PREVVAL</code> " 将返回 31，而不是 30。 </p>
            <p><strong>优点和问题</strong> </p>
            <p>SEQUENCE 是最近 DB2 UDB 为生成惟一值而实现的函数。它还有一个缓存函数，用于提高性能（要了解详细信息，请参阅 <a href="ftp://ftp.software.ibm.com/ps/products/db2/info/vr8/pdf/letter/db2s1e80.pdf"><u><font color=#5c81a7>IBM DB2 UDB SQL Reference</font></u></a>）。该函数比 IDENTITY 函数更灵活，因为它是数据库中的一个独立对象。必要时候，可以通过运行 <code>ALTER SEQUENCE</code> 语句更改其设置。 </p>
            <p>如果系统只在 DB2 UDB 上运行，那么 SEQUENCE 也许是最好的解决方案，因为它易于使用，而且不像键管理器那样需要额外的代码，并且可以随需求的变化很轻易对其进行更改。</p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0407zhang/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N1021C><span class=atitle>结束语</span></a></p>
            <p>本文描述了实现作为主键的代理键的三种方法。文中主要讨论了如何为代理键生成惟一的序列值。</p>
            <p>传统方法适合于简单的、单用户（非并发）系统。对于实现对于大型系统和跨平台系统，键管理器是一个好选择。但是，如果项目只在 DB2 UDB 上运行的话，可以考虑 DB2 UDB 提供的特性。IDENTITY 和 SEQUENCE 函数提供了一种容易的、灵活的解决方案。</p>
            <p>在创建 IDENTITY 列和 SEQUENCE 对象时，可以使用很多选择。请参阅 <a href="ftp://ftp.software.ibm.com/ps/products/db2/info/vr7/pdf/letter/db2d1e71.pdf"><u><font color=#5c81a7>IBM DB2 UDB Administration Guide</font></u></a>和 <a href="ftp://ftp.software.ibm.com/ps/products/db2/info/vr8/pdf/letter/db2s1e80.pdf"><u><font color=#5c81a7>IBM DB2 UDB SQL Reference</font></u></a>，以获得完整的细节。 </p>
            <br>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
                    </tr>
                </tbody>
            </table>
            <table class=no-print cellSpacing=0 cellPadding=0 align=right>
                <tbody>
                    <tr align=right>
                        <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
                        <table cellSpacing=0 cellPadding=0 border=0>
                            <tbody>
                                <tr>
                                    <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                                    <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0407zhang/index.html#main"><strong><font color=#996699>回页首</font></strong></a></td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br>
            <p><a name=N10233><span class=atitle>附录</span></a></p>
            <table cellSpacing=0 cellPadding=0 width="100%" border=0>
                <tbody>
                    <tr>
                        <td class=code-outline>
                        <pre class=displaycode>import java.sql.Connection;
                        import java.sql.DriverManager;
                        import java.sql.PreparedStatement;
                        import java.sql.ResultSet;
                        import java.sql.SQLException;
                        public class KeyManager {
                        private static KeyManager	singleton;
                        private PreparedStatement getKeyStmt = null;
                        private PreparedStatement updateKeyStmt = null;
                        static final String db2Driver = "COM.ibm.db2.jdbc.app.DB2Driver";
                        static final String db2UrlPfx = "jdbc:db2:";
                        public KeyManager Singleton() throws ClassNotFoundException,
                        SQLException{
                        if (singleton == null) {
                        if (singleton == null)
                        singleton = new KeyManager();
                        }
                        return singleton;
                        }
                        private KeyManager() throws ClassNotFoundException, SQLException{
                        Class.forName(db2Driver);
                        Connection connection = DriverManager.getConnection(db2UrlPfx+ "dbName",
                        "userName", "password");
                        getKeyStmt = connection.prepareStatement("SELECT SURROGATEKEYVALUE
                        FROM KEYS WHERE TABLENAME = ? AND COLUMNNAME = ?");
                        updateKeyStmt = connection.prepareStatement("UPDATE KEYS SET
                        SURROGATEKEYVALUE = SURROGATEKEYVALUE + INCREMENT WHERE
                        TABLENAME = ? AND COLUMNNAME = ?");
                        }
                        public Long getSurrogateKey(String tableName, String columnName)
                        throws SQLException{
                        Long keyValue = null;
                        getKeyStmt.setString(1, tableName);
                        getKeyStmt.setString(2, columnName);
                        updateKeyStmt.setString(1, tableName);
                        updateKeyStmt.setString(2, columnName);
                        updateKeyStmt.execute();
                        ResultSet rs = getKeyStmt.executeQuery();
                        if (rs.next() == true) {
                        keyValue = new Long(rs.getLong(1));
                        }
                        return keyValue;
                        }
                        }
                        </pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br><br><br>
            <p><a name=resources><span class=atitle>参考资料 </span></a></p>
            <ul>
                <li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/db2/library/techarticle/dm-0407zhang/index.html?S_TACT=105AGX52&amp;S_CMP=cn-a-db2"><u><font color=#5c81a7>英文原文</font></u></a>. <br><br>
                <li><a href="ftp://ftp.software.ibm.com/ps/products/db2/info/vr7/pdf/letter/db2d1e71.pdf"><u><font color=#5c81a7>IBM DB2 UDB Administration Guide</font></u></a> <br><br>
                <li><a href="ftp://ftp.software.ibm.com/ps/products/db2/info/vr8/pdf/letter/db2s1e80.pdf"><u><font color=#5c81a7>IBM DB2 UDB SQL Reference</font></u></a> <br></li>
            </ul>
            <br></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/i369/aggbug/131318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-07-19 17:29 <a href="http://www.blogjava.net/i369/articles/131318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用 IBM Tivoli Directory Server V5.2 实现 WebSphere Application Server V6.0.x 的全局安全性并保护 WAS 管理控制台</title><link>http://www.blogjava.net/i369/articles/130750.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 17 Jul 2007 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/130750.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/130750.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/130750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/130750.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/130750.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: developerWorks 中国&nbsp;&nbsp;&gt;&nbsp;&nbsp;WebSphere&nbsp;&nbsp;&gt;            利用 IBM Tivoli Directory Server V5.2 实现 WebSphere Application Server V6.0.x 的全局安全性并保护 WAS 管理控制台                  ...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/130750.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/130750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-07-17 10:31 <a href="http://www.blogjava.net/i369/articles/130750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM Tivoli Directory Integrator 服务器的命令行选项</title><link>http://www.blogjava.net/i369/articles/118329.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 18 May 2007 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/118329.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/118329.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/118329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/118329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/118329.html</trackback:ping><description><![CDATA[<p>以下是用于 IBM Tivoli Directory Integrator 服务器的命令行选项（<tt class=xph>ibmdisrv [options]</tt>）：</p>
<p>示例：</p>
<pre class=xmp>ibmdisrv -c"C:\demos\rs.xml" -r"Access2LDAP" -l"c:\metamerge\mydemo.log"</pre>
<a name=wq405></a>
<div class=notelisttitle id=wq405>注:</div>
<ol type=1>
    <li>在选项字母和值之间没有空格。请使用引号来保留值中可能出现的空格或逗号。
    <li>Windows Shell 执行程序最多允许以下列表中的 9 个参数。而在其它平台上没有任何限制。 </li>
</ol>
<dl>
<dt class=bold>-s &lt;dir&gt;
<dd>指定解决方案所位于的工作目录。TDI 中以及您的&#8220;配置&#8221;等中的所有相对文件引用都将相对于这个位置。这必须是第一个指定的参数。
<dt class=bold>-c &lt;file...&gt;
<dd>配置文件。如果不指定此选项，将装入和启动 Autostart 文件夹中的各项（除非指定了 <span class=pk>-D</span> 禁止装入和启动这些项）。通配符也允许，如 <tt class=xph>*.xml</tt>。
<dt class=bold>-n &lt;encoding&gt;
<dd>用来编写配置文件的编码。这必须是 Java2 中有效的字符集标识；请参阅 IANA 字符集注册表（<a href="http://www.iana.org/assignments/character-sets"><u><font color=#0000ff>http://www.iana.org/assignments/character-sets</font></u></a>）以了解这些编码值的完整列表。请注意 Java2 仅支持这些值的子集。
<dt class=bold>-r &lt;al...&gt;
<dd>要启动的组装流水线名称的列表。要启动组装流水线 <span class=bold>a</span> 和 <span class=bold>b</span>，请使用命令 <span class=bold>-r a b</span>。也支持其它语法：<span class=bold>-ra,b</span>；<span class=bold>-ra -rb</span>。 <a name=wq407></a>
<div class=notetitle id=wq407>注:</div>
<div class=notebody>如果您使用 include 和名称空间，则组装流水线可以为 myNamespace:/AssemblyLines/alName （假定名称空间 <span class=bold>myNamespace</span> 和组装流水线名称 <span class=bold>alName</span>）。</div>
<dt class=bold>-t &lt;eh...&gt;
<dd>要启动的事件处理程序名称的列表。要启动事件处理程序 <span class=bold>a</span> 和 <span class=bold>b</span>，请使用命令 <span class=bold>-t a b</span>。也支持其它语法：<span class=bold>-ta,b</span>；<span class=bold>-ta -tb</span>。
<dt class=bold>-T&lt;name&gt;
<dd>启用 JLOG 样式的跟踪，并将这些跟踪记录到 <span>trace&lt;name&gt;.log</span> 文件，该文件位于 <span>&lt;Tivoli_Common_Dir&gt;/TDI/logs/</span> 目录中。缺省是将跟踪记入内存（如果发生未处理的异常，可通过 JFFDC 的 traceback 例程将跟踪从内存中检索出来）。
<dt class=bold>-D
<dd>用于禁用 Autostart 文件夹中的事件处理程序和／或项目启动的标志。
<dt class=bold>-w
<dd>如果指定了 -r（或 -t），则此标志会使 IBM Tivoli Directory Integrator 等待每个组装流水线的事件处理程序完成后再启动下一个。如果未指定此标志，则 IBM Tivoli Directory Integrator 会并行地启动所有由 -r 参数指定的组装流水线。当最后一个组装流水线和显式启动的事件处理程序完成时，服务器停止。 <a name=wq408></a>
<div class=notetitle id=wq408>注:</div>
<div class=notebody>当服务器中没有活动线程时，该服务器停止。然而，我们发现对于 Perl，Perl 任务将作为活动线程计数。使用 <span class=bold>-w</span> 强制 IBM Tivoli Directory Integrator 在最后一个组装流水线完成后停止。</div>
<dt class=bold>-e
<dd>指定此选项将使服务器以安全方式运行。使用特定于该服务器的主密码，它将解密和加密所有的配置文件以及服务器 API 注册表。
<dt class=bold>-v
<dd>显示版本信息并退出。这仅记录在日志文件中。
<dt class=bold>-P &lt;password&gt;
<dd>密码（如果配置文件加密的话）。
<dt class=bold>-p
<dd>在启动时转储 Java 属性。请注意，您仍必须提供一个配置文件，在 Java 属性转储之前将读取该文件。
<dt class=bold><a id=mswitch name=mswitch></a>-m
<dd>启动管理和监视器控制台（AMC）服务器。同时启动 MOBJ 接口。请参阅 <span class=italic><a href="http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/topic/com.ibm.IBMDI.doc/adminguide.htm"><cite><u><font color=#0000ff>IBM Tivoli Directory Integrator 6.0: Administrator Guide</font></u></cite></a></span> 中的&#8220;Administration and Monitor Console&#8221;获取更多有关 AMC 的信息。
<dt class=bold>-M
<dd>禁用 MOBJ（管理扩展）和 AMC，而不考虑 <tt class=xph>global.properties</tt> 中的设置。
<dt class=bold>-d
<dd>在此机器上启动一个&#8220;守护程序&#8221;，即<a href="http://publib.boulder.ibm.com/infocenter/tivihelp/v2r1/topic/com.ibm.IBMDI.doc/usersguide248.htm#configinstance"><var class=pv><u><font color=#800080>配置实例</font></u></var></a>。服务器为每个指定的配置启动一个线程，再加上一个额外线程。没有任何线程将终止。
<dt class=bold>-Z
<dd>指示组装流水线在检查点表为空的情况下进行操作。所有在命令行上提供的 AL 将清空它们的检查点表。
<dt class=bold>-q
<dd>接受一个参数，mode。Mode=1 表示以记录方式运行，mode=2 表示以回放方式运行。
<dt class=bold>-l &lt;file&gt;
<dd>日志文件（缺省控制台输出）。执行的操作很少，因为很少有消息转至控制台。要为大部分记录更改日志文件，请更改 log4j.properties。
<dt class=bold>-R
<dd>禁用远程 API，而不考虑 <tt class=xph>global.properties </tt>中的设置。
<dt class=bold>-W
<dd>所有的&#8220;配置&#8221;在同一个线程中启动，但它们不终止，而是永远等待。
<dt class=bold>-S
<dd>此选项仅内部用于&#8220;配置编辑器&#8221;和&#8220;服务器&#8221;之间的通信；它用于在两者之间传递配置文件。请勿自行使用此选项。
<dt class=bold>-?
<dd>打印<span class=italic>用法</span>消息，简要显示所有选项。 </dd></dl>
<p>当 IBM Tivoli Directory Integrator 终止时，它会返回以下某个退出代码：</p>
<dl>
<dt class=bold>0
<dd>用户使用 -v 参数（显示信息并退出）启动了 IBM Tivoli Directory Integrator
<dt class=bold>1
<dd>
<ul>
    <li>无法打开日志文件（-l 参数）
    <li>无法打开配置文件
    <li>由管理请求停止</li>
</ul>
<dt class=bold>2
<dd>在自动运行后退出。当您通过指定 -w 启动 IBM Tivoli Directory Integrator 时，IBM Tivoli Directory Integrator 会运行由 -r 参数执行的组装流水线，然后退出。 <a name=wq409></a>
<div class=notetitle id=wq409>注:</div>
<div class=notebody>从&#8220;配置编辑器&#8221;中运行的组装流水线是以不同的方式启动的，它不会以状态 2 退出。</div>
<dt class=bold>9
<dd>许可证已到期或无效（废弃不再使用）。 </dd></dl>
<img src ="http://www.blogjava.net/i369/aggbug/118329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-05-18 13:41 <a href="http://www.blogjava.net/i369/articles/118329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于aix下xmanager、cde、ftp、telnet问题的小结</title><link>http://www.blogjava.net/i369/articles/117611.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117611.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117611.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117611.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117611.html</trackback:ping><description><![CDATA[感谢农哥等很多朋友的指导，可能不同环境下有不同的解决方法，我只将我的方法贴出来供大家参考：<br><br>&nbsp; &nbsp;&nbsp; &nbsp;1.如果cde无法启动，查看是否安装了cde，如没有将系统盘第一张插进光驱，simt 中有个install software bundle ，选择CDE安装就行了，我看到IBM网站和一些资料都是告诉你安装哪些fileset，很麻烦的，此法安装很方便。<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;如果装好了cde，有时却无法启动cde，就运行一下/etc/rc.dt<br><br>&nbsp; &nbsp;&nbsp; &nbsp;2.如果xmanager无法登陆，请检查/etc/hosts文件，将IP与主机名设置正确，改完之后一定要重启系统！<br><br>&nbsp; &nbsp;&nbsp; &nbsp;3.如果ping小机丢包，telnet很慢（丢包也能telnet，只不过要等很久），请检查你的ip 地址，还有路由，正确设置后ping 就不会丢包了，但telnet还会很慢，这时就检查/etc/resolv.conf，如果存在就把它删掉.<br>&nbsp; &nbsp;&nbsp; &nbsp;<br>&nbsp; &nbsp;&nbsp; &nbsp;4.如果不能ftp，将/etc/ftpusers清空或删掉，还不行？用农哥这招：rm /etc/resolv.conf，还搞不定？那我也没办法了。<br><br>如果哪位还有补充，请跟贴分享，如果有什么漏洞还请指出，谢谢! 
<img src ="http://www.blogjava.net/i369/aggbug/117611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-05-15 15:08 <a href="http://www.blogjava.net/i369/articles/117611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX CDE不能启动的故障一般性解决方法</title><link>http://www.blogjava.net/i369/articles/117606.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117606.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117606.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117606.html</trackback:ping><description><![CDATA[<div class=NewsContent id=NewsContentLabel>
<p>CDE不能启动的故障一般性解决方法 <br>Document #: 1811114I23000 </p>
<p>Body: <br>CDE不能启动的故障一般性解决方法</p>
<p>环境:AIX ALL</p>
<p>问题描述: <br>用户经常会遇到CDE桌面启动不了的情况，那么遇到这种情况应该如何解决呢？</p>
<p>解答: <br>1、检查是否从图形控制台上能看到login图形提示。如果可以看到，问题仅仅发生在输入用户名密码之后出现篮屏等等不能登陆的情况，那么检查:a&gt;各个文件系统的空间有没有满的。有的话删除部分文件或者扩大文件系统。b&gt;hostname 在/etc/hosts文件中是否和正在使用的IP地址有对应关系。如果有错误，请用hostname更改主机名或者修改/etc/hosts文件。 <br>2、如果不能启动CDE，并且连login的图形提示都无法看到。那么尝试以下步骤：a&gt;执行/usr/dt/bin/dtconfig -kill b&gt;执行ps-ef|grep dt查看是否有dtlogin进程，如果有，用kill -9 PID 杀死该进程 c&gt;在图形主控台上执行 /etc/rc.dt 命令启动CDE桌面，到login提示符。 <br>3、如果上述操作不能成功，或者根本没有/usr/dt/bin/dtconfig 和/etc/rc.dt文件，那么请从光盘上安装所有以X11.*的文件集。安装的时候，请注意选择 OVERWRITE same or newer versions? 为yes。（默认是no）在安装完之后执行第二步，不需要重启。&nbsp;&nbsp;</p>
<br><br><br>本文地址：<a href="http://www.newbooks.com.cn/info/35465.html"><u><font color=#0000ff>http://www.newbooks.com.cn/info/35465.html</font></u></a> </div>
<img src ="http://www.blogjava.net/i369/aggbug/117606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-05-15 14:59 <a href="http://www.blogjava.net/i369/articles/117606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Xmanager等终端软件无法连接AIX的解决方案</title><link>http://www.blogjava.net/i369/articles/117607.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117607.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117607.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117607.html</trackback:ping><description><![CDATA[<p><strong>显示错误：</strong><br><font color=#ff0000>XDMCP Connection failed.Try again?</font></p>
<p><strong>解决方法：</strong><br>AIX上无须进行任何配置，但是必须有XDMCP协议。服务程序在监听XDMCP端口。CDE的XDMCP服务器为 <br>dtlogin，X Window本身的XDMCP服务器为xdm，当然GNU也有一些其它的服务器。如果AIX上安了CDE，则只要启动CDE即可。如果没有安装CDE，需要启动xdm。 </p>
<p>以下命令可以确认XDMCP服务器已经启动： <br>netstat -an|grep 177 </p>
<p>检查输出，确认状态为LISTEN。如果一切正常，就可以使用Xmanager通过登录了。 </p>
<p>安装完Xmanager后，在Xbrowser中New一个XDMCP，选择XDM query，在Host输入框输入主机名或IP <br>地址，选Apply，然后Done，启动Xmanager就会显示图形登录介面了。&nbsp;</p>
<img src ="http://www.blogjava.net/i369/aggbug/117607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-05-15 14:59 <a href="http://www.blogjava.net/i369/articles/117607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX常用命令 </title><link>http://www.blogjava.net/i369/articles/117605.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/117605.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/117605.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/117605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/117605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/117605.html</trackback:ping><description><![CDATA[AIX常用命令<br>
<p class=line-height><br>查看交换区信息： <br>lsps -a 显示交换区的分布信息 <br>lsps -s 显示交换区的使用信息 <br>slibclean 清除处理程序遗留的旧分页信息 <br>smit mkps 建立交换区空间信息 <br>swapon -a 启动所有的分页空间 <br>/etc/swapspaces 存放分页空间表格信息 <br>------------------------------------------------- <br>显示卷信息： <br>lsvg 显示卷的名称 <br>lsvg -l rootvg 显示rootvg卷的详细信息 <br><br>------------------------------------------------- <br>mount卷的方法： <br>varyonvg datavg 加载datavg卷 <br>mount /dev/data1 加载datavg下的一个data1卷 <br><br>裸设备类型：raw,jfs jfs可以转变成文件系统，而raw则不行 <br>------------------------------------------------- <br><br>在裸设备上安装oracle系统： <br>修改裸设备的权限，如裸设备名为system01，安装数据库用户为oracle <br>chown oracle:dba /dev/system01 <br>chown oracle:dba /dev/rsystem01 <br>在使用文件时必须用rsystem01 <br>------------------------------------------------- <br><br>smit快速路径名称：(smit：图形方式，smitty：字符方式) <br>dev 设备管理 <br>diag 诊断 <br>jfs 定期档案管理系统 <br>lvm 逻辑卷册系统管理员管理 <br>nfs NFS管理 <br>sinstallp 软件安装及维护 <br>spooler 列印队列管理 <br>system 系统管理 <br>tcpip TCP/IP管理 <br>USER 使用者管理 <br>clstart，clstop：启动和停止cluster <br>lssrc -g cluser：查看cluser的状态 <br>------------------------------------------------- <br><br>查看已安装的软件信息： <br>ls -aF /usr/lpp (lpp:Licensed Program Products) <br>查看安装媒体内容： <br>installp -q -d /dev/cdrom -l <br>------------------------------------------------- <br><br>启动时自动加载文件系统信息： <br>需要加载的信息存放在/etc/filesystems <br>mount -t nf 加载所有在/ect/filesystems中定义type=nfs的文件系统 <br>显示已加载的文件系统及状态： df -v,mount <br>------------------------------------------------- <br><br>查看错误日志信息： <br>errpt -a <br>------------------------------------------------- <br><br>有关TCP/IP的命令 <br>网路卡： <br>smit chgenet,chgtok,chgfddi,opschange,mktty:adptr架构快速路径 <br>smit mkinet,ppp:slip与ppp快速路径 <br>ifconfig:config界面 <br>位址： <br>/etc/hosts 静态主机表 <br>/etc/resolv.conf 位址解析的名称服务器 <br>/etc/named.boot 名称服务器架构 <br>/etc/named.ca 根名称服务器快取 <br>/etc/named.data 位址列表 <br>/etc/named.rev 反转指标列表 <br>nslookup 查询名称服务器资讯 <br>网络路由： <br>route 管理路由 <br>netstat -rn 列出定义的路由 <br>routed 路由(daekmin rip) <br>gated 路由(daekmin rip、egp、hello) <br>/etc/gateways 已知网关 <br>/etc/networks 已知网路 <br>服务： <br>/etc/services <br>/etc/inetd.conf <br>TCP/IP群组子系统: <br>/etc/rc.net <br>startsrc -g tcpip 启动全部的tcpip子系统 <br>startsrc -s inetd 启动主要internet <br>除错： <br>iptrace 启动封包追踪 <br>ipreport 追踪结果格式化输出 <br>netstat 网络统计 <br>ping 检查是否可以到达 <br>查看HACMP，外部硬盘信息: <br>lscfg -v <br>lsdev -Cc adapter <br>对等机器信息： <br>/etc/.rhosts <br>/etc/hosts.equiv <br>/etc/hosts <br>------------------------------------------------- <br><br>观察进程内存使用情况： <br>ps aux 观察参数%mem：内存使用百分比 RSS:实际使用内存 <br>vmstat free的单位为块，缺省值为4096bytst <br>------------------------------------------------- <br><br>创建raw设备时选择的类型: <br>raw_lv <br><br></p>
<p class=line-height>自己总结的aix的命令，且都在小型机上通过！<br><br>登陆<br>cmd-&gt;telnet 10.122.149.1<br>修改密码<br>#passwd<br>关机<br>#shutdown<br>#shutdown &#8211;F<br>重启计算机<br>#shutdown &#8211;Fr<br>进入目录<br>#cd app(目录名)<br>回退：<br>#cd ..<br>查看设备状态<br>#lsdev -Cc disk查看磁盘是否可用<br>#lsdev -Cc adapter查看适配器是否可用<br>#lsdev -Cc tape 查看磁带是否可用<br>查看磁盘的基本属性<br>#lsattr -El hdisk5<br>从root用户修改为oracle用户<br>#chown oracle:dba aa.txt(文件名称/磁盘名称)<br>修改disk5磁盘的读写权限<br>#chmod 755 *hdisk5 <br>删除磁盘<br>#rmdev &#8211;dl hdisk5<br>磁带备份<br>#cfgmgr &#8211;v 确认磁带机<br>#lsdev &#8211;Cc tape 看磁带机是否可用<br>开始备份<br>#smitty mksysb<br>#选择可用磁带机回车(esc+4)选择<br>镜像<br>#smitty vg<br>#选择 mirror a volume group <br>#选择 rootvg<br>#hdisk1需要一段时间<br>#bosboot &#8211;ad hdisk1<br>#bootlist &#8211;m normal hdisk0 hdisk1 硬盘启动的顺序<br>HACMP 启动和停止<br>(1)、启动 HACMP<br>使用以下步骤启动 HACMP：<br>&nbsp; &nbsp; &nbsp; &nbsp; 以 root 用户 login AIX<br>&nbsp; &nbsp; &nbsp; &nbsp; 使用 smitty cl_admin 进入 HACMP 管理界面<br>&nbsp; &nbsp; &nbsp; &nbsp; 选择 Manage Cluster Services 菜单项，按 Enter 键<br>选择 Start Cluster Services 菜单项，按 Enter 键<br>&nbsp; &nbsp; &nbsp; &nbsp; 按 Enter 键启动 HACMP<br>(2)、停止 HACMP<br>使用以下步骤启动 HACMP：<br>&nbsp; &nbsp; &nbsp; &nbsp; 以 root 用户 login AIX<br>&nbsp; &nbsp; &nbsp; &nbsp; 使用 smitty cl_admin 进入 HACMP 管理界面<br>&nbsp; &nbsp; &nbsp; &nbsp; 选择 Manage Cluster Services 菜单项，按 Enter 键<br>&nbsp; &nbsp; &nbsp; &nbsp; 选择 Stop Cluster Services 菜单项，按 Enter 键<br>&nbsp; &nbsp; &nbsp; &nbsp; 按 Enter 键停止 HACMP<br>查看ip地址和子网掩码，端口号<br>#ifconfig -a <br>#netstat -i<br>#netstat -in<br>#uptime 运行天数<br>#ps &#8211;ep|grep ora 查看ora进程<br>#ps &#8211;ep|grep 查看所有的进程<br>#ps &#8211;ep|pg 按页显示进程<br>FTP命令<br>cmd下 ftp 10.122.149.1<br>#bin二进制模式下传送<br>#mput a.txt上传文件<br>#mget a.txt下载文件<br>#errpt 查看错误信息<br>#errpt &gt;/tmp/errpt2007110.txt保存errpt为txt文件<br>#errclear 0 把errpt错误日志清0<br>#kill -9 pid 关掉进程<br># cd oracle/app/crs/product/10.2/log/hdmis1/crsd<br># ls<br>core.2006-12-20-21:55:28&nbsp;&nbsp;core.2006-12-20-23:21:45&nbsp;&nbsp;core.2006-12-21-01:16:46&nbsp;&nbsp;crsd.l01<br>core.2006-12-20-22:12:57&nbsp;&nbsp;core.2006-12-20-23:25:46&nbsp;&nbsp;core.2006-12-21-01:52:35&nbsp;&nbsp;crsd.log<br>core.2006-12-20-22:50:42&nbsp;&nbsp;core.2006-12-20-23:30:20&nbsp;&nbsp;core.2006-12-21-15:33:27<br>core.2006-12-20-23:17:50&nbsp;&nbsp;core.2006-12-21-00:19:30&nbsp;&nbsp;core.2007-01-08-15:39:35<br></p>
<p class=line-height><br>&nbsp;</p>
<p><font size=3><span><font face="Times New Roman">AIX</font></span><span>是</span><span><font face="Times New Roman">IBM</font></span><span>公司开发的业界领先的优秀商务</span><span><font face="Times New Roman">Unix</font></span><span>操作系统，在可靠性、可用性、开放性、扩展性、高性能、安全性等方面都非常突出，尤其是在</span><span><font face="Times New Roman">Internet</font></span><span>的关键应用领域以及系统和硬件管理能力方面，其性能表现更为出色，受到了业界的普遍认可和广泛使用。以下是笔者几年来使用</span><span><font face="Times New Roman">AIX</font></span><span>系统的一点心得，兹供使用该系统的其他读者参考。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">1</font></span><span>．如何禁止终端上的中断键（</span><span><font face="Times New Roman">CTRL+C</font></span><span>）？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在很多应用系统中，系统管理员希望普通用户只运行自己的应用程序，不能进入系统的</span><span><font face="Times New Roman">shell</font></span><span>提示符下，但缺省情况下当用户在终端上按</span><span><font face="Times New Roman">CTRL+C</font></span><span>键时就会退到系统提示符下。由于用户终端一般没有固定的端口号，为了禁止使用中断键，可采取下面办法：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">1</font></span><span>）如果使用</span><span><font face="Times New Roman">ksh, </font></span><span>可在</span><span><font face="Times New Roman">$HOME/.profile</font></span><span>中第一行加入如下内容：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>trap "echo 'Abnormal operation'; exit" 123915 </font></span></p>
<p><font size=3><span><font face="Times New Roman">(2)</font></span><span>如果使用</span><span><font face="Times New Roman">csh(ksh</font></span><span>亦可</span><span><font face="Times New Roman">)</font></span><span>，可用如下命令：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>%stty intr ^! </font></span></p>
<p><font size=3><span>如果恢复正常情况，键入下列命令：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>% stty intr ^c </font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">2</font></span><span>．如何在</span><span><font face="Times New Roman">shell</font></span><span>中不回显（</span><span><font face="Times New Roman">echo</font></span><span>）字符？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在实际应用中，一般当我们在键盘上键入口令时不希望将其显示在屏幕上，为此可采用下面的两种办法：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>&#183;使用</span><span><font face="Times New Roman">stty </font></span><span>命令</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>stty -echo # do not display password </font></span></p>
<p><span><font face="Times New Roman" size=3>echo "Enter password: \c" </font></span></p>
<p><span><font face="Times New Roman" size=3>read PASSWD #get the password </font></span></p>
<p><span><font face="Times New Roman" size=3>stty echo # restore standard configuration </font></span></p>
<p><font size=3><span>&#183;使用</span><span><font face="Times New Roman">echo</font></span><span>命令</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>设置保密属性：</span><span><font face="Times New Roman">echo "\033[<st1:chmetcnv w:st="on" UnitName="m" SourceValue="8" HasSpace="False" Negative="False" NumberType="1" TCSC="0">8m</st1:chmetcnv>" </font></span></font></p>
<p><font size=3><span>取消保密属性：</span><span><font face="Times New Roman">echo "\033[m" </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">3</font></span><span>．如何在某个目录及其所属子目录的所有文件中查找字符串？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在程序维护过程中，有时需要在某个目录及其所属子目录的所有文件中查找某一个字符串，为此可用下面两种方法（假设在</span><span><font face="Times New Roman">*.cp</font></span><span>文件中查找字符串</span><span><font face="Times New Roman">"abc"</font></span><span>，结果放在文件</span><span><font face="Times New Roman">out</font></span><span>中）：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">1</font></span><span>）</span><span><font face="Times New Roman">cat /dev/null &gt; out </font></span></font></p>
<p><span><font face="Times New Roman" size=3>find ./ -name "*.cp" -exec grep "abc"{} &gt;&gt; out </font></span></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">2</font></span><span>）</span><span><font face="Times New Roman">find ./ -name "*.cp" | xargs grep "abc" &gt; out </font></span></font></p>
<p><font size=3><span>推荐使用第二种方法，因其系统开销小、速度快。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">4</font></span><span>．如何对</span><span><font face="Times New Roman">/etc/inittab</font></span><span>文件中的一行进行注释？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>我们都知道在</span><span><font face="Times New Roman">shell</font></span><span>中使用</span><span><font face="Times New Roman">"#"</font></span><span>作为注释符号，但在</span><span><font face="Times New Roman">/etc/inittab</font></span><span>中注释一行的方法是在第一个字符前插入字符</span><span><font face="Times New Roman">"</font></span><span>：</span><span><font face="Times New Roman">"</font></span><span>。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">5</font></span><span>．如何转换</span><span><font face="Times New Roman">DOS</font></span><span>和</span><span><font face="Times New Roman">AIX</font></span><span>两种格式的文本文件？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>如欲转换</span><span><font face="Times New Roman">DOS</font></span><span>和</span><span><font face="Times New Roman">AIX</font></span><span>两种格式的文本文件，有两种方法：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">1</font></span><span>）用</span><span><font face="Times New Roman">ftp</font></span><span>命令：设置</span><span><font face="Times New Roman">ASCII</font></span><span>传输类型，在一台运行</span><span><font face="Times New Roman">AIX</font></span><span>的机器和另外一台运行</span><span><font face="Times New Roman">Windows</font></span><span>的机器之间互相传送，这里不再赘述。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>（</span><span><font face="Times New Roman">2</font></span><span>）使用</span><span><font face="Times New Roman">aix2dos</font></span><span>或</span><span><font face="Times New Roman">dos2aix</font></span><span>命令</span><font face="Times New Roman"> </font></font></p>
<p><font size=3><span>如将</span><span><font face="Times New Roman">DOS</font></span><span>格式的文本文件转换为</span><span><font face="Times New Roman">AIX</font></span><span>格式，可用命令</span><span><font face="Times New Roman">A</font></span><span>：</span><span><font face="Times New Roman">dos2aix inputfile outfile</font></span><span>，反之可用命令：</span><span><font face="Times New Roman">aix2dos inputfile outfile</font></span><span>，关于</span><span><font face="Times New Roman">dos2aix</font></span><span>和</span><span><font face="Times New Roman">aix2dos</font></span><span>命令的详细用法可参阅</span><span><font face="Times New Roman">"dos2aix -h "</font></span><span>和</span><span><font face="Times New Roman">"aix2dos -h "</font></span><span>。注意要使用这两个命令，必须首先安装文件集</span><span><font face="Times New Roman">bos.pci</font></span><span>。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">6</font></span><span>．如何解决某一</span><span><font face="Times New Roman">PV</font></span><span>上的</span><span><font face="Times New Roman">VGDA</font></span><span>与</span><span><font face="Times New Roman">ODM</font></span><span>库不一致的问题？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在系统维护过程中，因为操作错误或其他特殊原因，有可能使某一</span><span><font face="Times New Roman">PV</font></span><span>上的</span><span><font face="Times New Roman">LVCB</font></span><span>和</span><span><font face="Times New Roman">VGDA</font></span><span>与其对应的</span><span><font face="Times New Roman">ODM</font></span><span>库不一致，导致</span><span><font face="Times New Roman">ODM</font></span><span>库紊乱，对</span><span><font face="Times New Roman">PV</font></span><span>的有关操作无法进行，这时可采用如下两个</span><span><font face="Times New Roman">AIX</font></span><span>命令加以解决：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>redefinevg -d hdisk_name vg_name </font></span></p>
<p><font size=3><span>该命令以指定</span><span><font face="Times New Roman">PV</font></span><span>上的</span><span><font face="Times New Roman">LVM</font></span><span>信息重新定义给定</span><span><font face="Times New Roman">VG</font></span><span>的</span><span><font face="Times New Roman">ODM</font></span><span>库。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>或：</span><span><font face="Times New Roman">synclvodm -P -v vgname </font></span></font></p>
<p><font size=3><span>该命令同步或重建给定</span><span><font face="Times New Roman">VG</font></span><span>的</span><span><font face="Times New Roman">ODM</font></span><span>库和</span><span><font face="Times New Roman">LVM</font></span><span>信息。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">7</font></span><span>．如何设置用户的文件大小限制？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>在</span><span><font face="Times New Roman">AIX</font></span><span>系统中，用户使用系统资源是有一定限制的。如用户缺省可创建或扩展的最大文件为</span><st1:chmetcnv w:st="on" UnitName="g" SourceValue="1" HasSpace="False" Negative="False" NumberType="1" TCSC="0"><span><font face="Times New Roman">1G</font></span></st1:chmetcnv><span>（参见</span><span><font face="Times New Roman">/etc/security/limits: fsize = 2097151, fsize_hard=fsize 512-bytes blocks</font></span><span>）。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>如欲修改，可使用</span><span><font face="Times New Roman">smit: </font></span></font></p>
<p><font size=3><span><font face="Times New Roman"># smit chuser </font></span><span>选择用户，修改下面两项：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>Soft FILE size [4194302] </font></span></p>
<p><font size=3><span><font face="Times New Roman"># (<st1:chmetcnv w:st="on" UnitName="g" SourceValue="2" HasSpace="False" Negative="False" NumberType="1" TCSC="0">2G</st1:chmetcnv>,</font></span><span>可根据需要设定</span><span><font face="Times New Roman">) </font></span></font></p>
<p><span><font face="Times New Roman" size=3>Hard FILE size [4194302] </font></span></p>
<p><font size=3><span><font face="Times New Roman"># (<st1:chmetcnv w:st="on" UnitName="g" SourceValue="2" HasSpace="False" Negative="False" NumberType="1" TCSC="0">2G</st1:chmetcnv>, </font></span><span>可根据需要设定</span><span><font face="Times New Roman">) </font></span></font></p>
<p><font size=3><span>用该用户身份登录，使用</span><span><font face="Times New Roman">"ulimit -f "</font></span><span>和</span><span><font face="Times New Roman">"ulimit -Hf"</font></span><span>可分别显示其</span><span><font face="Times New Roman">fsize</font></span><span>、</span><span><font face="Times New Roman">fsize_hard</font></span><span>的大小。</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><font size=3><span><font face="Times New Roman">8</font></span><span>、如何按文件大小排序列出一个文件系统下的文件？</span><span><font face="Times New Roman"> </font></span></font></p>
<p><font size=3><span>当监控某一文件系统的空间使用情况时，如果该文件系统剩余空间较少或已使用空间增长较快，则有必要排序列出该文件系统中所有大于某一给定字节数的文件，以便进一步维护管理。为此，可用如下命令：</span><span><font face="Times New Roman"> </font></span></font></p>
<p><span><font face="Times New Roman" size=3># find [filesystem_name] -xdev -size +[512-bytes bloks] -ls | sort -r -n -k7 </font></span><br></p>
<img src ="http://www.blogjava.net/i369/aggbug/117605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-05-15 14:55 <a href="http://www.blogjava.net/i369/articles/117605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM MQSeries使用指南</title><link>http://www.blogjava.net/i369/articles/114115.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 27 Apr 2007 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/114115.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/114115.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/114115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/114115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/114115.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 随着计算机网络和分布式应用的不断发展，远程消息传递越来越成为应用系统中不可缺少的组成部分。商业消息中间件的出现保证了消息传输的可靠性，高效率和安全性，同时也减少了系统的开发周期。目前应用最多的消息中间件产品为IBM MQSeries。本文就针对MQ的基本操作与配置进行详细的阐述，希望对读者有所帮助。                                    ...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/114115.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/114115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-27 16:14 <a href="http://www.blogjava.net/i369/articles/114115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM MQ常用命令</title><link>http://www.blogjava.net/i369/articles/114114.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 27 Apr 2007 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/114114.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/114114.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/114114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/114114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/114114.html</trackback:ping><description><![CDATA[常用命令<br>创建队列管理器<br>crtmqm &#8211;q QMgrName<br>-q是指创建缺省的队列管理器<br>删除队列管理器<br>dltmqm QmgrName<br>启动队列管理器<br>strmqm QmgrName<br>如果是启动默认的队列管理器，可以不带其名字<br>停止队列管理器<br>endmqm QmgrName 受控停止<br>endmqm &#8211;i QmgrName 立即停止<br>endmqm &#8211;p QmgrName 强制停止<br>显示队列管理器<br>dspmq &#8211;m QmgrName<br>运行MQSeries命令<br>runmqsc QmgrName<br>如果是默认队列管理器，可以不带其名字<br><br>往队列中放消息<br>amqsput QName QmgrName<br>如果队列是默认队列管理器中的队列，可以不带其队列管理器的名字<br>从队列中取出消息<br>amqsget QName QmgrName<br>如果队列是默认队列管理器中的队列，可以不带其队列管理器的名字<br>启动通道<br>runmqchl &#8211;c ChlName &#8211;m QmgrName<br><br>启动侦听<br>runmqlsr &#8211;t TYPE &#8211;p PORT &#8211;m QmgrName<br><br>停止侦听<br>endmqlsr -m QmgrName<br><br>MQSeries命令<br>定义死信队列<br>DEFINE QLOCAL（QNAME） DEFPSIST（YES） REPLACE<br>设定队列管理器的死信队列<br>ALTER QMGR DEADQ（QNAME）<br>定义本地队列<br>DEFINE QL（QNAME） REPLACE<br>定义别名队列<br>DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)<br>远程队列定义<br>DEFINE QREMOTE（QRNAME） +<br>RNAME（AAA） RQMNAME（QMGRNAME） +<br>XMITQ（QTNAME）<br>定义模型队列<br>DEFINE QMODEL（QNAME） DEFTYPE（TEMPDYN）<br>定义本地传输队列<br>DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +<br>INITQ（SYSTEM.CHANNEL.INITQ）+<br>PROCESS(PROCESSNAME) REPLACE<br><br>创建进程定义<br>DEFINE PROCESS（PRONAME） +<br>DESCR（&#8216;STRING&#8217;）+<br>APPLTYPE（WINDOWSNT）+<br>APPLICID（&#8217; runmqchl -c SDR_TEST -m QM_ TEST&#8217;）<br>其中APPLTYPE的值可以是：CICS、UNIX、WINDOWS、WINDOWSNT等<br><br>创建发送方通道<br>DEFINE CHANNEL（SDRNAME） CHLTYPE（SDR）+<br>CONNAME（&#8216;100.100.100.215(1418)&#8217;） XMITQ（QTNAME） REPLACE<br>其中CHLTYPE可以是：SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。<br><br>创建接收方通道<br>DEFINE CHANNEL（SDR_ TEST） CHLTYPE（RCVR） REPLACE<br><br>创建服务器连接通道<br>DEFINE CHANNEL（SVRCONNNAME） CHLTYPE（SVRCONN） REPLACE<br><br>显示队列的所有属性<br>DISPLAY QUEUE（QNAME） [ALL]<br><br>显示队列的所选属性<br>DISPLAY QUEUE（QNAME） DESCR GET PUT<br>DISPLAY QUEUE（QNAME）MAXDEPTH CURDEPTH<br><br>显示队列管理器的所有属性<br>DISPLAY QMGR [ALL]<br><br>显示进程定义<br>DISPLAY PROCESS（PRONAME）<br><br>更改属性<br>ALTER QMGR DESCR（&#8216;NEW DESCRIPTION&#8217;）<br>ALTER QLOCAL（QNAME） PUT（DISABLED）<br>ALTER QALIAS（QNAME） TARGQ（TARGQNAME）<br><br>删除队列<br>DELETE QLOCAL（QNAME）<br>DELETE QREMOTE（QRNAME）<br><br>清除队列中的所有消息<br>CLEAR QLOCAL（QNAME）<br><br>常用补充命令<br>显示队列管理器 dspmq<br>显示文件名 dspmqfls<br><br>启动本地队列管理器 strmqm<br>结束本地队列管理器 endmqm<br>启动通道启动进程 runmqchi/runmqchl<br>
<img src ="http://www.blogjava.net/i369/aggbug/114114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-27 16:12 <a href="http://www.blogjava.net/i369/articles/114114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>