I am trying to use an update trigger in SQL Server 2000 so that when an update occurs, I insert a row into a history table, so I retain all history on a table:
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
Of course, I get an error
Cannot use text, ntext, or image columns in the 'inserted' and 'deleted' tables.
I tried joining to MyTable
instead of deleted, but because the insert trigger fires after the insert, it ends up inserting the new record into the history table, when I want the original record.
How can I do this and still use text columns?
the only way to do this is keep the current row in the history table too. Do what you tried and join to the actual table, and insert all columns from current actual table into the history table.
you probably have something like this, where the history only has the previous version of a row:
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
I'm saying do something like this, where every version is stored:
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
this way whenever there is an insert or update, just insert the current row into the history table, you have a duplicate of the current row, but that isn't that terrible.
If you are just adding this trigger to an existing table with data in it, then run a query like this to prepopulate all the current values for you:
INSERT INTO YourTableHostory
(HistoryDate,ID,value1,value2)
SELECT
GETDATE(),ID,value1,value2
FROM YourTable
According to SQL Server 2000 CREATE TRIGGER
In a DELETE, INSERT, or UPDATE
trigger, SQL Server does not allow
text, ntext, or image column
references in the inserted and deleted
tables if the compatibility level is
equal to 70. The text, ntext, and
image values in the inserted and
deleted tables cannot be accessed. To
retrieve the new value in either an
INSERT or UPDATE trigger, join the
inserted table with the original
update table. ...
If the compatibility level is 80 or
higher, SQL Server allows the update
of text, ntext, or image columns
through the INSTEAD OF trigger on
tables or views.
So, if I've read this correctly (and it's been some time since I worked with '2000)
- Can you use an INSTEAD OF trigger?
- What is the compatibility level?