场景
对现在业务系统进行升级改造 ,数据库修改幅度很少。 表主键是按一定业务编码生成的。没有其它的唯一键。
实现目的
为了保证并发性,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 ;