JohnPhan 发表于 2007-3-23 12:21:29

[转帖]修复identity 类型字段数据的跳跃

<p>修复identity 类型字段数据的跳跃<br/><font color="#ff0000"><strong>[转贴,内容未经过检验]</strong></font><br/>内容提要 </p><p>1、引言 <br/>2、dbcc object_atts&nbsp; <br/>3、下载'sp_identity' 存储过程 <br/>4、使用sp_identity显示使用identity 类型字段的表 <br/>&nbsp;<br/>5&nbsp; 使用sp_identity显示当前表的 identity 数字 <br/>6、使用sp_identity 修改表的 identity数字 </p><p>1引言 <br/>在sybase 中,有一个使用未公开的dbcc 命令 ,即 dbcc object_atts 快速修复identity 跳跃的方法,因为 dbcc&nbsp; </p><p>object_atts 比较难于使用,而存储过程 sp_identity 更容易完成你的问题 <br/>警告:本文的方法没有出现在sybase 发布的文档中,并且没有被 sybase 支持,使用与否取决定你自己,如果出现问题,不能从 <br/>sybase 技术支持那里得到帮助 </p><p></p><p>2、dbcc object_atts <br/>dbcc object_atts 命令提供了 一个访问 OAM 页的后门,在 OMA 中,保存了表的 identity 计数器。 <br/>不幸的是,这个命令在文档中几乎没有任何说明,并且很难使用,其语法如下: <br/>&nbsp; dbcc object_atts (table_name, 0, subcommand, [ new_value ] ) <br/>第一个参数 :表名,第二个参数 0, <br/>第三个参数:&nbsp;&nbsp; get&nbsp; ---显示 保存在 OMA 中的 identity 值 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或put&nbsp; ---设置 OMA 中的 identity 值,设置的具体数据为 第四个参数数据 <br/>第四个参数 :新设置的数 </p><p>主要的问题是 dbcc object_atts 显示的数据为 16字节的 16进制字符,你必须自己解释为10进制,并且,如何解释依赖于&nbsp; </p><p>identity 列的长度,同样,设置它也是。在实际环境中,很少作为首选。 <br/>幸运的是,有一个存储过程 sp_identity 能够处理编码与解码, 并且给出所有含 identity 列的表的情况 </p><p>下载 'sp_identity' <br/>sp_identity 只支持 11。0 以后版本,下载文件中包含两个版本,一个用于 ASE 11.9/11.5/11.0 的叫&nbsp;&nbsp; </p><p>,sp_identity.119.sql,另外一个用于ASE 12.0及以后版本(sp_identity.120.sql) </p><p>4、使用sp_identity显示使用identity 类型字段的表 <br/>sp_identity 有几个不同的功能,不带任何参数运行,只显示当前数据库中 包含 identity 列的表, <br/>以及最大可能的 identity 跳跃 </p><p>1&gt; sp_identity <br/>2&gt; go <br/>Tables with an identity column in database '': </p><p>Owner.Table.Column datatype&nbsp;&nbsp;&nbsp;&nbsp; Maximum Identity Gap <br/>------------------------------- ------------------------------- <br/>dbo.invoices.inv_nr numeric(18) 500000000000000 (burn) <br/>dbo.small_gap_tab.a numeric(30) 10 (identity_gap) <br/>dbo.my_table.n numeric(6)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 500 (burn) </p><p><br/>(burn) 表示 identity列的 一次取数由系统参数"identity burning set factor" 决定,而 <br/>(identity_gap) 表示 该表有自定义的identity_gap 属性 </p><p><br/>5&nbsp; 使用sp_identity显示当前表的 identity 数字 <br/>确定当前特定表的&nbsp; OAM 页的identity 值,必须按照以下三步过程: <br/>&nbsp; 首先 打开跟踪标志 3604 (运行 dbcc traceon(3604) ) <br/>&nbsp; 运行 指定特定表名运行 sp_identity&nbsp; </p><p>&nbsp; 1&gt; sp_identity invoices <br/>&nbsp; 2&gt; go <br/>&nbsp; Table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = invoices (id=1804533462) <br/>&nbsp; Identity column&nbsp;&nbsp; = a numeric(18) <br/>&nbsp; Max. Identity Gap = 500000000000000 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("identity burning set factor" = 5000 = 0.05%) </p><p>&nbsp; Reading identity value from OAM page...&nbsp; <br/>&nbsp; object_atts:get:return value=1 <br/>&nbsp; 0207E20C: 0001c6bf 52634001 00000000 00000000 ....Rc@......... <br/>&nbsp; 0207E21C: . <br/>&nbsp; DBCC execution completed. If DBCC printed error messages,&nbsp; <br/>&nbsp; contact a user with System Administrator (SA) role. <br/>&nbsp;&nbsp; <br/>&nbsp; 这个 16字节的 16进制字符串是 OAM 中保存的 identity 值 (0001c6bf 52634001 00000000 00000000) </p><p>&nbsp; 再次运行 sp_identity ,并且 指定这个字符串参数 </p><p>&nbsp; 1&gt; sp_identity invoices, "0001c6bf 52634001 00000000 0000000" <br/>&nbsp; 2&gt; go <br/>&nbsp; Table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = invoices (id=1804533462) <br/>&nbsp; Identity column&nbsp;&nbsp; = a numeric(18) <br/>&nbsp; Max. Identity Gap = 500000000000000 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("identity burning set factor" = 5000 = 0.05%) </p><p>&nbsp; Decoded identity value on OAM page = 500000000000001 <br/>&nbsp; (hex=0001c6bf52634001) </p><p>&nbsp; 现在,我们得到并解码了 OAM 中的 identity 值,但它意味着什么呢? <br/>&nbsp; 首先,如果你用 "with nowait" 停止服务器,这个 identity 列将跳跃多少。而不是表中数据的下一个。 <br/>&nbsp; 而是保存在 OAM 中的数据加上 identity 种子设顶数(在 ASE 12.0, 为identity_gap 选项) <br/>&nbsp; 另外,当你运行 ASE 12.0, 可以通过运行 dbcc listoam看到这个数据&nbsp;&nbsp;&nbsp; </p><p>6、使用sp_identity 修改表的 identity数字 <br/>使用 sp_identity , OAM 中identity 的 数字可以被设置为任意数. 这个需要如下步骤: <br/>1、确认你要设置的数据(查看表中identity 的数据应该到多少,比如 10033 ) <br/>2、正常停止服务器 <br/>3&nbsp; 重新启动服务器,以单用户模式,或者不让用户访问 <br/>4、 运行 sp_identity table_name, null, new_value ;&nbsp; <br/>&nbsp; 1&gt; sp_identity invoices, null, 10032 <br/>&nbsp; 2&gt; go <br/>&nbsp; Table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = invoices (id=1804533462) <br/>&nbsp; Identity column&nbsp;&nbsp; = a numeric(18) <br/>&nbsp; Max. Identity Gap = 500000000000000 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("identity burning set factor" = 5000 = 0.05%) </p><p>&nbsp; object_atts:put:return value=1 <br/>&nbsp; DBCC execution completed. If DBCC printed error messages,&nbsp; <br/>&nbsp; contact a user with System Administrator (SA) role. </p><p>&nbsp; Identity value on OAM page has been set to 10032 <br/>&nbsp; (hex=0x00000000000027300000000000000000) <br/>&nbsp; You should now do a 'shutdown with nowait' immediately. <br/>&nbsp; After restarting the server, the value assigned to the&nbsp; <br/>&nbsp; next row inserted into 'invoices' will be 10033. </p><p>5&nbsp; 然后立即运行 'shutdown with nowait' ,这样 表的下一个&nbsp; identity 数字是 10033&nbsp; <br/>6&nbsp; 重新正常启动sybase 服务&nbsp; </p><p><br/>说明:如果你应用了 identity 数据类型,并且要求identity 列保持连续,并且数据量很大,那么,用这个方法需要的时间可能比较短 <br/>否则不推荐使用。</p><p></p><p>下面是SP_IDENTITY.120.SQL,用于&nbsp; 12.0 以后版本 <br/></p><div id="constr"><font color="#ff0000">←帖子内容长度不能大于16240 待续</font></div><div id="constr"><font color="#ff0000"></font></div>
页: [1]
查看完整版本: [转帖]修复identity 类型字段数据的跳跃

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com