触发器如下:ALTER TRIGGER [TR_最后到帐月更新_TR] ON [DBO].[个人参保信息表]
FOR UPDATE,INSERT
AS
BEGIN
DECLARE @DAYS INT --黑名单生效天数
SET @DAYS = 60 --黑名单生效默认为60天
SELECT @DAYS = Convert( int,isnull(参数当前值,0) ) FROM dbo.常用参数表 WHERE 参数序号=122 --从参数表取黑名单生效天数 IF ( COLUMNS_UPDATED()&16 > 0 ) --修改最后到帐月列 或 增加一条记录
BEGIN
DELETE 医保黑名单 WHERE 医保证号 IN ( SELECT 医保证号 FROM inserted WHERE 参保险种代码='00010001' AND DATEDIFF(DAY,最后到帐月,GETDATE())<=@DAYS )
END
END实现功能就是,个人参保信息表 第 5 列 最后到帐月 修改为 大于等于(当前日期-60天)时,将指定参保人从 医保黑名单 表中删除-----这个人缴费了就从黑名单里删除他在 SQL2000里,程序一切正常;换到 SQL2005 就不能正常执行,我怀疑 SQL2005 里被修改的行是不是不存在inserted里,请高手指点迷津!!!
FOR UPDATE,INSERT
AS
BEGIN
DECLARE @DAYS INT --黑名单生效天数
SET @DAYS = 60 --黑名单生效默认为60天
SELECT @DAYS = Convert( int,isnull(参数当前值,0) ) FROM dbo.常用参数表 WHERE 参数序号=122 --从参数表取黑名单生效天数 IF ( COLUMNS_UPDATED()&16 > 0 ) --修改最后到帐月列 或 增加一条记录
BEGIN
DELETE 医保黑名单 WHERE 医保证号 IN ( SELECT 医保证号 FROM inserted WHERE 参保险种代码='00010001' AND DATEDIFF(DAY,最后到帐月,GETDATE())<=@DAYS )
END
END实现功能就是,个人参保信息表 第 5 列 最后到帐月 修改为 大于等于(当前日期-60天)时,将指定参保人从 医保黑名单 表中删除-----这个人缴费了就从黑名单里删除他在 SQL2000里,程序一切正常;换到 SQL2005 就不能正常执行,我怀疑 SQL2005 里被修改的行是不是不存在inserted里,请高手指点迷津!!!
你用过 SQL2005,确信 被修改行 也是存在 inserted 表中吗?
insert into test select 1,2
union all select 1,3
union all select 2,3
union all select 1,23
union all select 21,23create trigger tri_test on test
for update
as
if update(a)
begin
--每一次更新在sql中都可以看成是先删后增.
select * from deleted--这里存的是删除的记录
select * from inserted--这里存的是新增的记录
endupdate test set a=4 where a=21 and b=23
----------------用上面的语句测试一下嘛
是否第五列修改在 SQL2000下用
COLUMNS_UPDATED()&16 > 0在SQL 2005 下用
COLUMNS_UPDATED()&4096 > 0我也不知道怎么算出来的,但查询 COLUMNS_UPDATED() 的值为 0x1000=2的12次方=4096
谢谢各位