2013-08-26 42 views
0

我的场景是:我在SQL中有两个表格,一个是标题,另一个是详细信息。在标题中删除记录时,我想要删除记录的详细信息。在我实际删除细节之前,我正在做一些检查。如果不符合条件,则阻止在SQL中删除语句

我的问题是,当我执行检查时,我正在基于要删除的记录加入Header表,不幸的是,当我这样做时,标题已被用户的语句删除。

如何防止标题被删除,如果它不符合必要的标准。例如,对于Header表:

Key  | Status 
------------------- 
001  | 00 
002  | 00 
003  | 40 

我的DELETE语句:

DELETE FROM HEADER WHERE KEY = '003' 

在我删除触发之前,我删除我检查,以确保状态< 40的细节。如果不是这种情况我抛出一个错误,我怎么能为Header做同样的事情?

我的代码如下:

ALTER TRIGGER [dbo].[trg_PO_DELETE] 

ON PO 

AFTER DELETE 

AS 

DECLARE 
    @Date     DATETIME 
    , @Who     VARCHAR(20) 
    , @ProcessedStatus  CHAR(2) 
    , @ProcessingStatus  CHAR(2) 
    , @ShmtType    INT 
    , @POType    INT 
    , @MsgNo    INT 
    , @Msg     VARCHAR(MAX) 
    , @Continue    INT 

SET @Date     = CURRENT_TIMESTAMP 
SET @Who     = SYSTEM_USER 
SET @ProcessedStatus  = '90' 
SET @ProcessingStatus  = '40' 
SET @ShmtType    = 3 
SET @POType     = 1 
SET @MsgNo     = 0 
SET @Msg     = '' 
SET @Continue    = 0 



IF EXISTS(SELECT 1 FROM PO(NOLOCK) 
       JOIN DELETED ON PO.po_asn_number = DELETED.po_asn_number 
          AND PO.po_customer_id = DELETED.po_customer_id 
          AND PO.po_number = DELETED.po_number 
          AND PO.po_type = DELETED.po_type 
          AND PO.po_status = DELETED.po_status 
      WHERE PO.po_status < @ProcessingStatus) 
    BEGIN 
     /* REMOVE SHIPMENT DETAIL WHEN SHIPMENT HEADER IS DELETED */ 
     DELETE PO_DETAIL 
     FROM PO_DETAIL 
     JOIN DELETED ON PO_DETAIL.pd_asn_number = DELETED.po_asn_number 
        AND PO_DETAIL.pd_customer_id = DELETED.po_customer_id 
        AND PO_DETAIL.pd_po_number = DELETED.po_number 
        AND PO_DETAIL.pd_type = DELETED.po_type 

     /* REMOVE UCC FOR SHIPMENT WHEN SHIPMENT IS DELETED*/ 
     DELETE UCC 
     FROM UCC 
     JOIN DELETED ON UCC.cs_shipment_number = DELETED.po_asn_number 
        AND UCC.cs_po_number = DELETED.po_number 
        AND DELETED.po_type = @ShmtType 

     /* UPDATE PO LEVEL INFORMATION */ 
     UPDATE PO 
       SET PO.po_shipped_qty = PO.po_shipped_qty - DELETED.po_shipped_qty 
       , PO.po_received_qty = PO.po_received_qty - DELETED.po_received_qty 
     FROM PO 
     JOIN DELETED ON PO.po_asn_number = DELETED.po_number 
        AND PO.po_number = DELETED.po_number 
        AND PO.po_customer_id = DELETED.po_customer_id 
        AND DELETED.po_type = @POType 
    END 
ELSE 
    BEGIN 
     SET @Continue = 1 
     SET @MsgNo = 50000 
     SET @Msg = dbo.fnc_GetMessage(@MsgNo) 
    END 
IF @Continue=1 -- Error Occured 
    BEGIN 
     RAISERROR @MsgNo @Msg 
     RETURN 
    END 

我想我的问题是,因为头记录消失之前,我可以做加盟。您可能提供的任何帮助将非常有帮助。

+0

都裹在交易中,做一个ROLLBACK如有错误抛出。这就是交易的目的。 – RBarryYoung

+0

谢谢。我将添加交易计数以及INSTEAD OF DELETE – jorame

回答

0

尝试使用INSTEAD OF DELETE触发,这样的事情:

CREATE TRIGGER TEST1 
ON DBO.HEADER 
INSTEAD OF DELETE 
AS 
    BEGIN 
     DELETE H 
     FROM HEADER H 
      INNER JOIN DELETED d 
        ON H.[KEY] = d.[KEY] 
         AND H.STATUS < 40 
    END 

GO