0

我知道这个线程:Comparing Image Data Types In SQL但它没有帮助

我正在尝试在 T-SQL (SQL Server 2008) 中编写一个触发器,该触发器将检查文章的图像是否已更改并在某个特殊表中报告它。数据库使用Image数据类型,我无权更改它。

我试过了:

ALTER TRIGGER PhotoUPDATE                               
ON ARTICLE                                      
FOR UPDATE          
AS              
DECLARE @ID numeric (18,0),@PHOTO_NEW image,@PHOTO_OLD image

SET @ID = (SELECT ID FROM inserted)
SET @PHOTO_NEW = (SELECT PHOTO FROM inserted)
SET @PHOTO_OLD = (SELECT PHOTO FROM deleted)

IF (@PHOTO_NEW<>@PHOTO_OLD)
BEGIN
 INSERT PhotoCHANGED (ID,DATE)
 VALUES(@ID,GETDATE())
END
GO

我得到错误:

text、ntext 和 image 数据类型对局部变量无效。

当我尝试不使用变量时:

IF ((SELECT PHOTO FROM inserted)<>(SELECT PHOTO FROM deleted))

我有:

不能在 'inserted' 和 'deleted' 表中使用 text、ntext 或 image 列。

我还能尝试什么?

4

1 回答 1

4

你说

数据库使用 Image 数据类型,我无权更改它。

那么在这种情况下你不能这样做。image已弃用。不允许访问/表image中的列。尝试这样做会导致错误inserteddeleted

不能在 'inserted' 和 'deleted' 表中使用 text、ntext 或 image 列。

可以通过查询基表来获取更新后的列值,但无法获取DELETED.PHOTO与之进行比较的值。

您需要让负责将列数据类型更改为varbinary(max).

ALTER TABLE ARTICLE ALTER COLUMN PHOTO VARBINARY(MAX) NOT NULL

然后您可以在触发器内部访问它并比较是否相等。

你的触发器也坏了。更新可以影响多行(或零行)。并不总是一个。

IF UPDATE(PHOTO)如果未触及该列,您还应该检查 是否跳过此操作。

ALTER TRIGGER PhotoUPDATE
ON ARTICLE
FOR UPDATE
AS
    SET NOCOUNT ON;

    IF UPDATE(PHOTO)
      BEGIN
          INSERT PhotoCHANGED
                 (ID,
                  DATE)
          SELECT I.ID,
                 GETDATE()
          FROM   inserted I
                 JOIN DELETED D
                   ON I.ID = D.ID
                      AND EXISTS (SELECT I.PHOTO
                                  EXCEPT
                                  SELECT D.PHOTO)
      END 
于 2013-11-14T12:50:48.997 回答