2014-11-07 2 views
0

У меня есть немного странная проблема с моим SQL-скриптом, и я надеялся, что кто-то сможет мне помочь.Работа с триггером SQL Server назад

У меня есть база данных создается с помощью

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

USE travel 
GO 

затем создать 3 таблицы, как показано ниже

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) 
) 

Теперь ЭРВО этот вопрос, я создать триггер, как показано ниже

GO 

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

GO 

Какой, по моему мнению, он удалит все записи при бронировании ... которые имеют соответствующий идентификатор клиента W HEN запись удаляется из таблицы клиентов. (Я новичок в триггеры)

I ВСТАВИТЬ образца данных, как показано ниже

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) 

И, наконец, я удалить клиента из таблицы клиентов с CUSTOMERID 1 с помощью

DELETE customer 
    WHERE customerID = 1 

Однако , когда я пытаюсь увидеть результаты с помощью

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 

Он отображает заказы с custo merID 1 и 4.

Можете ли вы сообщить мне, что я делаю неправильно?

Спусковой в основном используется с целью удаления заказов с тем же CUSTOMERID заказчика мы удалим из таблицы клиентов

Все помощь очень ценится.

Спасибо, Bryan

+0

'delete' синтаксис' удалить из tablename'. у вас есть «удалить заказ от клиента». так что вы не удаляетесь из своей таблицы бронирования вообще. вы пытаетесь сделать незаконное удаление в таблице клиентов. –

+0

Вы пробовали ключи с каскадом во время создания таблицы – Ashish

+0

Я заметил, что основным ключом для таблицы бронирования является 'customerID'. Это означает, что у каждого клиента может быть только одно бронирование в таблице. Вы уверены, что это то, что вы намерены? –

ответ

3

Изменение вашего удаления этого:

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

Я пробовал это, и инструкция SELECT по-прежнему показывает бронирование для customerID = 1 –

+0

@BryanD Я смутил таблицу для выполнения удаления, попробуйте сейчас – Lamak

+0

Большое спасибо, он отлично работает сейчас. –

0

Ответ не вызвать, [Если вы специально хотите использовать триггер, то Вы можете использовать & Ответ Прадипом в Lamak в] Здесь лучший способ сделать это использовать 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 
) 

Таким образом, когда вы удаляете или обновить [KeyValue] любой элемент таблицы проведения первичного ключа будет обновлять связанный с ним иностранным Чайлдсом

Смежные вопросы