INSERT TRIGGERS и функция UPDATE () - PullRequest
       13

INSERT TRIGGERS и функция UPDATE ()

2 голосов
/ 18 января 2010

Я создал триггер INSTEAD OF INSERT для представления в моей базе данных.Я хочу знать, какие столбцы включены в список столбцов оператора INSERT в представлении.

Если вы читаете документацию MSDN для триггеров, функции UPDATE () и COLUMNS_UPDATED () должны удовлетворять этому требованию.Однако во время тестирования я обнаружил, что независимо от того, какие столбцы находятся в списке столбцов INSERT, функции UPDATE () и COLUMNS_UPDATED () всегда возвращают все столбцы из представления.

CREATE VIEW dbo.MyView (BatchId, [Status], OrderNumber, WhenClosed) AS
    SELECT bth.BatchId, bth.[Status], bth.OrderNumber,
            Private.ufxAdjustDateTime(bth.WhenClosed, bth.WhenClosedUtcOffset)
        FROM Private.Batch AS bth
GO
CREATE TRIGGER dbo.[MyView-Insert] ON dbo.MyView INSTEAD OF INSERT AS
BEGIN
    SET NOCOUNT ON

    DECLARE @batchIdIsSet BIT

    SELECT @batchIdIsSet = 0
    IF UPDATE(BatchId)
        SELECT @batchIdIsSet = 1

    INSERT INTO Private.Batch
        (BatchId, [Status], OrderNumber)
        SELECT CASE @batchIdSet
                   WHEN 1 THEN ins.BatchId
                   ELSE NEWID()
               END, ins.[Status], ins.OrderNumber
            FROM inserted AS ins
END

Причина, по которой я хочу это сделатьэто то, что мне нужно изменить существующую таблицу, и у меня есть множество устаревшего кода, который опирается на нее.Итак, я создал новую таблицу, изменил старую таблицу на представление и создал в представлении триггеры, чтобы разрешить операторы INSERT, UPDATE и DELETE.

Теперь в старой таблице были значения по умолчанию длянекоторые столбцы, если для вставки в представление используется значение по умолчанию, я хочу использовать значение по умолчанию при вставке в новую таблицу.Чтобы сделать это, я должен быть в состоянии выяснить, какие столбцы имели [явно] значения, предоставленные для INSERT.

Недостаточно проверить, что столбец имеет NULL, потому что оператор INSERT может явно установить значение поляк NULL, и это вполне приемлемо.

Хммм, я надеюсь, это понятно.Кеп.

Ответы [ 2 ]

4 голосов
/ 18 января 2010

В операторе INSERT затрагивается каждый столбец.Он либо получает NULL, либо указанное вами значение.

Проверка на NULL была бы наилучшим вариантом, но, поскольку вы не можете этого сделать, я думаю, вы, возможно, застряли.Можете ли вы разработать сценарии, в которых может потребоваться явная обработка NULL?

2 голосов
/ 18 января 2010

Для INSERT все меняется, потому что это новая строка.

Если у вас был триггер AFTER, вы можете проверить, является ли введенное значение значением по умолчанию. Если значением по умолчанию является NULL (например, NULL и не по умолчанию), то как вы можете отличить, если NULL явно вставлен в любой триггер?

В триггере ДО, я не знаю, можете ли вы перехватить значение по умолчанию. Конечно, если по умолчанию используется NEWID (), это все равно не поможет.

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

...