sql server 2005的数据库,主从表结构。
主表(TABLE_A)有字段:日期。 明细表(TABLE_B)有字段:单价。(每个日期都有唯一的单价,保存在另外的表)
我在主表做了个触发器,当更新日期时判断单价是否正确。
在明细表也做了个触发器,当更新单价时判断单价是否正确。可是,当客户端软件同时更新日期和单价时,主表的触发器只能取到明细表更改前的单价(INSERTED INNER JOIN TABLE_B);明细表的触发器也只能取到主表更改前的日期(TABLE_A INNER JOIN INSERTED)。保存时,是否有办法可以取到更改后的日期和单价呢?
主表(TABLE_A)有字段:日期。 明细表(TABLE_B)有字段:单价。(每个日期都有唯一的单价,保存在另外的表)
我在主表做了个触发器,当更新日期时判断单价是否正确。
在明细表也做了个触发器,当更新单价时判断单价是否正确。可是,当客户端软件同时更新日期和单价时,主表的触发器只能取到明细表更改前的单价(INSERTED INNER JOIN TABLE_B);明细表的触发器也只能取到主表更改前的日期(TABLE_A INNER JOIN INSERTED)。保存时,是否有办法可以取到更改后的日期和单价呢?
SELECT
last_user_update
FROM sys.dm_db_index_usage_stats
WHERE object_id=object_id('t1')
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