触发器的问题

fallingsme 2013-02-01 10:08:45
sql server 2005的数据库,主从表结构。
主表(TABLE_A)有字段:日期。 明细表(TABLE_B)有字段:单价。(每个日期都有唯一的单价,保存在另外的表)
我在主表做了个触发器,当更新日期时判断单价是否正确。
在明细表也做了个触发器,当更新单价时判断单价是否正确。

可是,当客户端软件同时更新日期和单价时,主表的触发器只能取到明细表更改前的单价(INSERTED INNER JOIN TABLE_B);明细表的触发器也只能取到主表更改前的日期(TABLE_A INNER JOIN INSERTED)。保存时,是否有办法可以取到更改后的日期和单价呢?
...全文
428 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kilin_Zhang 2013-02-07
  • 打赏
  • 举报
回复
数据库级别的应该做不到。 在修改主表的数据的时候,明细表数据并未发生变动,所以主表的触发器才会取到明细表原始数据。哥们别纠结了,触发器搞不定的。
fallingsme 2013-02-04
  • 打赏
  • 举报
回复
有没有什么更好的办法?
fallingsme 2013-02-01
  • 打赏
  • 举报
回复
bbbbbben,用户是直接操作软件修改的,软件是买的。软件改不了,而且用户是必须要修改日期和单价的。
我腫了 2013-02-01
  • 打赏
  • 举报
回复
建議直接添加一條記錄,用日期控制。不要直接修改日期和單價。
fallingsme 2013-02-01
  • 打赏
  • 举报
回复
不管修改主表的日期,还是修改明细表的单价,还是同时修改日期、单价,都要保证单价是正确的。
fallingsme 2013-02-01
  • 打赏
  • 举报
回复
我举个例子: 1月30日,单价1元 1月31日,单价2元 2月1日,单价3元。 当前单据上,日期是1月30日,单价是2元。这个数据是错误的,所以要修改成:日期是2月1日,单价是3元。 修改好,保存时,主表的触发器取到的日期是2月1日,单价还是2元;明细表的触发器取到的日期是1月30日,单价是3元。 我要取到的结果是:日期是2月1日,单价是3元。然后再判断2月1日的单价是不是3元。 (因为软件是现买的,改不了,所以只能从数据库里解决)
我腫了 2013-02-01
  • 打赏
  • 举报
回复

SELECT 
    last_user_update 
FROM sys.dm_db_index_usage_stats 
WHERE object_id=object_id('t1')
我腫了 2013-02-01
  • 打赏
  • 举报
回复
getdate() ?
fallingsme 2013-02-01
  • 打赏
  • 举报
回复
同时更新主表的日期和明细表的单价时,我只想到一个替代的办法:主表触发器触发,保存主表更新后的日期到明细表,然后再触发明细表判断单价是否正确。
fallingsme 2013-02-01
  • 打赏
  • 举报
回复
--主表的触发器
ALTER TRIGGER [T_PURTC_PURTDUDF03]
   ON  [dbo].[PURTC]
   AFTER UPDATE
AS 
BEGIN
	SET NOCOUNT ON;
	--修改供应商、交易币种、税种、单据日期、税率的时候触发
	IF UPDATE(TC004) OR UPDATE(TC005) OR UPDATE(TC018) OR UPDATE(TC024) OR UPDATE(TC026)
	BEGIN
		IF EXISTS(SELECT 1 FROM INSERTED INNER JOIN PURTD ON TC001=TD001 AND TC002=TD002 AND TC001<>'3106')
		BEGIN
			DECLARE @n VARCHAR(4000),@xml XML

			DECLARE @t_GetHEJIA TABLE(COLUMNS varchar(255),TD1 varchar(10),TD2 varchar(20),TD3 varchar(10))
			INSERT INTO @t_GetHEJIA
			--下面一行dbo.F_GetHEJIA的参数错误:明细表(PURTD)的单价(TD010)取到的是修改前的数值,取不到明细表(PURTD)更新时的INSERTED.TD010
			SELECT dbo.F_GetHEJIA(TD004,TC004,TC005,TD038,TC024,TC018,TC026,TD033,TD010),TD001,TD002,TD003
			FROM INSERTED INNER JOIN PURTD ON TC001=TD001 AND TC002=TD002

			SELECT @xml=(SELECT DISTINCT COLUMNS FROM @t_GetHEJIA AS PURTC WHERE COLUMNS NOT LIKE '核价单%' FOR XML AUTO,ELEMENTS)
			SELECT @n=REPLACE(REPLACE(REPLACE(REPLACE(CAST(@xml AS VARCHAR(MAX)),'<PURTC>',CHAR(10)),'</PURTC>',''),'<COLUMNS>',''),'</COLUMNS>','')
			
			IF LEN(REPLACE(@n,' ',''))>0
			BEGIN
				RAISERROR('%s',16,1,@n)
				ROLLBACK;
			END
			ELSE
			BEGIN
				UPDATE PURTD SET UDF03=CASE WHEN charindex('{',COLUMNS)>0 THEN substring(COLUMNS,1,charindex('{',COLUMNS)-1) ELSE COLUMNS END
								,UDF51=CASE WHEN charindex('{',COLUMNS)>0 THEN CAST(substring(COLUMNS,charindex('{',COLUMNS)+1,charindex('}',COLUMNS)-charindex('{',COLUMNS)-1) AS NUMERIC(16,6)) ELSE 0 END
								,UDF52=CASE WHEN charindex('{',COLUMNS)>0 THEN CAST(substring(COLUMNS,charindex('}',COLUMNS)+1,255) AS NUMERIC(16,6)) ELSE 0 END
				FROM PURTD INNER JOIN @t_GetHEJIA ON TD001=TD1 AND TD002=TD2 AND TD003=TD3
			END
		END	
	END
	SET NOCOUNT OFF;
END
我腫了 2013-02-01
  • 打赏
  • 举报
回复
看看你的觸發器的內容。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧