我知道这个帖子: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列。
我还能尝试什么?
答案 0 :(得分:4)
你说
数据库使用Image数据类型,我无权更改它。
那么在那种情况下你不能这样做。不推荐使用image
。不允许访问image
/ inserted
表中的deleted
列。试图这样做会导致错误
不能在'inserted'中使用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