Есть ли альтернатива триггеру после вставки - PullRequest
0 голосов
/ 14 июля 2020
• 1000 not create, есть ли альтернатива для триггеров, которые не повлияли бы на производительность базы данных, одновременно выполняя то, что я ожидал. Мой триггер выглядит следующим образом:
CREATE TRIGGER AfterInsert
   ON  InspectionItems
   AFTER INSERT
AS 
BEGIN
    declare @InspectionItemNumber nvarchar(20), @InspectionItemId int

    select @InspectionItemId = ins.InspectionItemId FROM INSERTED ins;

    update InspectionItems set InspectionItemNumber = 'T' + RIGHT('00000'+CAST(InspectionItemId AS VARCHAR(5)),6)
    where InspectionItemId = @InspectionItemId
END
GO

Есть ли альтернатива для триггера, который делает то же самое и сохраняет производительность - заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Вы можете использовать вычисляемый столбец

alter table InspectionItems 
add InspectionItemNumber = 'T' + RIGHT('00000'+CAST(InspectionItemId AS VARCHAR(5)),6)

В чем разница?

  1. Если не сохраняется или не индексируется, вычисляемый столбец будет оцениваться при select времени вместо insert времени.
  2. Вычисляемое значение столбца будет обновляться, если столбцы зависят от обновления, или если вы измените выражение. Это было бы неверно, если бы столбец вычислялся только с триггером вставки. Так что здесь есть разница в поведении.
  3. У вас есть выбор, действительно ли вы хотите сохранить вычисляемый столбец. Вы также можете поместить индекс в вычисляемый столбец. Эти варианты доступны не всегда, это зависит от выражения столбца. Ваше выражение детерминировано c и точно, поэтому все варианты открыты.

Последний совет по триггерам в целом: ваш триггер в том виде, в каком он написан, небезопасен. Вы предполагаете, что будет вставлена ​​только одна строка. Но оператор вставки - это операция на основе набора. В таблице inserted может быть более одной строки. Как бы вы присвоили переменной @InspectionItemId несколько строк с InspectionItemId значениями?

Вам нужно писать триггеры с учетом операций на основе наборов. Это означает, например, объединение таблиц inserted и deleted, а не присвоение переменных ожидаемых скаляров.

2 голосов
/ 14 июля 2020

Вы можете сделать его постоянным вычисляемым столбцом:

  • отбросьте существующий столбец InspectionItemNumber
  • затем выполните это SQL, чтобы создать вычисляемый столбец:
ALTER TABLE dbo.InspectionItems
ADD InspectionItemNumber AS 'T' + RIGHT('00000' + CAST(InspectionItemId AS VARCHAR(5)), 6) PERSISTED;

Теперь каждый раз, когда вы вставляете новую строку, SQL Сервер сам вычисляет это значение и отображает его как столбец InspectionItemNumber

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