トリガーはテーブルから行を削除することに反応する必要があります。サプライヤーからの供給品がこのサプライヤーから供給される場合、トリガーは削除をキャンセルする必要があります。 このコードは供給せず、供給および供給業者と供給業者の両方を削除することを可能にする:トリガーがどのように動作するのかわかりません
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
オプションを使用して外部キーを持って、この行が削除されたと私は何のエラー
トリガーではなく、削除を防ぐために外部キー制約を使用する必要があります。 –
FKを使用する方が良いとわかっていますが、トリガを使用することは可能ですか? – salkcid
@salkcidでは、20年前にRIの制約がSQL Serverに導入される前に、トリガを使用して参照整合性を強制することができました。 'CREATE TABLE'を投稿し、問題を再現する完全なスクリプト。 –