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