我收到错误“无法在‘插入’和‘删除’表中使用 text、ntext 或 image 列”,因为原始表中有 ntext 字段,我已附加触发器。
这是一个解决方案:http://lazycodeprogrammer.blogspot.com/2009/08/how-to-use-inserteddeleted-with.html
但是原始(未修改的)查询足够复杂。我应该写什么来代替 SELECT * FROM INSERTED,按照建议使用 JOIN 运算符?
真正的问题是您试图在插入的表中选择 ntext、text 或 image 类型的列。这在触发器中是不允许的。
真正的解决方案是将所有 ntext 更改为 nvarchar(max),将文本更改为 varchar(max),将图像更改为 varbinary(max),按照 MS 的建议。
MS 声明这些类型已弃用,并将在未来版本中删除。
此外,ntext 的性能确实很慢,因为没有行内数据。
找到了一个很好的解决方案:
使用“INSTEAD OF”触发器可能会解决问题,因为“inserted”和“deleted”表中的text、ntext和image字段都可用。 查看 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=148387 了解如何完成。
在
yourtable
上插入后使用以下触发器:
SELECT textfields
FROM yourtable
WHERE EXISTS (
SELECT 1
FROM {inserted/deleted}
WHERE {inserted/deleted}.PK = {yourtable}.PK
)
通过此联接,您将可以从主表访问触发器中所需的所有字段,并且不会受到任何限制。
CREATE OR ALTER TRIGGER [dbo].[tr_Insert]
ON [dbo].[T_Your_Table]
AFTER INSERT
AS
BEGIN
insert into
T_Your_Log_Table
(field1,field2)
select
I.field1
,Y.field2 -- type text
FROM
Inserted I join
T_Your_Table Y on I.Primary_Filed = Y.Primary_Filed