2017-07-26 20 views
0

から削除しますProductsテーブルでは、その商品IDを持つすべてのオーダーラインを01から最初に削除する必要がありますテーブル。SQLトリガーは、私は2つのテーブルを持っている別のテーブル

だから私はそれを行うためのトリガを書いた:

CREATE TRIGGER [dbo].[atbl_Sales_Products_DTrig] 
ON [dbo].[atbl_Sales_Products] 
FOR DELETE 
AS 
BEGIN 
    DELETE FROM atbl_sales_OrdersLines 
    WHERE ProductID = (SELECT ProductID FROM deleted) 
END 

しかし、私はProductsテーブルからフォームに削除しますかしようとすると、それはまだ書かれています:

行が関連してあります。この行を削除する前に削除する必要があるテーブル(Sales OrdersLines)

私はここで間違っていますか?要求ごととして

EDIT:主な制約:

[dbo].[atbl_Sales_OrdersLines] WITH CHECK ADD CONSTRAINT 
[FK_atbl_Sales_OrdersLines_atbl_Sales_Products] FOREIGN KEY([ProductID]) 
REFERENCES [dbo].[atbl_Sales_Products] ([ProductID]) 
+2

[カスケード削除](https://stackoverflow.com/a/6260736/300836)を使用しない理由はありますか? –

+0

はい、これが問題を解決することがわかります。しかし、私は割り当てのためにこれをやっています。それはトリガで解決する必要があります。 – Benua

+1

トリガー(AFTERトリガーと呼ばれます)は、テーブルの削除操作の後に実行されます。したがって、エラーメッセージです。あなたが必要とするものは 'INSTEAD OF'トリガーですが、これはちょっと難解です。記事全文を読む:https://docs.microsoft.com/en-us/sql/relational-databases/triggers/dml-triggers – Alex

答えて

2

この場合の主な問題は、トリガーがFOR DELETEトリガーとして作成されたということです。したがって、削除操作後に起動されます。これはエラーを引き起こします。

これをINSTEAD OF DELETEトリガーとして作成すると、この問題は解決します。

第2の問題は、サブクエリで=を使用しないでください。サブクエリで複数の行を返すことができるためです。 IN演算子を使用する必要があります。

以下の例は、両方の問題の原因となるエラーを示しています。

INSERT INTO Products(ProductId, Quantity) 
SELECT 1,1 
UNION 
SELECT 2,2 
GO 

INSERT INTO OrdersLines(ProductId,Amount) 
SELECT 1,2 
UNION 
SELECT 1,3 
UNION 
SELECT 2,4 
UNION 
SELECT 2,5 
GO 

DELETE Products 
GO 

これは、トリガーが正常なときに合格します。

+0

これは私の問題を解決しました。ちょっとコメントして、製品テーブルからも削除する追加のクエリを書く必要がありました。 – Benua

関連する問題