0

如何控制只更新表的特定列?

我的方法是:为这些表创建而不是更新触发器,并控制仅更新可更新列,如果更新,不可更新列引发错误并带有适当的消息。

4

2 回答 2

1

是的,您可以使用触发器来实现这一点,但不要使用INSTEAD OF触发器。您可以更好地使用FOR UPDATE触发器,因为您不必重写整个更新查询。您只想拒绝不允许的更新。如果允许执行某项操作,则不会引发错误,因此数据将照常更新。

例子:

CREATE TRIGGER [dbo].[CheckUpdate] ON [dbo].[MyTable] FOR UPDATE AS

DECLARE @EXPECTED INT = (SELECT COUNT(0) FROM INSERTED)
DECLARE @ALLOWED INT = (
   SELECT COUNT(0)
   FROM INSERTED i 
   INNER JOIN DELETED d 
   ON i.Id = d.Id
   WHERE i.Name = d.Name -- The readonly column
) 

IF(@EXPECTED <> @ALLOWED) -- True if there are not allowed records to updated
BEGIN
    -- Prevent the record will be updated
    RAISERROR ('Readonly columns cannot be changed',11, 1);
    ROLLBACK
END
--Do nothing in the ELSE because everything seems to be OK
--(the record will be updated)

您还可以使用Stored Procedures来控制某些表的更新。

于 2012-06-06T11:32:55.060 回答
0

如果您想限制对数据库的更新,您通常会为更新和插入创建存储过程,并且只使用存储过程而不是表更新来更新数据。

于 2012-06-06T11:32:02.880 回答