更新特定列

时间:2012-06-06 11:29:21

标签: sql sql-server sql-server-2008 sql-server-2008-r2

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

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

2 个答案:

答案 0 :(得分: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来控制某些表的更新。

答案 1 :(得分:0)

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