项目背景:
一个运行的项目进行维护,遇到了这样一个问题。客户安装了一个网闸,对数据库的表有一个要求就是:不能有自动增长的字段。项目中有一些表是自动增长的,所有必需把它改成非自动增长的。
解决方案:
思路:通过触发器 对有自动增长的表进行insert拦截,然后做取值最大值 +1 做为主键在插入到库里。
过程中:
原来的记录要回滚 要不记录就多了。而且 因为非自动增长 也会报主键为null的错误。
想到用rollback 可是 应用会抓错。想到 插入一条记录 在删掉 虽然效率差点 不过也实现了 呵呵
修改 主键为非自动增长 默认值为0 这样 就可以随便插入了。然后 删除 主键为0的记录
但是在数据库 已经有 主键为0的 记录 也会出错 所有之前要做些处理。
数据库没有记录 也会出错 因为 max 出错。所有 没有记录的时候 插入以下 主键为1 的 当然 之后 要删掉
很累 呵呵
下面 是代码
create trigger zfhf_test_tri
--数据库名称
on [dbo].zfhf_test
--触发方式
for insert
as
-- 表中存在主键为0 的记录
begin
if exists(select * from zfhf_test where id=0)
begin
delete from zfhf_test where id=0
end
--
declare @noResult as int
set @noResult=0
declare @myID as int
declare @myName as varchar(20)
--表中没有任何记录
if not exists(select * from zfhf_test)
begin
declare @seName as varchar(20)
select @seName = name from inserted
insert into zfhf_test(id,name)values(1,@seName)
set @noResult=1
end
select @myID = max(id) from zfhf_test
select @myName = name from inserted
--添加记录 主键自动增长
insert into zfhf_test(id,name)values(@myID+1,@myName)
--删除 插入的主键为默认值0 的记录
delete from zfhf_test where id=0
--删除 插入的主键为默认值1的记录 在数据库不存在记录的情况下 而插入的记录
if(@noResult=1)
begin
delete from zfhf_test where id=1
end
return
end