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

解决方案 »

  1.   


    SELECT 
        last_user_update 
    FROM sys.dm_db_index_usage_stats 
    WHERE object_id=object_id('t1')
      

  2.   

    bbbbbben,用户是直接操作软件修改的,软件是买的。软件改不了,而且用户是必须要修改日期和单价的。
      

  3.   

    --主表的触发器
    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