Альтернатива триггерам в SQL Server - PullRequest
3 голосов
/ 15 января 2010

Чтобы устранить потенциальные проблемы с триггерами, какие альтернативы можно использовать, чтобы получить ту же функциональность реагирования на событие, инициируемое действием INSERT?

У меня есть база данных, в которую нужно добавить некоторые дополнительные значения при вставке. INSERT контролируется скомпилированным кодом и не может быть изменен.

ПРИМЕР: программа вставляет строку, и из этой строки мне нужно указать целое число в новом поле, которое указывает на справочную таблицу.

Если есть альтернатива триггеру, пожалуйста, дайте мне знать некоторые плюсы и минусы любой альтернативы. Основной причиной этого является то, что триггеры не разрешены в наших стандартах БД.

SQL Server 2008 Enterprise

Ответы [ 8 ]

6 голосов
/ 15 января 2010

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

То, что вы описываете, это именно то, почему существуют триггеры. Если вам нужно выполнить эту задачу, то это не может быть выполнено в соответствии с перечисленными ограничениями.

Триггеры - лучший вариант. Измените стандарты БД (или, по крайней мере, разрешите эту задачу быть исключением), поскольку они имеют недостатки.

3 голосов
/ 15 января 2010

Как вы определяете свое целое число, основываясь на вставляемой строке?

Одна альтернатива, на которую вы, возможно, захотите взглянуть, - это вычисляемые столбцы в SQL Server . Если это сопоставление довольно простое (например, извлечение символа 10-14 из строки) или что-то в этом роде, вы можете создать вычисляемый столбец, чтобы сделать это автоматически - триггер не нужен.

Вы даже можете сделать эти вычисленные столбцы постоянными (физически сохраненными как часть ваших таблиц) и создать индексы для этих полей!

Вычисляемые столбцы доступны в SQL Server 2000, постоянные столбцы - в SQL Server 2005.

2 голосов
/ 12 июля 2013

Я знаю, что спросили давным-давно. В SQL Server 2008 был представлен «Сбор данных изменений» MSDN . Другой альтернативой, но действительной только после 2008 R2, является «Отслеживание изменений» Настройка отслеживания изменений . Хотя вы можете запрашивать строки, чтобы отфильтровать ( посмотрите здесь ), что было изменено, это может или не может "решить" проблемы с триггерами.

1 голос
/ 15 января 2010

В SQL Server 2005 теперь есть так называемое предложение OUTPUT, которое может выполнять дополнительную обработку после выполнения INSERT (или другого действия). Эта статья охватывает больше деталей. Например, если вам нужно выполнить обработку после команды INSERT, вы можете сделать что-то вроде ...

INSERT INTO Contact
(FirstName, MiddleName, LastName)

OUTPUT INSERTED.ContactID, INSERTED.FirstName, INSERTED.MiddleName, INSERTED.LastName
INTO Contact_Audit    
VALUES
(@@SCOPE_IDENTITY, 'Joe', 'D.', 'Schmoe')

И у вас будет уникальный идентификатор, созданный для них.

1 голос
/ 15 января 2010

Триггеры - это способ выполнения действия после того, как событие (вставка, обновление, удаление) происходит в таблице SQL; тот факт, что они существуют, делает маловероятным, что существует какая-либо разумная альтернатива. К сожалению, сказать, что стандарты БД, которые вы говорите, уже существуют, эффективно мешают вам делать то, что вы хотите, без запуска какого-либо процесса, который периодически просматривает вашу таблицу и затем выполняет необходимое действие, или изменяя все операции CrUD базы данных на пройти через хранимые процедуры, которые делают то, что вы хотите, чтобы они. Поскольку вы говорите, что последнее невозможно - вы не можете изменить операторы INSERT - тогда у вас останутся только триггеры.

0 голосов
/ 08 июня 2017

Я думаю, что мы можем реализовать триггер с системой событий hibernate в настоящее время, несмотря на влияние на производительность. Я не делал этого раньше. Но я думаю, что это работает

0 голосов
/ 15 января 2010

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

0 голосов
/ 15 января 2010

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

BEGIN
 -- DO YOUR INSERT CODE

  IF @@ERROR = 0
    -- DO THE OTHER STUFF?

Или вы можете сделать это в вашем приложении. Попробуйте вставить, если это работает, а затем выполните другие действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...