转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> SyBase >> 正文
Dealing with identity gaps2         ★★★★

Dealing with identity gaps2

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1457 更新时间:2009/4/22 22:54:45

 存储过程sp_fix_idgap.sql

/*
* This script contains everything you need to run a demo of how
* to use a two-table database design technique that allows
* identity gaps to be fixed quickly using a stored procedure.
* This script set up the following objects:
*
*    - a table 'invoices', holding application data
*    - a table 'invoices_keytable', for generating invoice numbers
*    - a procedure 'sp_fix_idgap_invoices' to repair identity gaps
*      in the 'invoices' table
*    - a procedure 'sp_insert_invoice' to simulate the application
*      inserting invoices
*
/
if not exists(select * from master.dbo.sysdatabases
             where name = "my_db")
begin
print "***************************************************"
print "*** You should edit this script first !         ***"
print "*** Change 'my_db' to the name of your database ***"
print "*** in which you want to run this script.       ***"
print "***************************************************"
end
go

use my_db
go

/*
* create the application table holding invoice data
*/
if object_id("invoices") !=  NULL
begin
   drop table invoices
end
go

create table invoices
      (invoice_nr   numeric(10,0),
       customer_nr  int,
       amount       money)
go
create unique index ix1 on invoices(invoice_nr)
go
grant all on invoices to public
go

/*
* Create a separate procedure for creating the keytable.
* This is required because it's not allowed to drop
* and recreate an object with the same name in one procedure
*/
if object_id("invoices_keytable") !=  NULL
begin
   drop table invoices_keytable
end
go

if object_id("sp_create_invoices_keytable") !=  NULL
begin
   drop procedure sp_create_invoices_keytable
end
go

create procedure sp_create_invoices_keytable
/* Copyright (c) 1998 Rob Verschoor/Sypron B.V. */
as
begin
  create table invoices_keytable
         (dummy_key numeric(10,0) identity)

  /*
   * Partitioning only works in system 11.0 and later
   * The number of partitions can be increased if there
   * will be many concurrent inserts.
   */
  alter table invoices_keytable partition 10
end
go
grant execute on sp_create_invoices_keytable to public
go

/*
* create the keytable
*/
exec sp_create_invoices_keytable
go

/*
* create a procedure to simulate application activity:
* first generate a new invoice number, then insert a new invoice
*/
if object_id("sp_insert_invoice") !=  NULL
begin
   drop procedure sp_insert_invoice
end
go

create procedure sp_insert_invoice
/* Copyright (c) 1998 Rob Verschoor/Sypron B.V. */
 @p_customer_nr int,
 @p_amount money
as
begin
  insert invoices_keytable values ()
  insert invoices values (@@identity, @p_customer_nr, @p_amount)
end
go
grant execute on sp_insert_invoice to public
go

/*
* Create the procedure to fix an identity gap.
* It takes one parameter, and can be called in two ways:
*
*    1. If "-1" is specified as a parameter, the keytable
*       will be dropped and recreated according to the highest
*       existing invoice number. The best use of this form
*       is to always run this procedure directly after server
*       startup, so that a possible identity gap is be corrected
*       before new invoices are inserted which could cause problems.
*
*    2. If another value is specified, it must be invoice number
*       generated just before the identity gap occurred. All invoices
*       having a higher invoice numbers than this will be corrected
*       downwards to create a consecutive range. The keytable will
*       be recreated and adjusted accordingly.
*       Example: suppose the following invoice numbers exist:
*                    (...)
*                   10028
*                   10029
*                   10030
*                   10031  <--\
*                 5000002  <--- identity gap here
*                 5000003
*
*       Now run "exec sp_fix_idgap_invoices 10031", and the last two
*       invoices will be corrected. Also, the next invoice will 
*       receive number 10034.
*/
if object_id("sp_fix_idgap_invoices") !=  NULL
begin
   drop procedure sp_fix_idgap_invoices
end
go

create procedure sp_fix_idgap_invoices
/* Copyright (c) 1998 Rob Verschoor/Sypron B.V. */
  @p_gap_low numeric(10,0)
as
begin
declare @gap_low  numeric(10,0)
declare @gap_low_plus_1  numeric(10,0)
declare @gap_high numeric(10,0)
declare @gap_size numeric(10,0)
declare @gap_max  numeric(10,0)
declare @set_new_idval  numeric(10,0)
declare @rows  int
declare @error  int

  if (@p_gap_low != -1) and (@p_gap_low < 1)
  begin
     print "Invalid invoice number specified."
     print "You must specify the last correct invoice number before the identity gap."
     return (-1)
  end

  /*
   * First check identity_insert is not active for any
   * other table: there can be only one at a time
   * if another table is already in this mode, the
   * procedure will be aborted here and user must switch off
   * identity_insert on that other table before continuing.
   */
  set identity_insert invoices_keytable on 
  set identity_insert invoices_keytable off
 
  if @p_gap_low > 0
  begin
      /*
       * check the row at lower end of gap exists
       */
     select @gap_low = invoice_nr
     from invoices 
     where invoice_nr = @p_gap_low     
 
     select @error = @@error, @rows = @@rowcount     

     if @error != 0
     begin
        print "Error occurred"
        return (-1)
     end
 
     if @rows = 0
     begin
        print "Could not find invoice number specified."
        print "You must specify the last correct invoice number before the identity gap."
        return (-1)
     end
  
     select @gap_low_plus_1 = @gap_low + 1
 
     /*
      * determine the size of the identity gap
      */
     select @gap_high = min(invoice_nr)
     from invoices
     where invoice_nr > @gap_low
 
     if @@rowcount = 0 or @@error != 0
     begin
        print "Row at upper end not found or error occurred"
        return (-1)
     end
 
     /*
      * calculate size of gap; must be > 99 to be
      * considered a real identity gap(this is
      * an arbitrary limit). Small 'gaplets' of
      * non-existing numbers can always exists due to
      * rolled-back transactions
      */
     select @gap_size = @gap_high - @gap_low
    
     if @gap_size < 100
     begin
       

[1] [2]  下一页


[办公软件]excel中的VBA中的With语句的使用介绍及实例  [系统软件]OLE with the internet explorer
[Delphi程序]override deal with window closing in database …  [Delphi程序]Building ActiveX Controls with Delphi 3
[VB.NET程序]Socket Programming with VB  [VB.NET程序]Managing Windows with WMI
[Web开发]ASP.NET with C#使用md5,sha1加密初探(10月21日首…  [Web开发]XML with asp.net(1)
[Web开发]Send Email and Attachments with ASP.Net...  [Web开发]Chapter 7. Working with ASP.NET and VB .NET
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台