Как заставить использовать текстовые столбцы в триггере

Я пытаюсь использовать триггер обновления в SQL Server 2000, чтобы при обновлении я вставлял строку в таблицу истории, чтобы сохранить всю историю в таблице:

CREATE Trigger trUpdate_MyTable ON MyTable
FOR UPDATE
AS
    INSERT INTO
        [MyTableHistory]
        (
           [AuditType]
           ,[MyTable_ID]
           ,[Inserted]
           ,[LastUpdated]
           ,[LastUpdatedBy]
           ,[Vendor_ID]
           ,[FromLocation]
           ,[FromUnit]
           ,[FromAddress]
           ,[FromCity]
           ,[FromProvince]
           ,[FromContactNumber]
           ,[Comment])
    SELECT
        [AuditType] = 'U',
        D.*
    FROM
        deleted D
    JOIN    
        inserted I ON I.[ID] = D.[ID]

GO

Конечно, я получаю ошибку

Нельзя использовать столбцы text, ntext или image в таблицах "вставлено" и "удалено".

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

Как я могу сделать это и по-прежнему использовать текстовые столбцы?

2 ответа

Решение

Единственный способ сделать это - сохранить текущую строку в таблице истории. Сделайте то, что вы пробовали, и присоединитесь к фактической таблице и вставьте все столбцы из текущей фактической таблицы в таблицу истории.

у вас, вероятно, есть что-то вроде этого, где история имеет только предыдущую версию строки:

YourTable
ID  value1   value2
1   AAA      AAAA
2   BBB      BBBB
3   CCC      CCC3

YourTableHostory
HistoryID HistoryDate ID value1  value2
1         4/17/2010   2  CCC     CCCC
2         4/18/2010   2  CCC     CCC1

Я говорю сделать что-то вроде этого, где хранится каждая версия:

YourTable
ID  value1   value2
1   AAA      AAAA
2   BBB      BBBB
3   CCC      CCC3

YourTableHostory
HistoryID HistoryDate ID  value1  value2
1         4/10/2010   1   AAA      AAAA
2         4/10/2010   2   BBB      BBBB
3         4/10/2010   3   CCC      CCCC
4         4/17/2010   2   CCC      CCC1
5         4/18/2010   2   CCC      CCC2
5         4/19/2010   2   CCC      CCC3

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

Если вы просто добавляете этот триггер в существующую таблицу с данными в ней, запустите такой запрос, чтобы предварительно заполнить все текущие значения для вас:

INSERT INTO YourTableHostory
        (HistoryDate,ID,value1,value2)
    SELECT
        GETDATE(),ID,value1,value2
        FROM YourTable

Согласно SQL Server 2000 CREATE TRIGGER

В триггере DELETE, INSERT или UPDATE SQL Server не допускает ссылки на столбцы text, ntext или image во вставленных и удаленных таблицах, если уровень совместимости равен 70. Значения text, ntext и image во вставленных и удаленных таблицах. удаленные таблицы недоступны. Чтобы получить новое значение в триггере INSERT или UPDATE, объедините вставленную таблицу с исходной таблицей обновления. ...

Если уровень совместимости равен 80 или выше, SQL Server позволяет обновлять столбцы text, ntext или image через триггер INSTEAD OF для таблиц или представлений.

Так что, если я прочитал это правильно (и прошло много времени с тех пор, как я работал с 2000 года)

  • Можете ли вы использовать триггер INSTEAD OF?
  • Каков уровень совместимости?
Другие вопросы по тегам