数据库主键按业务规则生成的解决方案。

场景

对现在业务系统进行升级改造 ,数据库修改幅度很少。 表主键是按一定业务编码生成的。没有其它的唯一键。

实现目的

 
为了保证并发性,ID的使用触发器生成。实现的效果似自增键。
sql端使用示例:Id 为触发器生成Id
    insert into Tab ( val1,val2) values ( 1,2 ) ;
--取最后插入的值 
    select dbo.GetTriggerValue('Tab');

程序端配置

(私有架构实现方法)
app.config
    <Entity Name="Tab" , AutoIncreKey="Id" />

把它看成是自增键。使用如下:

var model = new Model() ;
model.val1 = 1 ;
model.val2 = 2 ;
dbr.Tab.insert( model ) .Execute() ;
//直接取出 自增键:
    model.Id

触发器模板

注意 : 触发器会替换传进来的值。

TRIGGER [dbo].[TRG_TF_Report_Receipt_GetMaxRepID]
   ON  [dbo].[TF_Report_Receipt] 
   INSTEAD OF INSERT
AS 
BEGIN
-- 取得影响行数, 即本次插入了多少行
DECLARE @rc int;
SELECT @rc = COUNT(*) FROM  inserted;


DECLARE @RepID        bigint;
DECLARE @CommID        bigint;
IF @rc = 1
BEGIN
    SELECT @CommID=CommID FROM inserted;
    
    SELECT @RepID = isnull(max(RepID)+1,(@CommID * CAST(1000000000000 AS bigint) +1) )
        FROM TF_Report_Receipt
        where CommID = @CommID
        
    INSERT INTO [TF_Report_Receipt]
           ([RepID]
           ,[CommID]
           ,[CustID]
           ,[RoomID]
           ,[PrintDate]
           ,[BillsSign]
           ,[PrintTimes]
           ,[UserCode]
           ,[IsEmpty]
           ,[Rowdata]
           ,[CommandData])
     SELECT
           @RepID
           ,CommID
           ,CustID
           ,RoomID
           ,PrintDate
           ,BillsSign
           ,PrintTimes
           ,UserCode
           ,IsEmpty
           ,Rowdata
           ,CommandData
        FROM inserted 
          
         --SELECT @RepID AS [RepID]


    --新的返回方法
    exec TriggeredValue   'TF_Report_Receipt ', @RepID  
END        
END

系统的存储过程

triggeredValue 如下:
create  PROCEDURE [dbo].[TriggeredValue] @tab varchar(250) , @val varchar(250) 
AS
BEGIN
    declare @sql nvarchar(400) ;
    set @sql = N'select @a ';
    exec sp_executesql @sql , N'@a varchar(250)', @val ;
    
    if  exists ( select 1 from PowerTable where  [Table]= @tab )    begin  
        update powerTable set LastId = @val where    [Table] = @tab ;
     end else begin
        insert into PowerTable (   [Table]  ,LastId) values ( @tab , @val ) ;
     end
END

系统函数

取最后一次插入的值 函数如下:
create function GetTriggerValue(@tab varchar(250) )
returns varchar(250) as 
begin
    declare @ret varchar(250) ;
    select top 1 @ret = lastId from PowerTable where   [Table]  = @tab ;
    return @ret ;
end ;

posted @ 2012-08-31 00:58  NewSea  阅读(728)  评论(0编辑  收藏  举报