如何控制只更新表格的特定列?
我的方法是:为这些表创建而不是更新触发器,并控制仅更新可更新列,如果更新,则使用适当的消息更新不可更新列引发错误。
答案 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)
如果要限制对数据库的更新,通常会创建更新和插入的存储过程,并且只使用存储过程而不是表更新来更新数据。