Создание триггеров ввода для игнорирования нежелаемых данных

Tags: database, базы данных, данные

Скажем, у вас есть приложение, которое настаивает на вводе данных в базу данных, а вам эти данные не нужны.

Вы хотите, чтобы приложение решило, что оно вставило данные - вы не хотите откатывать его или возвращать ошибку конечному пользователю. Вам просто не нужны данные, и вы не хотите проблем с их дальнейшим удалением.

Вот наша воображаемая таблица "Документы":

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 на более раннее значение) и обрабатывать объемные вставки (где триггеры игнорируются по умолчанию). Мы просто показали то, что может вам пригодиться в проекте.

No Comments

Add a Comment