不希望修改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
又不希望用户在前端程序中修改这二列对应的数据时,给出用户看不懂的错误提示。
所以想到使用触发器,允许用户修改数据,但是通过触发器将数据改回到用户修改前的状态。
程序如下,本人对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
这个TRIGGER在功能上满足了需要,即:允许用户修改数据,但是通过触发器将数据改回到用户修改前的状态。
(同时我观察到系统资源并未因为死循环的出现而急剧下降)
当我该如何修改这个TRIGGER或是改变数据库的设定使得能够避免死循环.
或是有别的触发器之外的实现同样目的的办法,前提是不能修改前端的程序。
谢谢!