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


    场景

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

    实现目的

     
    为了保证并发性,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 ;

    alarm   作者:NewSea     出处:http://newsea.cnblogs.com/    QQ,MSN:iamnewsea@hotmail.com

      如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。
  • 相关阅读:
    C++程序设计实验-3
    函数
    C++简单程序设计
    C++程序设计实验-2
    C++程序设计实验-1
    项目总结
    团队测试计划
    第二阶段团队绩效评分
    第二阶段scrum-10
    第二阶段scrum-9
  • 原文地址:https://www.cnblogs.com/newsea/p/2664729.html
Copyright © 2020-2023  润新知