Я пытаюсь создать триггер, если строка вставлена и если строка удалена. Если строка вставлена, оператор печати выдаст одно сообщение, и если строка будет удалена, оператор печати выдаст другое сообщение. Мой преподаватель использовал этот пример, но с операторами 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 по имени клиента, поэтому, если клиент появляется несколько раз, произойдет ошибка. Как я могу получить свой вывод для вставки в одну строку, а не в систему, пытающуюся вставить одну и ту же строку несколько раз?
Почему вы не просто создать ** ** два отдельных триггеров - один для 'INSERT', один для' delete' - то вам не нужно беспорядок вокруг с выяснением, что это такое, и множество 'IF' и тому подобное .... –
Можете ли вы проверить мой код выше? Я понимаю ваше предложение и изменю свой код, чтобы мой новый код функционировал желательным образом. –
'' Pter ',' Jackson'' данные уже присутствуют в таблице, которые yu не разрешено вставлять, поскольку у вас есть уникальный индекс, и поскольку u уже одна строка с 'CustomerFName = 'Pter'', она удаляется, а u запустить инструкцию удаления. –