2014-11-07 3 views
0

SQL 스크립트에 약간 이상한 문제가 있습니다. 누군가 나를 도와 줄 수 있기를 바랍니다.SQL 서버 트리거가 뒤로 기능을 수행합니다

GO 

CREATE TRIGGER customerDelete ON customer AFTER DELETE 
AS 
DELETE booking 
FROM customer 
WHERE customer.customerID = booking.customerID 

GO 
아래와 같이 heres는 이제

CREATE TABLE customer 
(
    customerID INT, 
    lastname VARCHAR(70) NOT NULL, 
    firstname VARCHAR(70) NOT NULL, 
    phone VARCHAR(10) CONSTRAINT phoneCheck CHECK ((phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')), 
    category VARCHAR(7) NOT NULL CONSTRAINT categoryDefault DEFAULT 'A', 
    CONSTRAINT categoryCheck CHECK (category IN ('A', 'B', 'C')), 

    CONSTRAINT customerPK 
     PRIMARY KEY (customerID) 
) 

CREATE TABLE package /*Still need to do the Zero Padding*/ 
(
    packageCode VARCHAR(6), 
    destination VARCHAR(70), 
    CONSTRAINT packageCodeCheck CHECK (packageCode LIKE ('YFK%')), 
    price MONEY NOT NULL CONSTRAINT priceCheck CHECK ((price BETWEEN 1000 AND 10000)), 
    passportRequired VARCHAR(7) NOT NULL CONSTRAINT passportRequiredDefault DEFAULT 'Y', 
    CONSTRAINT passportCheck CHECK (passportRequired IN ('Y', 'N')), 

    CONSTRAINT packagePK 
     PRIMARY KEY (packageCode) 
) 

CREATE TABLE booking /*Still need to do the Customer and Package delete*/ 
(
    customerID VARCHAR(6), 
    bookingDate VARCHAR(70) NOT NULL DEFAULT GETDATE(), 
    amountPaid MONEY CONSTRAINT amountPaidDefault DEFAULT 0.00, 

    CONSTRAINT bookingPK 
     PRIMARY KEY (customerID) 
) 

문제 아래와 같이

나는 데이터베이스를 가지고는 그때 3 개 테이블을 생성

IF EXISTS (SELECT name 
    FROM sysdatabases 
    WHERE name = 'travel') 
    DROP DATABASE travel 
    GO 
    CREATE DATABASE travel 
GO 

USE travel 
GO 

를 사용하여 생성되고, 나는 트리거를 작성

내 이해에 따라 예약 된 모든 레코드가 삭제됩니다 ... 일치하는 고객 ID가있는 W HEN 레코드가 고객 테이블에서 삭제됩니다.

INSERT INTO customer 
    (customerID, lastname, firstname, phone, category) 
VALUES 
    (1, 'Picard', 'Corey', 1234567890, 'A'), 
    (2, 'Bond', 'Devon',, 'B'), 
    (3, 'Douglas', 'Bryan', 6549871230, 'C') 

INSERT INTO package 
    (packageCode, destination, price, passportRequired) 
VALUES 
    ('YFK001', 'Toronto', 1000.57, 'N'), 
    ('YFK002', 'Orlando', 3000.98, 'Y') 

INSERT INTO booking 
    (customerID, bookingDate, amountPaid) 
VALUES 
    (1, GETDATE(), 1548), 
    (2, GETDATE(), 1586), 
    (3, GETDATE(), 1350), 
    (4, GETDATE(), 1650) 

아래와 같이 내가 샘플 데이터를 삽입하고 마지막으로 나는 그러나

DELETE customer 
    WHERE customerID = 1 

를 사용하여 하나의 고객 ID와 테이블 고객으로부터 고객을 삭제 (I 트리거하기 위해 새로운 오전) , 사용하여 결과를 볼 때

SELECT * FROM customer 
    --WHERE customerID = 1 OR customerID = 2 OR customerID = 3 

SELECT * FROM package 
    --WHERE packageCode = 'YFK001' OR packageCode = 'YFK002' 

SELECT * FROM booking 
    --WHERE customerID = 1 OR customerID = 2 OR customerID = 3 OR customerID = 4 

그것은 merID 1과 4.

내가 뭘 잘못하고 있는지 알려주실 수 있습니까?

트리거

은 본질적으로 우리는 고객 TABLE

모든 도움에서 삭제 고객의 동일한 고객 ID와 예약을 삭제하는 목적으로 사용되어 대단히 감사합니다.

감사합니다, 브라이언

+0

업데이트됩니다 업데이트하는이 방법은'delete' 구문은 tablename'에서 삭제'이다. '고객으로부터 예약 삭제 '가 있습니다. 그래서 당신은 당신의 예약 테이블에서 전혀 삭제하지 않을 것입니다. 고객 테이블에서 불법적 인 삭제를 시도하고 있습니다. –

+0

테이블을 생성하는 동안 캐스케이드 키를 시도 했습니까? – Ashish

+0

'예약'테이블의 기본 키가 'customerID'인 것으로 나타났습니다. 이는 각 고객이 테이블에 하나의 예약 만 가질 수 있음을 의미합니다. 그게 네가하려는 의도 야? –

답변

3
이 변경

당신이에 삭제 : 여기 를 [당신이 특별히 다음 Lamak의 & 프라 딥의 대답을 사용할 수 있습니다 트리거를 사용하려면]

DELETE B 
FROM booking B 
INNER JOIN DELETED D 
    ON B.customerID = D.customerID; 
+0

나는 이것을 시도하고 SELECT 문을 여전히 고객 ID = 1에 대한 예약을 보여줍니다 –

+0

@ BryanD 나는 삭제를 수행하기 위해 테이블을 혼란, 지금 시도하십시오 – Lamak

+0

대단히 감사합니다. –

0

내 대답은, 트리거되지 않는다 당신이 할 수있는 최선의 방법은 귀하의 케이스에서 외래 키에 Cacade를 사용하는 것입니다.

여기 쿼리가 방금 캐스케이드를 업데이트했습니다.

,
CREATE TABLE customer 
(
    customerID INT, 
    lastname VARCHAR(70) NOT NULL, 
    firstname VARCHAR(70) NOT NULL, 
    phone VARCHAR(10) CONSTRAINT phoneCheck CHECK ((phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')), 
    category VARCHAR(7) NOT NULL CONSTRAINT categoryDefault DEFAULT 'A', 
    CONSTRAINT categoryCheck CHECK (category IN ('A', 'B', 'C')), 

    CONSTRAINT customerPK 
     PRIMARY KEY (customerID) 
) 

CREATE TABLE package /*Still need to do the Zero Padding*/ 
(
    packageCode VARCHAR(6), 
    destination VARCHAR(70), 
    CONSTRAINT packageCodeCheck CHECK (packageCode LIKE ('YFK%')), 
    price MONEY NOT NULL CONSTRAINT priceCheck CHECK ((price BETWEEN 1000 AND 10000)), 
    passportRequired VARCHAR(7) NOT NULL CONSTRAINT passportRequiredDefault DEFAULT 'Y', 
    CONSTRAINT passportCheck CHECK (passportRequired IN ('Y', 'N')), 

    CONSTRAINT packagePK 
     PRIMARY KEY (packageCode) 
ON DELETE CASCADE 
     ON UPDATE CASCADE 
) 

CREATE TABLE booking /*Still need to do the Customer and Package delete*/ 
(
    customerID VARCHAR(6), 
    bookingDate VARCHAR(70) NOT NULL DEFAULT GETDATE(), 
    amountPaid MONEY CONSTRAINT amountPaidDefault DEFAULT 0.00, 

    CONSTRAINT bookingPK 
     PRIMARY KEY (customerID) 
ON DELETE CASCADE 
     ON UPDATE CASCADE 
) 

은 삭제하거나 [키 값] 기본 키를 잡고 테이블의 모든 항목이 관련 외국 차일

관련 문제