2016-10-15 6 views
1

トリガーはテーブルから行を削除することに反応する必要があります。サプライヤーからの供給品がこのサプライヤーから供給される場合、トリガーは削除をキャンセルする必要があります。 このコードは供給せず、供給および供給業者と供給業者の両方を削除することを可能にする:トリガーがどのように動作するのかわかりません

CREATE TRIGGER SuppliersDeleteCondition 
ON Suppliers 
FOR DELETE 
AS 
IF EXISTS (
      SELECT 1 
      FROM Supplies Ses 
      JOIN DELETED D 
       ON D.SupplierID=Ses.SupplierID 
     ) 
BEGIN 
    RAISERROR ('This supplier has some supplies', 16, 1) 
    ROLLBACK TRANSACTION 
END; 

おおよそのテーブルビュー は、次のとおり

サプライヤー(仕入先、名前、住所、BankDetails)、用品(SupplyID、仕入先、商品コード

CREATE TABLE Suppliers 
     (
     SupplierID INT IDENTITY, 
     Name VARCHAR(150) NOT NULL UNIQUE, 
     Address VARCHAR(900) NOT NULL, 
     BankDetails VARCHAR(9) NOT NULL UNIQUE, 

     CONSTRAINT pk_SupplierID PRIMARY KEY (SupplierID), 
     CONSTRAINT chk_Name_Suppliers CHECK (NOT Name LIKE '%[^a-z ]%' AND NOT Name LIKE '[ ]%' AND NOT Name LIKE '%[ ]' AND NOT Name LIKE '%[ ][ ]%'), 
     CONSTRAINT chk_Address_Suppliers CHECK (NOT Address LIKE '%[^a-zA-z0-9,./ ]%' AND NOT Address LIKE '[ ]%'), 
     CONSTRAINT chk_BankDetails_Suppliers CHECK (BankDetails LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]') 
     ); 
CREATE TABLE Supplies 
     (
     SupplyID INT IDENTITY, 
     SupplierID INT, 
     ProductID INT, 
     ImplementationPeriod DATE NOT NULL, 
     Weight REAL NOT NULL, 
     Price MONEY NOT NULL, 

     CONSTRAINT pk_SupplyID PRIMARY KEY (SupplyID), 
     CONSTRAINT fk_SupplierID FOREIGN KEY (SupplierID) REFERENCES Suppliers(SupplierID) ON DELETE CASCADE, 
     CONSTRAINT fk_ProductID FOREIGN KEY (ProductID) REFERENCES Products(ProductID) ON DELETE CASCADE, 
     CONSTRAINT chk_Weight_Supplies CHECK (Weight > 0) 
     ); 

私はこのような行を削除:、ImplementationPeriod、重量、価格)ここで

は、CREATE TABLEです。

DELETE FROM Suppliers WHERE SupplierID=18 

削除トリガーは不要であるので、あなたはDELETE CASCADEオプションを使用して外部キーを持って、この行が削除されたと私は何のエラー

+1

トリガーではなく、削除を防ぐために外部キー制約を使用する必要があります。 –

+0

FKを使用する方が良いとわかっていますが、トリガを使用することは可能ですか? – salkcid

+0

@salkcidでは、20年前にRIの制約がSQL Serverに導入される前に、トリガを使用して参照整合性を強制することができました。 'CREATE TABLE'を投稿し、問題を再現する完全なスクリプト。 –

答えて

3

を得ませんでした。 AFTER DELETEトリガーはサプライヤーと消耗品の行が削除された後に起動し、EXISTS述部の行はこれまでどおりにはなりません。私がお勧めしない外来キーを削除できない限り、ここでトリガーは必要ありません。 SQL Serverがあなたのために仕事をするようにしましょう。

+0

ありがとう、問題は解決されました。 – salkcid

関連する問題