私のシナリオは次のとおりです。SQL に 2 つのテーブルがあり、1 つはヘッダーで、もう 1 つは詳細です。ヘッダーでレコードが削除されたら、レコードの詳細も削除したいと思います。実際にディテールを削除する前に、まずいくつかのチェックを行っています。
私の問題は、チェックを行うときに削除されるレコードに基づいてヘッダーテーブルに参加していることです。残念ながら、これを行うと、ヘッダーはユーザーのステートメントによって既に削除されています。
ヘッダーが必要な基準を満たしていない場合、ヘッダーが削除されないようにするにはどうすればよいですか。ヘッダー テーブルの例:
Key | Status
-------------------
001 | 00
002 | 00
003 | 40
私の削除ステートメント:
DELETE FROM HEADER WHERE KEY = '003'
詳細を削除する前に DELETE TRIGGER で、ステータスが 40 未満であることを確認しています。そうでない場合は、エラーをスローします。ヘッダーに対して同じことを行うにはどうすればよいですか?
私のコードは以下です:
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
私の問題は、参加する前にヘッダー レコードがなくなったためだと思います。あなたが提供できるどんな助けも本当に役に立ちます。