不希望修改PorMasterDetail中MPrice,MForeignPrice二列,但是前端程序中是允许修改这二列,且程序没办法做再次开发。
又不希望用户在前端程序中修改这二列对应的数据时,给出用户看不懂的错误提示。
所以想到使用触发器,允许用户修改数据,但是通过触发器将数据改回到用户修改前的状态。
程序如下,本人对SQL不太熟悉,不知道这样写会不会导致触发器运行出现死循环?请高手帮忙指点,非常感谢!CREATE TRIGGER TG_UpdatePriceCheck
   ON  PorMasterDetail
   FOR UPDATE
AS 
IF UPDATE(MPrice) OR UPDATE(MForeignPrice)
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

    -- Insert statements for trigger here
DECLARE @MPrice decimal(15,5)
DECLARE @MForeignPrice decimal(15,5)
DECLARE @PurchaseOrder char(6)
    DECLARE @MStockCode char(30)

SELECT @PurchaseOrder=PurchaseOrder,@MStockCode=MStockCode,@MPrice=MPrice,@MForeignPrice=MForeignPrice
    FROM DELETED
UPDATE PorMasterDetail
SET MPrice=@MPrice,MForeignPrice=@MForeignPrice
WHERE PurchaseOrder=@PurchaseOrder AND MStockCode=@MStockCode
END
GO

解决方案 »

  1.   

    触发器内部的update语句重新触发了触发器,从而引起了嵌套调用的死循环。
      

  2.   

    会。因为在trigger里的更新,符合trigger的触发条件。会造成死锁。
      

  3.   

    感谢各位的回复.
    这个TRIGGER在功能上满足了需要,即:允许用户修改数据,但是通过触发器将数据改回到用户修改前的状态。
    (同时我观察到系统资源并未因为死循环的出现而急剧下降)
    当我该如何修改这个TRIGGER或是改变数据库的设定使得能够避免死循环.
    或是有别的触发器之外的实现同样目的的办法,前提是不能修改前端的程序。
    谢谢!