Как заставить использовать текстовые столбцы в триггере - PullRequest
1 голос
/ 19 апреля 2010

Я пытаюсь использовать триггер обновления в 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 ]

1 голос
/ 19 апреля 2010

В соответствии с SQL Server 2000 CREATE TRIGGER

УДАЛИТЬ, ВСТАВИТЬ или ОБНОВИТЬ триггер, SQL Server не позволяет столбец text, ntext или image ссылки во вставленном и удаленном таблицы, если уровень совместимости равно 70. Текст, ntext и значения изображения во вставленном и удаленные таблицы недоступны. к получить новое значение либо в ВСТАВИТЬ или ОБНОВИТЬ триггер, присоединиться к вставлена ​​таблица с оригиналом обновить таблицу. ...

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

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

  • Можно ли использовать триггер INSTEAD OF?
  • Какой уровень совместимости?
0 голосов
/ 19 апреля 2010

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

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

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
...