2014-11-11 3 views
0

Я пытаюсь создать триггер, если строка вставлена ​​и если строка удалена. Если строка вставлена, оператор печати выдаст одно сообщение, и если строка будет удалена, оператор печати выдаст другое сообщение. Мой преподаватель использовал этот пример, но с операторами DDL, а не с заявлениями DML, которые я вставлял. Мой вопрос заключается в том, как я могу получить эквивалент, но сделав так, чтобы операторы DML могли работать? Пока что мой вывод говорит, что команда else указывает, вставлена ​​или удалена строка. Я не верю, что он даже считает утверждение вставки вообще.Создание триггера для строки Insert и Delete

Вот моя схема.

CREATE TABLE dbo.Customers 
(
    CustomerID   INT    NOT NULL IDENTITY PRIMARY KEY, 
    CustomerFName  VARCHAR(30)  NOT NULL, 
    CustomerLName  VARCHAR(30)  NOT NULL, 
    CustomerAddress1 VARCHAR(50)  NOT NULL, 
    CustomerAddress2 VARCHAR(50)  NULL, 
    CustomerCity  VARCHAR(50)  NOT NULL, 
    CustomerState  CHAR(2)   NOT NULL, 
    CustomerZipCode  INT    NOT NULL, 
    CustomerHome  VARCHAR(20)  NOT NULL, 
    CustomerCell  VARCHAR(20)  NOT NULL, 
    CustomerEmail  VARCHAR(50)  NULL 
); 

Это были мои данные, которые у меня уже были.

CustomerID CustomerFName CustomerLName CustomerAddress1 CustomerAddress2  CustomerCity CustomerState CustomerZipCode CustomerHome CustomerCell  CustomerEmail 
1 Jane Swanson 123 Negley Ave Apartment #3 Pittsburgh PA 15222 (412) 555 -  6678 (412) 555 - 6789 [email protected] 
2 Phillip Connely 167 Warble St NULL Pittsburgh PA 15212 (412) 555 - 9463 (412) 555 - 6797 [email protected] 
3 Alfred Mansley 41 Wild Place Apartment #4 Pittsburgh PA 15205 (412) 555 - 9371 (412) 555 - 4259 [email protected] 
4 Angel Smith 2050 Morningside Ave NULL Pittsburgh PA 15222 (412) 555 - 6931 (412) 555 - 1135 [email protected] 
5 Walter Weezley 2670 Butler St NULL Pittsburgh PA 15210 (412) 567 - 6931 (412) 666 - 1256 [email protected] 

создание триггера

CREATE TRIGGER Table_Update 
    ON Customers 
AFTER INSERT, DELETE 
AS 
    If EXISTS (SELECT 1 FROM inserted) 
     PRINT 'The company has gained customers.' 
    ELSE 
     PRINT 'The company has lost customers.' 

Тест

INSERT INTO Customers 
VALUES('Pter', 'Jackson', '1240 Wlnut St', 'Apartment #1', 'Pittsburgh', 
'PA', 15232, '(724) 789 - 1234', '(724) 555 - 8706', '[email protected]'); 

DELETE Customers 
WHERE CustomerFName = 'Pter'; 

После вставки строки я получаю сообщение:

компания приобрела клиентов.

Msg 2601, Level 14, State 1, процедура Table_Update, линия 15
Невозможно вставить дубликат ключа строки в объект 'dbo.Customers' с уникальным индексом 'IX_CustomerName'. Значение дублирующегося ключа (Jackson, Pter).
Заявление было прервано.

После удаления сразу после этого я получаю сообщение:

Компания потеряла клиентов.
(1 ряд (ы) пострадавших)
(1 ряд (ы) пострадавших)
(0 строк (ы) пострадавших)

Мой желаемый результат заключается в добавлении одной строки или удалить одну строку. Даже если я хочу удалить несуществующую строку, она, кажется, имеет влияние выше. Кажется, что он создает несколько строк. У меня есть ключ UNIQUE по имени клиента, поэтому, если клиент появляется несколько раз, произойдет ошибка. Как я могу получить свой вывод для вставки в одну строку, а не в систему, пытающуюся вставить одну и ту же строку несколько раз?

+0

Почему вы не просто создать ** ** два отдельных триггеров - один для 'INSERT', один для' delete' - то вам не нужно беспорядок вокруг с выяснением, что это такое, и множество 'IF' и тому подобное .... –

+0

Можете ли вы проверить мой код выше? Я понимаю ваше предложение и изменю свой код, чтобы мой новый код функционировал желательным образом. –

+0

'' Pter ',' Jackson'' данные уже присутствуют в таблице, которые yu не разрешено вставлять, поскольку у вас есть уникальный индекс, и поскольку u уже одна строка с 'CustomerFName = 'Pter'', она удаляется, а u запустить инструкцию удаления. –

ответ

2

Как об использовании специальных таблиц Inserted or Deleted

If exists (select 1 from inserted) 
    PRINT 'The company has gained customers.' 
ELSE 
    PRINT 'The company has lost customers.' 
+0

Если я использую это, он приближает меня, но тогда у меня есть программа, говорящая об этом. Компания приобрела клиентов. Msg 2601, Level 14, State 1, Procedure Table_Update, Строка 15 Невозможно вставить повторяющуюся строку ключа в объекте 'dbo.Customers' с уникальным индексом 'IX_CustomerName'. Значение дублирующегося ключа (Jackson, Pter). Заявление было прекращено. –

+0

@ClintonScott, не глядя на схему таблицы, не может быть исправлена. Вы создали уникальный индекс в CustomerName. Похоже, что уже таблица имеет те значения «Джексон, Птер», которые вы пытаетесь вставить их снова. –

+0

Дайте мне знать, как я могу отправить вам схему, и я это сделаю. Должен ли я разместить его здесь где-нибудь? Я уверяю вас, что я не пытаюсь вставлять те же значения строк снова. –

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