Как заставить использовать текстовые столбцы в триггере
Я пытаюсь использовать триггер обновления в 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?
- Каков уровень совместимости?