zoukankan      html  css  js  c++  java
  • 数据库主键按业务规则生成的解决方案。

    场景

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

    实现目的

     
    为了保证并发性,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原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。
  • 相关阅读:
    android如何与asp.net服务端共享session
    WCF 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的
    PHP 实现单一入口 apache配置
    action func用法记记
    NETCore Bootstrap Admin 通用后台管理权限 [1]: 前后台分离系统简介
    开源 一套 Blazor Server 端精致套件
    NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块
    NETCore Bootstrap Admin 通用后台管理权限 [2]: Blazor 版本介绍
    C#服务器全面讲解与制作
    批量生成二维码
  • 原文地址:https://www.cnblogs.com/newsea/p/2664729.html
Copyright © 2011-2022 走看看