??xml version="1.0" encoding="utf-8" standalone="yes"?>黄色影院在线播放,久久久久伊人,麻豆av电影在线观看http://www.aygfsteel.com/i369/category/22055.html北极心空zh-cnFri, 27 Jul 2007 03:17:00 GMTFri, 27 Jul 2007 03:17:00 GMT60DB2使用l验备忘http://www.aygfsteel.com/i369/articles/132086.html芦苇芦苇Tue, 24 Jul 2007 08:48:00 GMThttp://www.aygfsteel.com/i369/articles/132086.htmlhttp://www.aygfsteel.com/i369/comments/132086.htmlhttp://www.aygfsteel.com/i369/articles/132086.html#Feedback0http://www.aygfsteel.com/i369/comments/commentRss/132086.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/132086.html  2.控制中心中无法增删改数据Q只能编写sql语句来实现而quest提供的工兯然能增加数据Q但居然无法用复制、粘贴和Tab键,必须逐个输入Q然后用鼠标点击切换现存数据看来可以在单元格中编辑修改,但实际却无法commitQ呵呵,q是老老实实写update语句Q至于删除数据,更是非写delete语句不可。不q可以用pb以单元格方式~辑数据Q相应的一个缺Ҏ~辑数据的按钮和删除表的按钮太近Q万一炚w了删除表的按钮,pb可是不作提示把表给删了的,faint

  3.DB2的视N不能直接用order by语句Q必这样写 select × from(select aQbQc from table1 order by a)as tab

  q种写法的前提是你已l打q补丁了

  4.存储q程的问?

  DB2提供ltrim函数和rtrim函数Q但偏偏不提供trim函数Q如果你希望去除字符两端的空|对不P必须用ltrim(rtrim()) 的方式调用insert 语句里面居然不能用表辑ּ赋|必须把值先赋给一个变量调用其他存储过E时竟然不能用常量做参数Q必Lq个帔R的Dl一个变量,再以q个变量为参?/p>

  select * from table fetch first n rows only 语句居然在存储过E里不可?/p>

  5.存储q程里可以用动态sql,但函数里却不可以使用,kao

  6. 遇到commit或rollback时自动关闭游标,所以需要慎重用单独提交?/p>

  proc builder老是在调试中内存不Q屏q花掉。而如果断点调试时暂停不进行下ȝ旉E微长一点就会提CӞ受不了?/p>

  7.开发中遇到的一个问?/p>

  在?日期变量+1 MONTHS OR 日期变量-1 MONTHS 的方式取日期Ӟ比如日期变量gؓ 2004-02-29Ӟ存储q程里将日期变量+1 MONTHS 赋值给另一

  日期变量时会出错。相应SQLSTATE?1506(db2 ? 01506): ?DATE 或TIMESTAMPD行了调整Q以校正术q算得出的无效日期?/p>

  如果要获取的只是下一月䆾Q可采用的替代方法是获取当前日期所在月份的W一天作为基准后+1 MONTHS OR -1 MONTHS

  8.哈哈,今天帮别人弄存储q程的经验@04.08.05

  搞了半天搞不定,一查原来的文档才了Q原来tmd该死的DB2的存储过E,是{换ؓC后,q行~译的。因此在数据库服务器上要安装一个C~译器才能完成存储过E的~译。ƈ且需要用DB2SET命oQ设|DB2_SQLROUTINE_COMPILER_PATH指向C~译器的安装路径。如:db2set

  DB2_SQLROUTINE_COMPILER_PATH=E:\ProgramFiles\MicrosoftVisualStudio\VC98\Bin\vcvars32.bat

  9.对变量的赋g能用select ..into ..方式而要用set v=(select ..)的方式,代码CZ如下?/p>

drop function SXFM.ISORDERSUBMITDATE;
CREATE FUNCTION SXFM.ISORDERSUBMITDATE(IN_ROW_ID DECIMAL(16,0))
  RETURNS DATE
  LANGUAGE SQL
BEGIN ATOMIC
DECLARE V_SUBMIT_DATE DATE;
DECLARE V_SELL_ID DECIMAL(16, 0);
DECLARE V_BUY_ID DECIMAL(16, 0);

set V_SELL_ID = (SELECT COALESCE(RECEIVE_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);
set V_BUY_ID = (SELECT COALESCE(PAY_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);
set V_SUBMIT_DATE = (SELECT DATE(MAX(A.SUBMIT_DATE)) FROM AM_AUDIT_QUEUE A,SM_USER B,SM_USER C
WHERE A.TABLE_CODE='IS_ORDER' AND A.TABLE_ROW_ID=IN_ROW_ID
AND A.AUDIT_EMP_ID=C.ROW_ID AND C.BRANCH_ID=V_BUY_ID   --审核方ؓ付款?br>AND A.SUBMIT_EMP_ID=B.ROW_ID AND B.BRANCH_ID=V_SELL_ID); --提交方ؓ收款?br>
RETURN V_SUBMIT_DATE;
END;
#SYNC 10;

  10.DB2的游标打开后遇到commit和rollback默认是会关闭的。保持游标打开的方法是在定义游标时加上with hold选项

  11.F:导出某张表的数据Q且该表包含long varchar型数据,该如何操作Q:Export:db2 connect 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

 

=============================================================================

DB2上机操作指o指南


1. 启动实例(db2inst1):

  db2start

  2. 停止实例(db2inst1):

  db2stop

  3. 列出所有实?db2inst1)

  db2ilist

  5.列出当前实例:

  db2 get instance

  4. 察看CZ配置文g:

  db2 get dbm cfg|more

  5. 更新数据库管理器参数信息:

  db2 update dbm cfg using para_name para_value

  6. 创徏数据?

  db2 create db test

  7. 察看数据库配|参C?/p>

  db2 get db cfg for test|more

  8. 更新数据库参数配|信?/p>

  db2 update db cfg for test using para_name para_value

  10.删除数据?

  db2 drop db test

  11.q接数据?/p>

  db2 connect to test

  11.列出所有表I间的详l信息?/p>

  db2 list tablespaces show detail

  12.列出容器的信?/p>

  db2 list tablespace containers for tbs_id show detail

  13.创徏?

  db2 ceate table tb1(id integer not null,name char(10))

  14.列出所有表

  db2 list tables

  12.插入数据:

  db2 insert into tb1 values(1,’sam’);

  db2 insert into tb2 values(2,’smitty’);

  13.查询数据:

  db2 select * from tb1

  14.数据:

  db2 delete from tb1 where id=1

  15.创徏索引:

  db2 create index idx1 on tb1(id);

  16.创徏视图:

  db2 create view view1 as select id from tb1

  17.查询视图:

  db2 select * from view1

  18.节点~目

  db2 catalog tcp node node_name remote server_ip server server_port

  19.察看端口?/p>

  db2 get dbm cfg|grep SVCENAME

  20.试节点的附?/p>

  db2 attach to node_name

  21.察看本地节点

  db2 list node directory

  22.节点反编?/p>

  db2 uncatalog node node_name

  23.数据库编?/p>

  db2 catalog db db_name as db_alias at node node_name

  24.察看数据库的~目

  db2 list db directory

  25.q接数据?/p>

  db2 connect to db_alias user user_name using user_password

  26.数据库反~目

  db2 uncatalog db db_alias

  27.导出数据

  db2 export to myfile of ixf messages msg select * from tb1

  28.导入数据

  db2 import from myfile of ixf messages msg replace into tb1

  29.导出数据库的所有表数据

  db2move test export

  30.生成数据库的定义

  db2look -d db_alias -a -e -m -l -x -f -o db2look.sql

  31.创徏数据?/p>

  db2 create db test1

  32.生成定义

  db2 -tvf db2look.sql

  33.导入数据库所有的数据

  db2move db_alias import

  34.重组?/p>

  db2 reorgchk

  35.重组表tb1

  db2 reorg table tb1

  36.更新l计信息

  db2 runstats on table tb1

  37.备䆾数据库test

  db2 backup db test

  38.恢复数据库test

  db2 restore db test



芦苇 2007-07-24 16:48 发表评论
]]>
在DB2中创建第一个触发器http://www.aygfsteel.com/i369/articles/132069.html芦苇芦苇Tue, 24 Jul 2007 07:47:00 GMThttp://www.aygfsteel.com/i369/articles/132069.htmlhttp://www.aygfsteel.com/i369/comments/132069.htmlhttp://www.aygfsteel.com/i369/articles/132069.html#Feedback2http://www.aygfsteel.com/i369/comments/commentRss/132069.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/132069.html?/strong>

当特定事件在 IBM® DB2® Universal Database™ 数据库中发生Ӟ您就可以Ȁz?触发?/em>来执行其他一些操作。在本文中,您将在触发器的世界里遨游Q看看如何通过触发器来增强数据库中的业务规则。您q将学习如何使用 DB2 UDB Version 8.1 的控制中心来帮助您创Z个应用于单业务场景的单触发器?

什么是触发?/span>

当一个指定的 SQL 操作Q如 DELETEQINSERTQ或者是 UPDATE 操作Q作用于某张表时Q一个定义了一l操作的触发器就可以被激zR触发器q不像参照完整性约束和查约束那P我们甚至可以使用对其他表来进行更新?/p>

业务场景

一Ҏ术应用于真实世界的一个场景L有益的。出于教学的目的Q让我们在一个银行相关环境中研究触发器,在该模拟环境中,我们仅仅建立了一张表。再ơ强调,q是被简化了的!我们要做的是,q用触发器来促进银行提供的透支保护。例如,一个银行客h一个支帐Pchecking accountQ和一个储蓄帐Psaving accountQ。当从支帐户中取款的金额超q了该帐L余额Ӟ׃发生一ơ自动的转帐Q叫做透支保护Q,卌动从客户的储蓄帐戯{帐过来。当Ӟq必ȝ合一定的条gQ即储蓄帐户中必L_多的钱来补偿透支的金额?/p>

开?/span>

像上面所提及的,我们的银行仅仅包含一张表。在q张表中Q我们将存入客户的支帐户和储蓄帐户的余额等信息。每个客户通过其社会保险号码来标识。下面是对该表的描述Q?/p>

?1. ?ACCTTABLE 的描q?

Column Name Column Type Nullable?
SSN* Varchar(11) NO
LastName Varchar(30) NO
FirstName Varchar(30) NO
SavingBalance Decimal (Precision: 7, Scale: 2) NO
CheckingBalance Decimal (Precision: 7, Scale: 2) NO
* 表示主键

请?DB2 命o行处理器Z面的表创Z个数据库。将数据库命名ؓ

接下来,q接到该数据库。我假设您已l在您的机器上有了一个用户名? 密码?的帐受?

现在Q创?表:

db2 => 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)
            

现在向所创徏的表中加入两条记录:

db2 => insert into accttable values
            ('111-11-1111','Bhogal','Kulvir',1500.00,1000)
            
db2 => insert into accttable values
            ('222-22-2222','Guy','Someother',2000.00,4000)
            

触发器可以在对表的一?INSERT?DELETE 或?UPDATE 操作 之前?之后启动。在我们的例子中Q您创Z个在对ACCTTABLE 表执?UPDATE 操作之前启动的触发器。在触发器术语中QINSERT?DELETE 或?UPDATE q些使得触发器启动的事g被称?触发事g?/em>触发器的启动是在触发事g之前q是之后则称发器?ȀzL?/em>?

使用 Control Center 创徏触发?/span>

打开 DB2 Control Center 开始创发器Q展开您创建的数据库(?bnkdbQ,鼠标右键点击 Triggers 选项q且选择 Create.....

?1. 创徏触发?/strong>

Figure 1.

?Create Trigger 屏幕中,可以指定触发器所在的模式。请选择 DB2ADMIN 模式。记住,触发器是与表相关的,所以我们需要选择相关表的模式。然后请再次选择 DB2ADMIN 模式Q?

?2. 选择模式

Figure 2.

在同一个屏q中, 需要指定一个触发器的名字。将触发器命名ؓ OVERDRAFT。而且Q需要指定与该触发器相关的表的名字。这里选择您创建的 ACCTTABLE?

?3. 选择您创建的?/strong>

Figure 3.

?Time to trigger action区域中,选择 Before?

?4. 选择 Before

Figure 4.

?Operation that causes the trigger to be executed区域中选择 Update of columns 操作q且指定被操作列?CHECKINGBALANCEQ?

?5.

Figure 5. Specify the column name

点击 Triggered action标签|创徏该触发器Q?

?6. 构徏触发?/strong>

Figure 6.

指定临时变量

DB2 UDB 能够跟踪在启动触发器的那条语句之前和之后的一行的状态。请?Correlation name for the old rows 一栏中填入 ?Correlation name for the new rows 一栏中填入 Q?

?7. 指定 NEWROW

Figure 7.

注意Q您也许无法指定其中的一?correlation nameQ因为它依赖于引赯发器启动的特定操作和ȀzL间的l合。例如,假设您的触发器选择?Time to trigger action ?BeforeQ触发事件是 DELETE 语句。在q种情况下,我们无法指定一?"Correlation name for the new rows"。ؓ什么呢Q因为在执行了一个删除操作以后,新行是不存在的?

因ؓ您创建的触发器是?UPDATE 之前被激z,所以不能编?Temporary table for the old rows ?Temporary table for the new rows选项?

您将注意刎ͼ在这U情况下Q一个在 UPDATE 之前被激zȝ触发器)Q您只能指定触发器针??/em> ?/em>而不是针Ҏ?语句触发?

?8. 触发器触发于每行

Figure 8.

引v触发事g的语句可能会同时影响数据库中的多行?For each Row" 选项意味着触发器将在每一行被修改时激zR另一斚wQ?For each statement" 选项Q?before" 型触发器是不允许的)则意味着触发器定义的操作只在调用一?SQL 语句后执行一ơ?/p>

可以点击 Show SQL按钮来看看底层的 SQL 语句到目前ؓ止是什么样子:

?9. Show SQL ?/strong>

Figure 9.

构徏触发动作

现在该创发动作了。我们的业务规则是支帐L余额必须低于 0 才能Ȁz该触发器。也是_我们需要指?search-condition ? 。我们之所以指?是因为需要分析在 update 操作之后支票帐户的余额将会是多少?

创徏触发器主?/span>

现在我们要?Triggered Action 文本区域中替? Q参见下面)?

?10. 创徏触发器语?/strong>

Figure 10.

用来替换的代码如?

declare overage decimal (7,2);
            set overage = (NEWROW.CHECKINGBALANCE*-1);
            if overage>OLDROW.SAVINGBALANCE then SIGNAL SQLSTATE '70001'
            ('Overdraft Protection Unsuccessful');
            else set newrow.savingbalance =
            oldrow.savingbalance-overage, newrow.checkingbalance = 0;
            end if;
            

让我们一句一句地仔细研究一下这D代码。在触发器主体中Q可以声明将要在M中用的变量。我们用下面这行代码来声明变量Q? ; q样定义了一个类型ؓ 名ؓ overage 的变量?

下一步我们将 overage 变量的D|ؓ ;

我们用该式计算出我们想要从支票帐户取出的超?overage)的数目。指? 是因为我们需要分析支帐L余额?update 操作发生?/em>是多?

发出错误条g信号

如果q反了您在触发器中定义的业务规则Q就可以使用 SIGNAL 语句来抛Z个错误条件信受在我们的例子中Q不允许有h拥有的支帐户余额ؓ负数。如果有人想要将支票帐户的余额列更新Z个负敎ͼ我们可以试着看看在储蓄帐户中是否有够多的钱来补偿这个负数。如果没有,那么可以发Z?SQL 状态ؓ '70001' 的信?"'Overdraft Protection Unsuccessful"?/p>

认识到包?SIGNAL 语句的效果是很重要的。SIGNAL 语句回滚p发语句(也就是我们的 update 语句Q尝试的更改。SIGNAL 语句也将回滚在触发器内发生的更改。此外,假设我们是?Java™ 应用E序来与数据库进行交互的Qƈ且试图执行一ơ会触发我们的触发器q违反业务规则的 update 操作。Java 应用E序接受我们所指定?SQLSTATE 以及gؓ -438 ?SQLCODE。在q行中我们?SIGNAL SQLSTATE 属性:

if overage>OLDROW.SAVINGBALANCE then SIGNAL SQLSTATE '70001'
            ('Overdraft Protection Unsuccessful');
            

该行说明Q如果我们的 overage 比储蓄帐L余额数目q要大,那么需要抛Z个危险信受?/p>

转帐

如果储蓄帐户的余额数目够补偿超出的数目Q这时就会发生{帐。如果满U条Ӟ我们对新行作两处修改:

  1. 修改 "new row" ?savingbalance 列,其减去 overage 以促成透支转帐?
  2. 支帐L余额讄?0。我们用下面的代码来完成:


            else set newrow.savingbalance = oldrow.savingbalance-overage,
            newrow.checkingbalance = 0; end if;
            

最l结?/span>

可以再次通过 Show SQL按钮来看看最后的l果Q?

?11.昄 SQL

Figure 11.

在点?Close之后Q您看?OVERDRAFT 触发器已l创建好了:

?12. 创徏 OVERDRAFT 触发?/strong>

Figure 12.



可以通过一?update 语句来进行测试。打开命o行编写下面的语句Q?/p>

db2=> update accttable set checkingbalance = -500 where ssn='111-11-1111'
            

Ҏ我们创徏的业务逻辑Q这?update 操作启动该触发器,׃支票帐户透支Q该触发器将?savingbalance 列取?500.00 到支帐戗因此,SSN ?111-11-1111 的帐L checkingbalance 会变?0.00 ?savingbalance 变?1000.00Q原来的余额 1500 Q?透支?500Q。下面的查询验证了该l果Q?/p>

?13. 查询

Figure 13.

֣

您已l在一个假想的业务场景中创Z一?DB2 触发器。触发器?DB2 数据库的一个非常强大的Ҏ,您可以用它业务逻辑分化到关pL据库q边。如果考虑到有多个应用E序都将与同一个数据库q行交互Q您׃发现q种分化是非常强大的。在一个大型企业中Q您可能多次遇到q这L情况Q即不知道要创徏的是怎样一个将与数据库交互的应用程序。与其只是希望这些应用程序遵守被认ؓ是您的组l机构的戒律的业务规则,q不如用触发器作ؓ您工L中的一U工P以确保现在和来与数据库q行交互的所有的应用E序强制遵守q些业务规则。一个触发器只能兌一个表Q而不能关联一个视图。您也许可以考虑使用 INSTEAD OF 触发器来与视图交互?/p>




芦苇 2007-07-24 15:47 发表评论
]]>
Q 复制?Consistent Change Data ?/title><link>http://www.aygfsteel.com/i369/articles/131319.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Jul 2007 09:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/i369/articles/131319.html</guid><wfw:comment>http://www.aygfsteel.com/i369/comments/131319.html</wfw:comment><comments>http://www.aygfsteel.com/i369/articles/131319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/i369/comments/commentRss/131319.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/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 支持一U新的目标表Q即 Consistent Change Data (CCD) 表。探?Q Replication 用户之所以需要这些表的原因,q考虑在?CCD 表作为目标的情况下,可能出现的一些新的复制架构。学习如何定义和使用 CCD 表,q需要对 Q Replication 的安装和配置有基本的了解。另外,q看看在使用 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="http://www.ibm.com/i/c.gif" width="8" height="1" alt=""/></td> <td width="16"><img src="http://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="http://www.ibm.com/i/c.gif"/></td> <td width="16"><img alt="" width="16" height="16" src="http://www.ibm.com/i/c.gif"/></td> <td class="small" width="122"> <p><span id="wmqeeuq" class="ast">未显C需?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>U别: 中</p> <p><a ><u><font color=#996699>Sean Byrd</font></u></a> (<a href="mailto:sabyrd@us.ibm.com?subject=Q 复制和 Consistent Change Data 表"><u><font color=#5c81a7>sabyrd@us.ibm.com</font></u></a>), Americas Techworks SME, IBM<br></p> <p>2006 q?7 ?10 ?/p> <blockquote>卛_发布?Q Replication 支持一U新的目标表Q即 Consistent Change Data (CCD) 表。探?Q Replication 用户之所以需要这些表的原因,q考虑在?CCD 表作为目标的情况下,可能出现的一些新的复制架构。学习如何定义和使用 CCD 表,q需要对 Q Replication 的安装和配置有基本的了解。另外,q看看在使用 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 id="wmqeeuq" class=atitle>?/span></a></p> <p>Consistent Change Data (CCD) 表一直是 SQL Replication 中一U流行的目标表。通过支持 CCD 表作为另一U目标选项Q对于熟?Q Replication 的h来说Q他们就可以利用q种新功能了。这时您可能要问Q?#8220;Z么我应该在我的复制架构中考虑 CCD 表?” CCD 表通过兌的跟t机制暴露数据,以便准确地描l源表的事务历史。换句话_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 ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=N1004A><span id="wmqeeuq" class=atitle>使用 CCD</span></a></p> <p><strong>历史?/strong> —?在Q何系l中Q都会有一些关键的表需要能够恢复或重徏。通过关键的源表复制C?CCD 目标表,可以逐个事务C头开始重个表。更的是,如果表中输入了坏的数据,CCD 记录q允许您查看哪些行受到媄响,让您很容易改变主意,或者正地更新所需的倹{?/p> <p><strong>扇出场景dQFan out scenario stagingQ表</strong> —?传统上,CCD 目标表用于帮助创建扇出架构,一个源复制到多个目标。这意味着之前 SQL Replication 不能接受的一些高吞吐量的工作负蝲现在可以被复制到多个目标了?/p> <p><strong>不受支持的数据库d?/strong> —?对于数据放?Q Replication 受支持的l构之外的数据库中这一d而言QCCD 目标表也是一U理想的Ҏ。有了最新的修复包(用于 Oracle ?Sybase 的修复包版本?9Q用?Microsoft SQL Server ?Informix 的修复包版本?10Q,DB2® 之外的数据库可以作ؓ Q Replication 的目标数据库Q不q仍然有很多目标数据库不可用。虽?CCD 目标表不能自动将数据复制C受支持的目标数据库中Q但是它通过用户应用E序暴露数据。所以,只需单地?IBMSNAP_OPERATION 列选择数据C个动作变量,然后l合Ҏ列的值的选择Q用一个用?insert、update ?delete ?case 语句Q便可以事务复制到M您想在其上编E的数据源?/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 ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=N10064><span id="wmqeeuq" class=atitle>实现 CCD</span></a></p> <p>接下来我们看看如何创?CCD 目标表。本节假设您已经知道如何配置 Q Replication —?因此着重讲解队列映和队列订阅的创建。以前,当选择一U目标表cdӞ如果使用 Replication Center's Create Queue Subscription 向导的话Q就在这个向g的第 5 步)Q您有两个选择 —?表或存储q程。现在您可以选择 CCD TableQ但是必L定您惌哪种cd?CCD。如果用的?ASNCLPQ那么语法如下:</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> >>-CREATE QSUB--+------------+--+-------------------------+-----> '-SUBTYPE--U-' '-USING REPLQMAP--mapname-' ... trg-clause >--+-------------------------------+----------------------------> '-TYPE--+-USERTABLE-----------+-' +-STOREDPROC----------+ +-NICKNAME------------+ '-CCD--| ccd-clause |-' ... ccd-clause |--+--------------------+--+-------------------+----------------> '-CONDENSED--+-ON--+-' '-COMPLETE--+-ON--+-' '-OFF-' '-OFF-' </pre> </td> </tr> </tbody> </table> <br> <p>要创Z?CCDQ必L定两个新属?—?condensedQ压~的Q和 completeQ完整的Q?a ><u><font color=#996699>?1</font></u></a> 展示了这些属性如何媄响目标表的创建:</p> <br><a name=table1><strong>?1. 完整的还是压~的Q?/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>目标表创建好之后Q其中填充有源表中的所有行?/td> <td>目标表创建好之后为空?/td> </tr> <tr> <td>condensed</td> <td>目标表只包含行中最q被更改的倹{?/td> <td>目标表包含所有行的所有历史倹{?/td> </tr> </tbody> </table> <br> <p>创徏 CCD 目标表只要做q些可以了。那么,有了 CCD 表之后,如何使用它呢Q让我们这些g之前介绍的那些用法联pv来?/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>q种配置支持扇出到多个目标?/td> </tr> <tr> <td>?/td> <td>?/td> <td>q是标准的历史表。每个源行和目标的记录得表和事务可以被重徏。还可以Ҏq种版本?CCD 表创建新的用h贝?/td> </tr> <tr> <td>?/td> <td>?/td> <td>q种版本?CCD 表用于扇出场景的d表,在该场景中,q程已经存在用户数据的一个拷贝。由于缺源行,因此不能从这U类型的 CCD 表创建新的用h贝?/td> </tr> <tr> <td>?/td> <td>?/td> <td>q种 CCD 表用于作为只需要访问被更改的数据的应用E序的登台表?/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 ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=N10103><span id="wmqeeuq" 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>数据cd</th> </tr> <tr> <td>IBMSNAP_INTENTSEQ</td> <td>q是一个序P惟一地标识一ơ更攏V?/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>q是一个序P描述事务的提交顺序?/td> <td>CHAR(10) FOR BIT DATA</td> </tr> <tr> <td>IBMSNAP_LOGMARKER</td> <td>q是数据被提交的旉?/td> <td>TIMESTAMP</td> </tr> </tbody> </table> <br><br> <p>q些列附件在行的后面Q因此该 CCD 表可用于创徏其他拯Q更新其他拷贝,或者应用E序可以讉K事务历史。如果启用了数据库审计功能,那么 CCD 表中q可能提供以下几列:</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>数据cd</th> </tr> <tr> <td>IBMSNAP_AUTHID</td> <td>与事务相兌的授?ID。这一列同时可用于 DB2 for Linux®、UNIX® ?Windows® 以及 z/OS®。对?z/OSQ这是主授权 ID?/td> <td>CHAR(128)</td> </tr> <tr> <td>IBMSNAP_AUTHTKN</td> <td>与事务相兌的授权标志。这一列仅用于 DB2 z/OSQ它是相?ID。对?DB2 Linux、UNIX ?WindowsQ这一列的gؓ NULL?/td> <td>CHAR(12)</td> </tr> <tr> <td>IBMSNAP_PLANID</td> <td>与事务相兌的计划名U。这一列仅用于 DB2 z/OS。对?DB2 for Linux、UNIX ?WindowsQ这一列的gؓ NULL?/td> <td>CHAR(128)</td> </tr> <tr> <td>IBMSNAP_UOWID</td> <td>q个工作单元的日志记录中的工作单元标识符。这一列同时可用于 DB2 for Linux、UNIX ?Windows 以及 DB2 z/OS?/td> <td>CHAR(10)</td> </tr> </tbody> </table> <br><br> <p>如果手动创徏 CCD 目标表,则语法应该像下面q个例子一栗注意,<user data columns> 的数据类型应该与源表中相应的列的数据cd一致?/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, <user data columns> ); </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 ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=N101C6><span id="wmqeeuq" class=atitle>限制</span></a></p> <p>q运的是Q您只需清楚三个限制Q另外再注意一点:<br> <ol> <li>CCD 目标表只在单向架构中有效? <li>CCD 目标表不能是别名? <li>CCD 表中必须有惟一性约?—?可以通过主键或者源表或 CCD 表上的惟一索引实现?</li> </ol> <br>另外一个您可能失察的地Ҏ delete 的行为。如果您在用一个压~?CCD 表,那么在处?delete 操作Ӟ现有的行被更新Q?IBMQREP_OPERATION 列将被设?‘D’。如果这一行不存在Q那么该行将被忽略,q且被记录到异常表中。对于非压羃 CCD 表,所有事务都生成新的行。delete 会生成一个新行,其中仍然使用当前各列的|但是 IBMQREP_OPERATION 列被设ؓ 'D'? <p> </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 ><strong><font color=#996699>回页?/font></strong></a></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br><br> <p><a name=N101DF><span id="wmqeeuq" class=atitle>l束?/span></a></p> <p>关于q个话题p到这里了。希望本文提供的信息能帮助您利用扩展的架构,q将数据暴露l更多的用户?/p> <br><br> <p><a name=resources><span id="wmqeeuq" class=atitle>参考资?</span></a></p> <strong>学习</strong><br> <ul> <li>您可以参考本文在 developerWorks 全球|站上的 <a target=_blank><u><font color=#5c81a7>英文原文</font></u></a>?<br><br> <li><a ><u><font color=#996699>Q Replication Version 8.2 Information roadmap</font></u></a> (developerWorks)Q这里可以找到更多关?Q replcation 的参考资料,Q replcation ?WebSphere Information Integrator Replication Edition ?WebSphere Information Integrator Replication for z/OS 中提供的功能?<br><br> <li>“<a ><u><font color=#5c81a7>?Oracle ?Sybase ?Q 复制快速入?</font></u></a>”QdeveloperWorksQ?005 q?5 月)Q遵循逐步指南完成 WebSphere Information Integrator Replication Edition 中联邦功能的讄?<br><br> <li><a ><u><font color=#5c81a7>developerWorks WebSphere Information Integration 资源面</font></u></a>Q扩展您?WebSphere Information Integration 产品斚w的技能?<br><br> <li><a ><u><font color=#5c81a7>developerWorks 信息理专区</font></u></a>Q扩展您在所?IBM Information Management 产品斚w的技能?<br><br> <li>随时x <a ><u><font color=#5c81a7>developerWorks 技术事件和|络q播</font></u></a>?</li> </ul> </td> </tr> </tbody> </table> <img src ="http://www.aygfsteel.com/i369/aggbug/131319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/i369/" target="_blank">芦苇</a> 2007-07-19 17:31 <a href="http://www.aygfsteel.com/i369/articles/131319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何用代理键实现 DB2 UDB 主键http://www.aygfsteel.com/i369/articles/131318.html芦苇芦苇Thu, 19 Jul 2007 09:29:00 GMThttp://www.aygfsteel.com/i369/articles/131318.htmlhttp://www.aygfsteel.com/i369/comments/131318.htmlhttp://www.aygfsteel.com/i369/articles/131318.html#Feedback0http://www.aygfsteel.com/i369/comments/commentRss/131318.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/131318.html
developerWorks 中国  >  Information Management  >

如何用代理键实现 DB2 UDB 主键

考察生成惟一序列数字的几U选择

developerWorks
文档选项
此作为电子邮件发?src="http://www.ibm.com/i/v14/icons/em.gif"

此作为电子邮件发?/font>

未显C需?JavaScript 的文档选项



U别: 初

Jason Zhang (jasonz@ca.ibm.com), 软g开发h? IBM

2004 q?9 ?01 ?/p>

如何代理键Qsurrogate keyQ用?DB2 UDB 中的主键Q代理键是生成惟一序列L一U有效方法。从本文中可以了解三U实玎ͼ传统ҎQ用键理器,以及使用新的 DB2 UDB Ҏ?/blockquote>

?/span>

使用代理键解x案是Z发现一U生成惟一序列L有效Ҏ。本文描qC三种实现Q?

  • 使用传统Ҏ?
  • 使用键管理器?
  • 使用 DB2 UDB Ҏ?

代理键也?内键Qinternal keyQ?/em>。当创徏一个表Ӟ可以d一个额外的列作Z理键。这个列应该?NOT NULLQƈ且没有商业意义。可以将该代理列指定Z键列。例如可以有一个数字代理列。代理键的g某一个数字开始,例如 "1"Q以q个数字作ؓ该列在表中第一行的|之后的每一行中该列的值都?1 递增?

例如Q如果我们有?EMPLOYEEQ?/p>
CREATE TABLE EMPLOYEE (	FIRSTNAME		CHAR(64),
                        LASTNAME		CHAR(64),
                        SALARY 			DECIMAL(10, 2))
                        

那么可以d一个代理键?SERIALNUMBERQƈ其指定Z键列。这Pq个表的定义变为:

CREATE TABLE EMPLOYEE (	SERIALNUMBER	BIGINT NOT NULL,
                        FIRSTNAME	CHAR(64),
                        LASTNAME	CHAR(64),
                        SALARY 		DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        

那么Q怎样惟一的Dl每一行的 SERIALNUMBER 列呢Q首先需要ؓ代理键生成惟一的倹{下面我讨ZU可行的解决Ҏ?/p>



回页?/font>


使用传统Ҏ

解决Ҏ的思想

传统Ҏ是用简单的 SQL 或触发器生成惟一的倹{?/p>

CZ

以表 EMPLOYEE Z。您可以?INSERT 语句中实C理键生成函数Q?/p>
INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES ((SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1,
                        ‘John’, ‘Smith’, 999.99)
                        

SQL 语句 " (SELECT MAX(SERIALNUMBER) FROM EMPLOYEE)+1 " 找出最大的 SERIALNUMBER q将其加 1Q这h行就有一个惟一?SERIALNUMBER?

q样做存在的一个问题是Q当第一行插入表中时Q可能会得到如下错误Q?

SQL0407N  Assignment of a NULL value to a NOT NULL.
                        SQLSTATE=23502.
                        

得到上述错误的原因是Q当表ؓI时Q? SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 的返回ؓ NULL。因此,我们必须使用 COALESCE() 来处理这个问题:

INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES (COALESCE((SELECT MAX(SERIALNUMBER)
                        FROM EMPLOYEE), 0)+1, ‘John’, ‘Smith’, 999.99)
                        

另一U传l方法是使用触发器来生成代理键:

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
                        

优点及问?/font>

传统Ҏ易于理解Q而且Ҏ在所有系l上实现。但是,q种实现实际上会D事务处理pȝ中出现ƈ发问题。因实现只允怸ơ执行一?INSERT 操作?

因此Q在获得最大的 SERIALNUMBER 之前Q? SELECT MAX(SERIALNUMBER) FROM EMPLOYEE " 必须{待其他所有事务完成对?EMPLOYEE ?INSERT ?UPDATE 操作。例如,如果有两个事务正在对 EMPLOYEE 表进?INSERT 操作Q那么其中有一个事务会被另一个事务阻塞。显Ӟq种“逐次插入”的解x案不适合多用L事务处理pȝ?





回页?/font>


使用键管理器

解决Ҏ的思想

很多大型的应用程序用键理器方法维护所有表的代理键。键理器可以是一个助手类。每当需要向表插入一个行Ӟ便可以调用键理器生成新的键|然后获得的键值插入新行?/p>

CZ

首先Q需要创 KEYS 来记录每个表的当前代理键倹{键理器类用该表生成新键倹{?/p>
CREATE TABLE KEYS (	TABLENAME		CHAR(256),
                        COLNUMNAME		CHAR(256),
                        SURROGATEKEYVALUE	BIGINT,
                        INCREMENT		BIGINT,
                        PRIMARY KEY(TABLENAME, COLNUMNAME));
                        

W二Q将新表Q例如表 EMPLOYEEQ注册到?KEYS 中?/p>
INSERT INTO KEYS (TABLENAME, COLUMNNAME, SURROGATEKEYVALUE,
                        INCREMENT) VALUES (‘EMPLOYEE’, ‘SERIALNUMBER’, 0, 1);
                        

W三Q编?KeyManger cLl护每个已注册表的代理键。KeyManager 提供两个方法:

/**
                        *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);
                        

要查看更详细?KeyManger 的代码,请参考附录?

W四Q调?KeyManger 来获得主键|

…
                        KeyManager km = KeyManager.singleton();
                        Long surrogateKey = km.getSurrogateKey("EMPLOYEE", "SERIALNUMBER");
                        …
                        

优点和问?/font>

昄Q键理器是模块化设计的一个很好的例子。键理器封装了代理键生成函数。这U实C易于定制。您可以?KEYS 表中?SURROGATEKEYVALUE ?INCREMENT 指定不同的|以得C同的代理键。而且Q这U实现可以在大多数数据库pȝ上实施。但是,Zq行l护Q需要一个单独的表和~写代码。所以,q种Ҏ更适合于大型的跨数据库pȝ?





回页?/font>


使用 DB2 UDB Ҏ?/span>

DB2 UDB 提供了三U方法来生成惟一倹{您可以使用q些Ҏ来实C理键?/p>

  • DB2 UDB Version 6.1 中的 GENERATE_UNIQUE() SQL 函数?
  • DB2 UDB Version 7.2 ?CREATE TABLE 语句?IDENTITY 选项?
  • DB2 UDB Version 7.2 中的 SEQUENCE 对象?

GENERATE_UNIQUE()

解决Ҏ的思想

GENERATE_UNIQUE() 最初是?DB2 UDB Version 6.1 中提供的一?SQL 函数。该函数q回当前pȝ旉戟뀂我们可以用该函数Z理键列生成惟一倹{?/p>

CZ

CREATE TABLE EMPLOYEE (	SERIALNUMBER	CHAR(13) FOR BIT
                        DATA NOT NULL,
                        FIRSTNAME		CHAR(64),
                        LASTNAME		CHAR(64),
                        SALARY 			DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        

然后可以用下面的 SQL 语句插入一行:

INSERT INTO EMPLOYEE (SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(GENERATE_UNIQUE(), ‘John’, ‘Smith’, 999.99)
                        

优点和问?/strong>

q里需要清楚两件事情?/p>

首先Q当多个事务在同一时刻插入行时QGENERATE_UNIQUE() 可能会返回相同的旉戟뀂在q种情况下,GENERATE_UNIQUE() 不能为每个事务生成一个惟一的返回|因而这U方法不适合有大量事务的pȝ?/p>

W二Q一旦系l时钟需要向后调_那么 GENERATE_UNIQUE() 可能返回重复的倹{?

׃上述限制Q我决不会在生pȝ中?GENERATE_UNIQUE()。但是,当您需要在有限的时间内完成一个原型时Q这也许是一U选择?

CREATE TABLE 语句中的 IDENTITY 选项

解决Ҏ的思想

IDENTITY ?DB2 UDB Version 7.1 和后期版本提供的 CREATE TABLE 语句中的一个选项。在创徏表时Q可以将某个列指定ؓ IDENTITY 列。对于每?INSERT 语句QDB2 负责ؓ其中的这一列生成一个惟一的倹{?

CZ

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))
                        

然后可以用下面的语句插入一行:

INSERT INTO EMPLOYEE (FIRSTNAME, LASTNAME, SALARY) VALUES
                        ( ‘John’, ‘Smith’, 999.99)
                        

INSERT 语句不需要指?SERIALNUMBER 列的倹{DB2 UDB 根据列的定义自动生成惟一|?"GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1)"?/p>

优点和问?/strong>

IDENTITY 函数在大多数情况下是代理键函数的一个好的解x案。DB2 import ?export 实用E序也支?IDENTITY 选项?/p>

然而,在某U情况下Q这U解x案不大方ѝ在q行 INSERT 语句之后Q应用程序将永远都不知道攑օ了主键列中的是什么倹{如果应用程序必ȝl向子表插入一个行Q那么它׃得不对父表运行一?SELECT 语句Q以得到主键倹{不q,如果q一点对于您的系l不成问题的话,那么使用 IDENTITY 选项是一个好L?

SEQUENCE 对象

解决Ҏ的思想

SEQUENCE 对象是在 DB2 UDB Version 7.2 中引入的一个特性。用户可以在数据库中创徏一?SEQUENCE 对象Q就像创对象或视囑֯象一P然后?SEQUENCE 中请求倹{DB2 保证用户每次可以得到一个惟一的序列倹{?

CZ

您可以在数据库中创徏一?SEQUENCE 对象Q?/p>
CREATE SEQUENCE EMPSERIAL
                        AS BIGINT
                        START WITH 1
                        INCREMENT BY 1
                        

如果有一个如下所C的 EMPLOYEE 表:

CREATE TABLE EMPLOYEE (	SERIALNUMBER	BIGINT NOT NULL,
                        FIRSTNAME		CHAR(64),
                        LASTNAME		CHAR(64),
                        SALARY 		DECIMAL(10, 2),
                        PRIMARY KEY (SERIALNUMBER))
                        

那么可以用下面的语句插入一个行Q?

INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'John', 'Smith', 99.99)
                        

在这里?" NEXTVAL FOR EMPSERIAL " ?SEQUENCE 中获得惟一倹{?

您可以?" PREVVAL FOR EMPSERIAL " 获得当前q接会话中最q生成的序列倹{应用程序就可以知道攑օ主键列中的是什么|从而l向子表插入一个行。这里,“在当前连接会话中”q一点很重要Q这意味着 "PREVVAL" 只q回在相同连接会话中生成的倹{?

例如Q考虑q样的情况:有两个应用程序连接到数据库,q按照如下顺序运行下面的 SQL 语句?

Q假?SEQUENCE " EMPSERIAL " 的当前值是 3Q?

应用E序 1Q?
INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Martin', 'Wong', 1000.00)

?EMPSERIAL 生成?" NEXTVAL " ?4?

应用E序 2Q?
INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'Patrick', 'Chan', 99.99)
                        

?EMPSERIAL 生成?" NEXTVAL " ?5?

应用E序 1Q?
SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE
                        

" PREVVAL " 返?4Q而不?5?

而且Q?PREVVAL ?NEXTVAL 的g会受事务回滚的媄响?

例如Q假?SEQUENCE " EMPSERIAL " 的当前值是 30。某个应用程序开始了一个事务:

INSERT INTO EMPLOYEE ( SERIALNUMBER, FIRSTNAME, LASTNAME,
                        SALARY) VALUES(NEXTVAL FOR EMPSERIAL, 'William', 'Chen', 99.99)
                        

执行 ROLLBACK 操作?

然后Q如果运行:

SELECT PREVVAL FOR EMPSERIAL FROM EMPLOYEE
                        

?" PREVVAL " 返?31Q而不?30?

优点和问?/strong>

SEQUENCE 是最q?DB2 UDB 为生成惟一D实现的函数。它q有一个缓存函敎ͼ用于提高性能Q要了解详细信息Q请参阅 IBM DB2 UDB SQL ReferenceQ。该函数?IDENTITY 函数更灵z,因ؓ它是数据库中的一个独立对象。必要时候,可以通过q行 ALTER SEQUENCE 语句更改其设|?

如果pȝ只在 DB2 UDB 上运行,那么 SEQUENCE 也许是最好的解决ҎQ因为它易于使用Q而且不像键管理器那样需要额外的代码Qƈ且可以随需求的变化很轻易对其进行更攏V?/p>



回页?/font>


l束?/span>

本文描述了实CZ键的代理键的三种Ҏ。文中主要讨Z如何Z理键生成惟一的序列倹{?/p>

传统Ҏ适合于简单的、单用户Q非q发Q系l。对于实现对于大型系l和跨^台系l,键管理器是一个好选择。但是,如果目只在 DB2 UDB 上运行的话,可以考虑 DB2 UDB 提供的特性。IDENTITY ?SEQUENCE 函数提供了一U容易的、灵zȝ解决Ҏ?/p>

在创?IDENTITY 列和 SEQUENCE 对象Ӟ可以使用很多选择。请参阅 IBM DB2 UDB Administration Guide?IBM DB2 UDB SQL ReferenceQ以获得完整的细节?





回页?/font>


附录

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;
                        }
                        }
                        



参考资?




芦苇 2007-07-19 17:29 发表评论
]]>
利用 IBM Tivoli Directory Server V5.2 实现 WebSphere Application Server V6.0.x 的全局安全性ƈ保护 WAS 理控制?/title><link>http://www.aygfsteel.com/i369/articles/130750.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 17 Jul 2007 02:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/i369/articles/130750.html</guid><wfw:comment>http://www.aygfsteel.com/i369/comments/130750.html</wfw:comment><comments>http://www.aygfsteel.com/i369/articles/130750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/i369/comments/commentRss/130750.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/i369/services/trackbacks/130750.html</trackback:ping><description><![CDATA[     摘要: developerWorks 中国  >  WebSphere  > 利用 IBM Tivoli Directory Server V5.2 实现 WebSphere Application Server V6.0.x 的全局安全性ƈ保护 WAS 理控制? ...  <a href='http://www.aygfsteel.com/i369/articles/130750.html'>阅读全文</a><img src ="http://www.aygfsteel.com/i369/aggbug/130750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/i369/" target="_blank">芦苇</a> 2007-07-17 10:31 <a href="http://www.aygfsteel.com/i369/articles/130750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM Tivoli Directory Integrator 服务器的命o行选项http://www.aygfsteel.com/i369/articles/118329.html芦苇芦苇Fri, 18 May 2007 05:41:00 GMThttp://www.aygfsteel.com/i369/articles/118329.htmlhttp://www.aygfsteel.com/i369/comments/118329.htmlhttp://www.aygfsteel.com/i369/articles/118329.html#Feedback0http://www.aygfsteel.com/i369/comments/commentRss/118329.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/118329.html以下是用?IBM Tivoli Directory Integrator 服务器的命o行选项Q?tt class=xph>ibmdisrv [options]Q:

CZQ?/p>

ibmdisrv -c"C:\demos\rs.xml" -r"Access2LDAP" -l"c:\metamerge\mydemo.log"
?
  1. 在选项字母和g间没有空根{请使用引号来保留g可能出现的空格或逗号?
  2. Windows Shell 执行E序最多允总下列表中?9 个参数。而在其它q_上没有Q何限制?
-s <dir>
指定解决Ҏ所位于的工作目录。TDI 中以及您?#8220;配置”{中的所有相Ҏ件引用都相对于q个位置。这必须是第一个指定的参数?
-c <file...>
配置文g。如果不指定此选项Q将装入和启?Autostart 文g夹中的各(除非指定?-D 止装入和启动这些项Q。通配W也允许Q如 *.xml?
-n <encoding>
用来~写配置文g的编码。这必须?Java2 中有效的字符集标识;请参?IANA 字符集注册表Q?a >http://www.iana.org/assignments/character-setsQ以了解q些~码值的完整列表。请注意 Java2 仅支持这些值的子集?
-r <al...>
要启动的l装水U名U的列表。要启动l装水U?a ?bQ请使用命o -r a b。也支持其它语法Q?span class=bold>-ra,bQ?span class=bold>-ra -rb?
?
如果您?include 和名U空_则组装流水线可以?myNamespace:/AssemblyLines/alName Q假定名U空?myNamespace 和组装流水线名称 alNameQ?/div>
-t <eh...>
要启动的事g处理E序名称的列表。要启动事g处理E序 a ?bQ请使用命o -t a b。也支持其它语法Q?span class=bold>-ta,bQ?span class=bold>-ta -tb?
-T<name>
启用 JLOG 样式的跟t,q将q些跟踪记录?trace<name>.log 文gQ该文g位于 <Tivoli_Common_Dir>/TDI/logs/ 目录中。缺省是跟t记入内存(如果发生未处理的异常Q可通过 JFFDC ?traceback 例程跟t从内存中检索出来)?
-D
用于用 Autostart 文g夹中的事件处理程序和Q或目启动的标志?
-w
如果指定?-rQ或 -tQ,则此标志会 IBM Tivoli Directory Integrator {待每个l装水U的事g处理E序完成后再启动下一个。如果未指定此标志,?IBM Tivoli Directory Integrator 会ƈ行地启动所有由 -r 参数指定的组装流水线。当最后一个组装流水线和显式启动的事g处理E序完成Ӟ服务器停止?
?
当服务器中没有活动线E时Q该服务器停止。然而,我们发现对于 PerlQPerl d作为活动线E计数。?-w 强制 IBM Tivoli Directory Integrator 在最后一个组装流水线完成后停止?/div>
-e
指定此选项服务器以安全方式q行。用特定于该服务器的主密码Q它解密和加密所有的配置文g以及服务?API 注册表?
-v
昄版本信息q出。这仅记录在日志文g中?
-P <password>
密码Q如果配|文件加密的话)?
-p
在启动时转储 Java 属性。请注意Q您仍必L供一个配|文Ӟ?Java 属性{储之前将d该文件?
-m
启动理和监视器控制収ͼAMCQ服务器。同时启?MOBJ 接口。请参阅 IBM Tivoli Directory Integrator 6.0: Administrator Guide 中的“Administration and Monitor Console”获取更多有关 AMC 的信息?
-M
用 MOBJQ管理扩展)?AMCQ而不考虑 global.properties 中的讄?
-d
在此机器上启动一?#8220;守护E序”Q即配置实例。服务器为每个指定的配置启动一个线E,再加上一个额外线E。没有Q何线E将l止?
-Z
指示l装水U在查点表ؓI的情况下进行操作。所有在命o行上提供?AL 清I它们的查点表?
-q
接受一个参敎ͼmode。Mode=1 表示以记录方式运行,mode=2 表示以回放方式运行?
-l <file>
日志文gQ缺省控制台输出Q。执行的操作很少Q因为很有消息转至控制台。要为大部分记录更改日志文gQ请更改 log4j.properties?
-R
用q程 APIQ而不考虑 global.properties 中的讄?
-W
所有的“配置”在同一个线E中启动Q但它们不终止,而是永远{待?
-S
此选项仅内部用?#8220;配置~辑?#8221;?#8220;服务?#8221;之间的通信Q它用于在两者之间传递配|文件。请勿自行用此选项?
-?
打印用法消息Q简要显C所有选项?

?IBM Tivoli Directory Integrator l止Ӟ它会q回以下某个退Z码:

0
用户使用 -v 参数Q显CZ息ƈ退出)启动?IBM Tivoli Directory Integrator
1
  • 无法打开日志文gQ?l 参数Q?
  • 无法打开配置文g
  • q理请求停?/li>
2
在自动运行后退出。当您通过指定 -w 启动 IBM Tivoli Directory Integrator ӞIBM Tivoli Directory Integrator 会运行由 -r 参数执行的组装流水线Q然后退出?
?
?#8220;配置~辑?#8221;中运行的l装水U是以不同的方式启动的,它不会以状?2 退出?/div>
9
许可证已到期或无效(废弃不再使用Q?


芦苇 2007-05-18 13:41 发表评论
]]>
关于aix下xmanager、cde、ftp、telnet问题的小l?/title><link>http://www.aygfsteel.com/i369/articles/117611.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 07:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/i369/articles/117611.html</guid><wfw:comment>http://www.aygfsteel.com/i369/comments/117611.html</wfw:comment><comments>http://www.aygfsteel.com/i369/articles/117611.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/i369/comments/commentRss/117611.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/i369/services/trackbacks/117611.html</trackback:ping><description><![CDATA[感谢农哥{很多朋友的指导Q可能不同环境下有不同的解决ҎQ我只将我的Ҏ贴出来供大家参考:<br><br>      1.如果cde无法启动Q查看是否安装了cdeQ如没有系l盘W一张插q光驱,simt 中有个install software bundle Q选择CDE安装p了,我看到IBM|站和一些资料都是告诉你安装哪些filesetQ很ȝ的,此法安装很方ѝ?br>         如果装好了cdeQ有时却无法启动cdeQ就q行一?etc/rc.dt<br><br>      2.如果xmanager无法登陆Q请?etc/hosts文gQ将IP与主机名讄正确Q改完之后一定要重启pȝQ?br><br>      3.如果ping机丢包Qtelnet很慢Q丢包也能telnetQ只不过要等很久Q,h查你的ip 地址Q还有\由,正确讄后ping ׃会丢包了Q但telnetq会很慢Q这时就?etc/resolv.confQ如果存在就把它删掉.<br>      <br>      4.如果不能ftpQ将/etc/ftpusers清空或删掉,q不行?用农哥这招:rm /etc/resolv.confQ还搞不定?那我也没办法了?br><br>如果哪位q有补充Q请跟脓分nQ如果有什么漏z还h出,谢谢! <img src ="http://www.aygfsteel.com/i369/aggbug/117611.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/i369/" target="_blank">芦苇</a> 2007-05-15 15:08 <a href="http://www.aygfsteel.com/i369/articles/117611.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX CDE不能启动的故障一般性解x?/title><link>http://www.aygfsteel.com/i369/articles/117606.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/i369/articles/117606.html</guid><wfw:comment>http://www.aygfsteel.com/i369/comments/117606.html</wfw:comment><comments>http://www.aygfsteel.com/i369/articles/117606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/i369/comments/commentRss/117606.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/i369/services/trackbacks/117606.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class=NewsContent id=NewsContentLabel> <p>CDE不能启动的故障一般性解x?<br>Document #: 1811114I23000 </p> <p>Body: <br>CDE不能启动的故障一般性解x?/p> <p>环境:AIX ALL</p> <p>问题描述: <br>用户l常会遇到CDE桌面启动不了的情况,那么遇到q种情况应该如何解决呢?</p> <p>解答: <br>1、检查是否从囑Ş控制C能看到login囑Ş提示。如果可以看刎ͼ问题仅仅发生在输入用户名密码之后出现屏{等不能登陆的情况,那么?a>各个文gpȝ的空间有没有满的。有的话删除部分文g或者扩大文件系l。b>hostname ?etc/hosts文g中是否和正在使用的IP地址有对应关pR如果有错误Q请用hostname更改L名或者修?etc/hosts文g?<br>2、如果不能启动CDEQƈ且连login的图形提C都无法看到。那么尝试以下步骤:a>执行/usr/dt/bin/dtconfig -kill b>执行ps-ef|grep dt查看是否有dtloginq程Q如果有Q用kill -9 PID 杀死该q程 c>在图形主控台上执?/etc/rc.dt 命o启动CDE桌面Q到login提示W?<br>3、如果上q操作不能成功,或者根本没?usr/dt/bin/dtconfig ?etc/rc.dt文gQ那么请从光盘上安装所有以X11.*的文仉。安装的时候,h意选择 OVERWRITE same or newer versions? 为yes。(默认是noQ在安装完之后执行第二步Q不需要重启?nbsp; </p> <br><br><br>本文地址Q?a ><u><font color=#0000ff>http://www.newbooks.com.cn/info/35465.html</font></u></a> </div> <img src ="http://www.aygfsteel.com/i369/aggbug/117606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/i369/" target="_blank">芦苇</a> 2007-05-15 14:59 <a href="http://www.aygfsteel.com/i369/articles/117606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Xmanager{终端Y件无法连接AIX的解x?/title><link>http://www.aygfsteel.com/i369/articles/117607.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 15 May 2007 06:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/i369/articles/117607.html</guid><wfw:comment>http://www.aygfsteel.com/i369/comments/117607.html</wfw:comment><comments>http://www.aygfsteel.com/i369/articles/117607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/i369/comments/commentRss/117607.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/i369/services/trackbacks/117607.html</trackback:ping><description><![CDATA[<p><strong>昄错误Q?/strong><br><font color=#ff0000>XDMCP Connection failed.Try again?</font></p> <p><strong>解决ҎQ?/strong><br>AIX上无进行Q何配|,但是必须有XDMCP协议。服务程序在监听XDMCP端口。CDE的XDMCP服务器ؓ <br>dtloginQX Window本n的XDMCP服务器ؓxdmQ当然GNU也有一些其它的服务器。如果AIX上安了CDEQ则只要启动CDE卛_。如果没有安装CDEQ需要启动xdm?</p> <p>以下命o可以认XDMCP服务器已l启动: <br>netstat -an|grep 177 </p> <p>查输出,认状态ؓLISTEN。如果一切正常,可以用Xmanager通过d了?</p> <p>安装完Xmanager后,在Xbrowser中New一个XDMCPQ选择XDM queryQ在Host输入框输入主机名或IP <br>地址Q选ApplyQ然后DoneQ启动Xmanager׃昄囑Şd介面了?nbsp;</p> <img src ="http://www.aygfsteel.com/i369/aggbug/117607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/i369/" target="_blank">芦苇</a> 2007-05-15 14:59 <a href="http://www.aygfsteel.com/i369/articles/117607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX常用命o http://www.aygfsteel.com/i369/articles/117605.html芦苇芦苇Tue, 15 May 2007 06:55:00 GMThttp://www.aygfsteel.com/i369/articles/117605.htmlhttp://www.aygfsteel.com/i369/comments/117605.htmlhttp://www.aygfsteel.com/i369/articles/117605.html#Feedback0http://www.aygfsteel.com/i369/comments/commentRss/117605.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/117605.html


查看交换Z息:
lsps -a 昄交换区的分布信息
lsps -s 昄交换区的使用信息
slibclean 清除处理E序遗留的旧分页信息
smit mkps 建立交换区空间信?
swapon -a 启动所有的分页I间
/etc/swapspaces 存放分页I间表格信息
-------------------------------------------------
昄卷信息:
lsvg 昄L名称
lsvg -l rootvg 昄rootvgL详细信息

-------------------------------------------------
mountLҎQ?
varyonvg datavg 加蝲datavg?
mount /dev/data1 加蝲datavg下的一个data1?

裸设备类型:raw,jfs jfs可以转变成文件系l,而raw则不?
-------------------------------------------------

在裸讑֤上安装oraclepȝQ?
修改裸设备的权限Q如裸设备名为system01Q安装数据库用户为oracle
chown oracle:dba /dev/system01
chown oracle:dba /dev/rsystem01
在用文件时必须用rsystem01
-------------------------------------------------

smit快速\径名Uͼ(smitQ图形方式,smittyQ字W方?
dev 讑֤理
diag 诊断
jfs 定期档案理pȝ
lvm 逻辑卷册pȝ理员管?
nfs NFS理
sinstallp 软g安装及维?
spooler 列印队列理
system pȝ理
tcpip TCP/IP理
USER 使用者管?
clstartQclstopQ启动和停止cluster
lssrc -g cluserQ查看cluser的状?
-------------------------------------------------

查看已安装的软g信息Q?
ls -aF /usr/lpp (lpp:Licensed Program Products)
查看安装媒体内容Q?
installp -q -d /dev/cdrom -l
-------------------------------------------------

启动时自动加载文件系l信息:
需要加载的信息存放?etc/filesystems
mount -t nf 加蝲所有在/ect/filesystems中定义type=nfs的文件系l?
昄已加载的文gpȝ及状态: df -v,mount
-------------------------------------------------

查看错误日志信息Q?
errpt -a
-------------------------------------------------

有关TCP/IP的命?
|\卡:
smit chgenet,chgtok,chgfddi,opschange,mktty:adptr架构快速\?
smit mkinet,ppp:slip与ppp快速\?
ifconfig:config界面
位址Q?
/etc/hosts 静态主
/etc/resolv.conf 位址解析的名U服务器
/etc/named.boot 名称服务器架?
/etc/named.ca 根名U服务器快取
/etc/named.data 位址列表
/etc/named.rev 反{指标列表
nslookup 查询名称服务器资?
|络路由Q?
route 理路由
netstat -rn 列出定义的\?
routed 路由(daekmin rip)
gated 路由(daekmin rip、egp、hello)
/etc/gateways 已知|关
/etc/networks 已知|\
服务Q?
/etc/services
/etc/inetd.conf
TCP/IP组子系l?
/etc/rc.net
startsrc -g tcpip 启动全部的tcpip子系l?
startsrc -s inetd 启动主要internet
除错Q?
iptrace 启动包q踪
ipreport q踪l果格式化输?
netstat |络l计
ping 查是否可以到?
查看HACMPQ外部硬盘信?
lscfg -v
lsdev -Cc adapter
对等机器信息Q?
/etc/.rhosts
/etc/hosts.equiv
/etc/hosts
-------------------------------------------------

观察q程内存使用情况Q?
ps aux 观察参数%memQ内存用百分比 RSS:实际使用内存
vmstat free的单位ؓ块,~省gؓ4096bytst
-------------------------------------------------

创徏raw讑֤旉择的类?
raw_lv

自己ȝ的aix的命令,且都在小型机上通过Q?br>
登陆
cmd->telnet 10.122.149.1
修改密码
#passwd
x
#shutdown
#shutdown –F
重启计算?br>#shutdown –Fr
q入目录
#cd app(目录?
回退Q?br>#cd ..
查看讑֤状?br>#lsdev -Cc disk查看盘是否可用
#lsdev -Cc adapter查看适配器是否可?br>#lsdev -Cc tape 查看带是否可用
查看盘的基本属?br>#lsattr -El hdisk5
从root用户修改为oracle用户
#chown oracle:dba aa.txt(文g名称/盘名称)
修改disk5盘的读写权?br>#chmod 755 *hdisk5
删除盘
#rmdev –dl hdisk5
带备䆾
#cfgmgr –v 认带?br>#lsdev –Cc tape 看磁带机是否可用
开始备?br>#smitty mksysb
#选择可用带机回?esc+4)选择
镜像
#smitty vg
#选择 mirror a volume group
#选择 rootvg
#hdisk1需要一D|?br>#bosboot –ad hdisk1
#bootlist –m normal hdisk0 hdisk1 盘启动的顺?br>HACMP 启动和停?br>(1)、启?HACMP
使用以下步骤启动 HACMPQ?br>        ?root 用户 login AIX
        使用 smitty cl_admin q入 HACMP 理界面
        选择 Manage Cluster Services 菜单,?Enter ?br>选择 Start Cluster Services 菜单,?Enter ?br>        ?Enter 键启?HACMP
(2)、停?HACMP
使用以下步骤启动 HACMPQ?br>        ?root 用户 login AIX
        使用 smitty cl_admin q入 HACMP 理界面
        选择 Manage Cluster Services 菜单,?Enter ?br>        选择 Stop Cluster Services 菜单,?Enter ?br>        ?Enter 键停?HACMP
查看ip地址和子|掩码,端口?br>#ifconfig -a
#netstat -i
#netstat -in
#uptime q行天数
#ps –ep|grep ora 查看oraq程
#ps –ep|grep 查看所有的q程
#ps –ep|pg 按页昄q程
FTP命o
cmd?ftp 10.122.149.1
#bin二进制模式下传?br>#mput a.txt上传文g
#mget a.txt下蝲文g
#errpt 查看错误信息
#errpt >/tmp/errpt2007110.txt保存errpt为txt文g
#errclear 0 把errpt错误日志?
#kill -9 pid xq程
# cd oracle/app/crs/product/10.2/log/hdmis1/crsd
# ls
core.2006-12-20-21:55:28  core.2006-12-20-23:21:45  core.2006-12-21-01:16:46  crsd.l01
core.2006-12-20-22:12:57  core.2006-12-20-23:25:46  core.2006-12-21-01:52:35  crsd.log
core.2006-12-20-22:50:42  core.2006-12-20-23:30:20  core.2006-12-21-15:33:27
core.2006-12-20-23:17:50  core.2006-12-21-00:19:30  core.2007-01-08-15:39:35


 

AIX?/span>IBM公司开发的业界领先的优U商务Unix操作pȝQ在可靠性、可用性、开放性、扩展性、高性能、安全性等斚w都非常突出,其是在Internet的关键应用领域以及系l和g理能力斚wQ其性能表现更ؓQ受C业界的普遍认可和q泛使用。以下是W者几q来使用AIXpȝ的一点心得,兹供使用该系l的其他读者参考?/span>

 

1Q如何禁止终端上的中断键Q?/span>CTRL+CQ?

在很多应用系l中Q系l管理员希望普通用户只q行自己的应用程序,不能q入pȝ?/span>shell提示W下Q但~省情况下当用户在终端上?/span>CTRL+C键时׃退到系l提C符下。由于用L端一般没有固定的端口PZ止使用中断键,可采取下面办法:

Q?/span>1Q如果?/span>ksh, 可在$HOME/.profile中第一行加入如下内容:

trap "echo 'Abnormal operation'; exit" 123915

(2)如果使用csh(ksh亦可)Q可用如下命令:

%stty intr ^!

如果恢复正常情况Q键入下列命令:

% stty intr ^c

 

2Q如何在shell中不回显Q?/span>echoQ字W?

在实际应用中Q一般当我们在键盘上键入口o时不希望其昄在屏q上Qؓ此可采用下面的两U办法:

·使用stty 命o

stty -echo # do not display password

echo "Enter password: \c"

read PASSWD #get the password

stty echo # restore standard configuration

·使用echo命o

讄保密属性:echo "\033[8m"

取消保密属性:echo "\033[m"

 

3Q如何在某个目录及其所属子目录的所有文件中查找字符Ԍ

在程序维护过E中Q有旉要在某个目录及其所属子目录的所有文件中查找某一个字W串Qؓ此可用下面两U方法(假设?/span>*.cp文g中查扑֭W串"abc"Q结果放在文?/span>out中)Q?/span>

Q?/span>1Q?/span>cat /dev/null > out

find ./ -name "*.cp" -exec grep "abc"{} >> out

Q?/span>2Q?/span>find ./ -name "*.cp" | xargs grep "abc" > out

推荐使用W二U方法,因其pȝ开销、速度快?/span>

 

4Q如何对/etc/inittab文g中的一行进行注释?

我们都知道在shell中?/span>"#"作ؓ注释W号Q但?/span>/etc/inittab中注释一行的Ҏ是在W一个字W前插入字符"Q?/span>"?/span>

 

5Q如何{?/span>DOS?/span>AIX两种格式的文本文Ӟ

如欲转换DOS?/span>AIX两种格式的文本文Ӟ有两U方法:

Q?/span>1Q用ftp命oQ设|?/span>ASCII传输cdQ在一台运?/span>AIX的机器和另外一台运?/span>Windows的机器之间互怼送,q里不再赘述?/span>

Q?/span>2Q?/span>aix2dos?/span>dos2aix命o

如将DOS格式的文本文件{换ؓAIX格式Q可用命?/span>AQ?/span>dos2aix inputfile outfileQ反之可用命令:aix2dos inputfile outfileQ关?/span>dos2aix?/span>aix2dos命o的详l用法可参阅"dos2aix -h "?/span>"aix2dos -h "。注意要使用q两个命令,必须首先安装文g?/span>bos.pci?/span>

 

6Q如何解x一PV上的VGDA?/span>ODM库不一致的问题Q?/span>

在系l维护过E中Q因为操作错误或其他Ҏ原因Q有可能使某一PV上的LVCB?/span>VGDA与其对应?/span>ODM库不一_DODM库紊乱,?/span>PV的有x作无法进行,q时可采用如下两?/span>AIX命o加以解决Q?/span>

redefinevg -d hdisk_name vg_name

该命令以指定PV上的LVM信息重新定义l定VG?/span>ODM库?/span>

或:synclvodm -P -v vgname

该命令同步或重徏l定VG?/span>ODM库和LVM信息?/span>

 

7Q如何设|用L文g大小限制Q?/span>

?/span>AIXpȝ中,用户使用pȝ资源是有一定限制的。如用户~省可创建或扩展的最大文件ؓ1GQ参?/span>/etc/security/limits: fsize = 2097151, fsize_hard=fsize 512-bytes blocksQ?/span>

如欲修改Q可使用smit:

# smit chuser 选择用户Q修改下面两:

Soft FILE size [4194302]

# (2G,可根据需要设?/span>)

Hard FILE size [4194302]

# (2G, 可根据需要设?/span>)

用该用户w䆾dQ?/span>"ulimit -f "?/span>"ulimit -Hf"可分别显C其fsize?/span>fsize_hard的大?/span>

 

8、如何按文g大小排序列出一个文件系l下的文Ӟ

当监控某一文gpȝ的空间用情冉|Q如果该文gpȝ剩余I间较少或已使用I间增长较快Q则有必要排序列文gpȝ中所有大于某一l定字节数的文gQ以便进一步维护管理。ؓ此,可用如下命oQ?/span>

# find [filesystem_name] -xdev -size +[512-bytes bloks] -ls | sort -r -n -k7



芦苇 2007-05-15 14:55 发表评论
]]>
IBM MQSeries使用指南http://www.aygfsteel.com/i369/articles/114115.html芦苇芦苇Fri, 27 Apr 2007 08:14:00 GMThttp://www.aygfsteel.com/i369/articles/114115.htmlhttp://www.aygfsteel.com/i369/comments/114115.htmlhttp://www.aygfsteel.com/i369/articles/114115.html#Feedback0http://www.aygfsteel.com/i369/comments/commentRss/114115.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/114115.html阅读全文

芦苇 2007-04-27 16:14 发表评论
]]>
IBM MQ常用命ohttp://www.aygfsteel.com/i369/articles/114114.html芦苇芦苇Fri, 27 Apr 2007 08:12:00 GMThttp://www.aygfsteel.com/i369/articles/114114.htmlhttp://www.aygfsteel.com/i369/comments/114114.htmlhttp://www.aygfsteel.com/i369/articles/114114.html#Feedback0http://www.aygfsteel.com/i369/comments/commentRss/114114.htmlhttp://www.aygfsteel.com/i369/services/trackbacks/114114.html创徏队列理?br>crtmqm –q QMgrName
-q是指创徏~省的队列管理器
删除队列理?br>dltmqm QmgrName
启动队列理?br>strmqm QmgrName
如果是启动默认的队列理器,可以不带其名?br>停止队列理?br>endmqm QmgrName 受控停止
endmqm –i QmgrName 立即停止
endmqm –p QmgrName 强制停止
昄队列理?br>dspmq –m QmgrName
q行MQSeries命o
runmqsc QmgrName
如果是默认队列管理器Q可以不带其名字

往队列中放消息
amqsput QName QmgrName
如果队列是默认队列管理器中的队列Q可以不带其队列理器的名字
从队列中取出消息
amqsget QName QmgrName
如果队列是默认队列管理器中的队列Q可以不带其队列理器的名字
启动通道
runmqchl –c ChlName –m QmgrName

启动侦听
runmqlsr –t TYPE –p PORT –m QmgrName

停止侦听
endmqlsr -m QmgrName

MQSeries命o
定义M队列
DEFINE QLOCALQQNAMEQ?DEFPSISTQYESQ?REPLACE
讑֮队列理器的M队列
ALTER QMGR DEADQQQNAMEQ?br>定义本地队列
DEFINE QLQQNAMEQ?REPLACE
定义别名队列
DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)
q程队列定义
DEFINE QREMOTEQQRNAMEQ?+
RNAMEQAAAQ?RQMNAMEQQMGRNAMEQ?+
XMITQQQTNAMEQ?br>定义模型队列
DEFINE QMODELQQNAMEQ?DEFTYPEQTEMPDYNQ?br>定义本地传输队列
DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
INITQQSYSTEM.CHANNEL.INITQQ?
PROCESS(PROCESSNAME) REPLACE

创徏q程定义
DEFINE PROCESSQPRONAMEQ?+
DESCRQ?#8216;STRING’Q?
APPLTYPEQWINDOWSNTQ?
APPLICIDQ?#8217; runmqchl -c SDR_TEST -m QM_ TEST’Q?br>其中APPLTYPE的值可以是QCICS、UNIX、WINDOWS、WINDOWSNT{?br>
创徏发送方通道
DEFINE CHANNELQSDRNAMEQ?CHLTYPEQSDRQ?
CONNAMEQ?#8216;100.100.100.215(1418)’Q?XMITQQQTNAMEQ?REPLACE
其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR?br>
创徏接收斚w道
DEFINE CHANNELQSDR_ TESTQ?CHLTYPEQRCVRQ?REPLACE

创徏服务器连接通道
DEFINE CHANNELQSVRCONNNAMEQ?CHLTYPEQSVRCONNQ?REPLACE

昄队列的所有属?br>DISPLAY QUEUEQQNAMEQ?[ALL]

昄队列的所选属?br>DISPLAY QUEUEQQNAMEQ?DESCR GET PUT
DISPLAY QUEUEQQNAMEQMAXDEPTH CURDEPTH

昄队列理器的所有属?br>DISPLAY QMGR [ALL]

昄q程定义
DISPLAY PROCESSQPRONAMEQ?br>
更改属?br>ALTER QMGR DESCRQ?#8216;NEW DESCRIPTION’Q?br>ALTER QLOCALQQNAMEQ?PUTQDISABLEDQ?br>ALTER QALIASQQNAMEQ?TARGQQTARGQNAMEQ?br>
删除队列
DELETE QLOCALQQNAMEQ?br>DELETE QREMOTEQQRNAMEQ?br>
清除队列中的所有消?br>CLEAR QLOCALQQNAMEQ?br>
常用补充命o
昄队列理?dspmq
昄文g?dspmqfls

启动本地队列理?strmqm
l束本地队列理?endmqm
启动通道启动q程 runmqchi/runmqchl


芦苇 2007-04-27 16:12 发表评论
]]>
վ֩ģ壺 | | ޻| | Դ| ͡| | | | ұ| ɫ| | | ѭ| | | ̨| | | Ѯ| ʻ| | | | Զ| | | ȳ| ǰ| | ƽ| | ʯɽ| | | ³| ϸ| ˳| »| Ű| ԰|