2012-06-06 51 views
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控制某些表的更新。

+0

爲什麼'FOR UPDATE'比'INSTEAD OF'更好? –

+0

我改變了我的答案。它解釋了爲什麼;) – hwcverwe

+0

我不想甚至管理員誤從SQL Server Management Studio更新不可更新的列。 –

0

如果要限制對數據庫的更新,通常會創建更新和插入的存儲過程,並僅使用存儲過程,而不使用表更新來更新數據。

+0

我不想甚至管理員錯誤地更新SQL Server Management Studio中的不可更新列。 –

+0

@mehdilotfi觸發器也會在您使用MSSMS時觸發,因此沒有人可以在不避開存儲過程的情況下更新不可更新的列。在這種情況下,使用觸發器更安全。爲了避免觸發器,用戶必須首先禁用/刪除觸發器。 – hwcverwe

+0

禁用觸發器是有意識的。但可能會忘記使用存儲過程進行更新。 –