郁闷了,IMAGE的触发器,用instead of后无法插入数据,只能记录
我的触发器如下:
CREATE   TRIGGER Detaineephoto_InsAndUpdAndDel ON Detaineephoto instead of  Insert,update,delete
AS
declare @type int 
declare @mk   bigint
declare @pkey varchar(128)
declare @FK nvarchar(128)
declare @sql nvarchar(4000)
declare @Tabname nvarchar(128)
set @Tabname='DetaineePhoto'
SELECT @pkey=COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME=+@Tabname
--insert
IF EXISTS (SELECT TOP 1 * FROM Inserted) AND NOT EXISTS (SELECT TOP 1 * FROM Deleted)
begin
select * into #t1 from inserted
set @type=1
set @sql='Select @fk='+@pkey+' from #t1'  
     exec sp_executesql @sql,N'@fk varchar(128) output',@fk  
     output
end
--update
IF EXISTS (SELECT TOP 1 * FROM Inserted) AND EXISTS (SELECT TOP 1 * FROM Deleted)
begin
select * into #t2 from inserted
  set @type=2
  set @sql='Select @fk='+@pkey+' from #t2'  
     exec sp_executesql @sql,N'@fk varchar(128) output',@fk  
     output
end
--delete
IF NOT EXISTS (SELECT TOP 1 * FROM Inserted) AND EXISTS (SELECT TOP 1 * FROM Deleted)
begin
select * into #t3 from Deleted
  set @type=3
  set @sql='Select @fk='+@pkey+' from #t3'  
     exec sp_executesql @sql,N'@fk varchar(128) output',@fk  
     output
end
insert UpdateNode(TableName,NoteId1,Type,re) values(@Tabname,@fk,@type,'')//想实现的功能很简单,当此表修改新增纪录时纪录其字段名和表名
只有84分,全抛了,呵呵

解决方案 »

  1.   

    参照text触发器CREATE TABLE TC ( [Code] [varchar] (50) NOT NULL , [U_Name] [varchar] (50) NULL , [U_Text] [text] NULL )
    ALTER TABLE [TC] WITH NOCHECK ADD CONSTRAINT [PK_TC] PRIMARY KEY NONCLUSTERED ( [Code] )
    goCREATE TABLE [TD] ([ID] [int] IDENTITY (1, 1) NOT NULL , [U_Text] [text] NULL )
    ALTER TABLE [TD] WITH NOCHECK ADD CONSTRAINT [PK_TD] PRIMARY KEY NONCLUSTERED ( [ID] )
    go
    CREATE TRIGGER TC_Update ON [dbo].[TC]
    instead of update -- 只能在这类触发器中使用 text列
    AS
    delete a from tc a, deleted d where a.[Code]=d.[Code]
    insert tc select * from insertedinsert td (u_text)
    select u_text from inserted
    goINSERT [TC] ( [Code] , [U_Name] , [U_Text] ) VALUES ( '1' , 'a' , 'aaaa' )
    INSERT [TC] ( [Code] , [U_Name] , [U_Text] ) VALUES ( '2' , 'b' , 'bbb' )update tc set u_name='d' where u_name='b'select * from tc
    select * from tddrop trigger TC_Update
    drop table TC,TD
      

  2.   

    instead of update -- 只能在这类触发器中使用 text列表中有IMAGE类型,是否可以这样操作
      

  3.   


       在 INSTEAD OF 触发器中使用 text、ntext 和 image 数据
    数据修改可能包含 text、ntext 和 image 列。在基表中,存储于 text、ntext 或 image 列的值是指向容纳数据的页的文本指针。有关更多信息,请参见 text、ntext 和 image 数据。    虽然 AFTER 触发器不支持 inserted 和 deleted 表中的 text、ntext 或 image 数据,而 INSTEAD OF 触发器却支持。text、ntext 和 image 数据存储在 inserted 表和 deleted 表中,与数据存储在基表中的方法不同。text、ntext 和 image 数据不以单独的页链形式存储。相反,它们在每行内以连续字符串形式存储,这意味着在 inserted 和 deleted 表中 text、ntext 或 image 列内没有文本指针。TEXTPTR 和 TEXTVALID 函数以及 READTEXT、UPDATETEXT 和 WRITETEXT 语句对 inserted 或 deleted 表中的 text、ntext 或 image 列无效。支持 text、ntext 或 image 列的所有其它用途,如在选择列表、WHERE 子句搜索条件或者 SUBSTRING、PATINDEX 或 CHARINDEX 函数中引用它们。INSTEAD OF 触发器中的对 text、ntext 或 image 数据的操作受当前 SET TEXTSIZE 选项的影响,可使用 @@TEXTSIZE 函数确定该选项。
    存储在 inserted 和 deleted 表中的 text、ntext 或 image 数据类型因触发操作(INSERT、UPDATE 或 DELETE)而异:
         对于 INSERT 语句,inserted 表包含 text、ntext 或 image 列的新值。而 deleted 表没有行。
         对于 DELETE 语句,inserted 表没有行,并且 deleted 表行包含 DELETE 启动前 text、ntext 或 image 列所具有的值。
         对于不更改 text、ntext 或 image 值的 UPDATE 语句,inserted 和 deleted 表行都包含与 text、ntext 或 image 列相同的值。
         对于更改 text、ntext 或 image 值的 UPDATE 语句,deleted 表包含 UPDATE 启动前存在的数据值,并且 inserted 表包含 SET 子句中指定的已进行任何修改的数据。
    如果 INSERT、UPDATE 或 DELETE 语句使用较大的 text、ntext 或 image 值修改许多行,则需要相当大的内存来容纳 inserted 和 deleted 表中的 text、ntext 或 image 数据复本。复制这些大量的数据还会降低性能。只要有可能,引用具有 INSTEAD OF 触发器的视图或表的 INSERT、UPDATE 和 DELETE 语句应一次修改一行或一次只修改几行。
      

  4.   

    比如表:photo中有 id,image两个字段
    当有数据插入或修改时记录到 tig表中
    case
    1为insert
    2为edittig则对应纪录
    操作类型及id即可