Создание триггеров ввода для игнорирования нежелаемых данных
Скажем, у вас есть приложение, которое настаивает на вводе данных в базу данных, а вам эти данные не нужны.
Вы хотите, чтобы приложение решило, что оно вставило данные - вы не хотите откатывать его или возвращать ошибку конечному пользователю. Вам просто не нужны данные, и вы не хотите проблем с их дальнейшим удалением.
Вот наша воображаемая таблица "Документы":
1 2 3 4 |
CREATE TABLE dbo.Documents (DocumentName VARCHAR(50), CreationDate DATETIME); GO |
Мы хотим игнорировать все документы с помощью CreationDate до 2018 года. Введите нашего нового помощника - триггер INSTEAD OF:
Transact-SQL
1 2 3 4 5 6 7 8 9 10 11 |
CREATE OR ALTER TRIGGER IgnoreOldDocuments ON dbo.Documents INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; INSERT dbo.Documents(DocumentName, CreationDate) SELECT DocumentName, CreationDate FROM inserted WHERE CreationDate >= '2018/01/01'; END GO |
Оператор SET NOCOUNT ON важен здесь, потому что он скрывает сообщение «1 row(s) affected», которое обычно выходит из триггера.
Теперь, когда мы вставляем две строки - одна до 2018 года, а одна после - обе они работают:
1 2 3 4 5 |
INSERT INTO dbo.Documents (DocumentName, CreationDate) VALUES ('December 2017', '2017/12/01'); INSERT INTO dbo.Documents (DocumentName, CreationDate) VALUES ('January 2018', '2018/12/01'); GO |
Наше приложение считает, что они обе вставлены:
2 строки вводим, одна остается.
Но если мы выберем данные из таблицы:
Это всего лишь начало: вам все равно нужно сообщить об этом команде разработчиков и обработать обновления (поскольку приложение может установить значение CreationDate на более раннее значение) и обрабатывать объемные вставки (где триггеры игнорируются по умолчанию). Мы просто показали то, что может вам пригодиться в проекте.