テーブルの特定の列のみが更新されるように制御するにはどうすればよいですか?
私の方法は次のとおりです。これらのテーブルの更新トリガーの代わりに作成し、更新可能な列のみを更新するように制御し、更新された場合、更新不可能な列は適切なメッセージでエラーを発生させます。
テーブルの特定の列のみが更新されるように制御するにはどうすればよいですか?
私の方法は次のとおりです。これらのテーブルの更新トリガーの代わりに作成し、更新可能な列のみを更新するように制御し、更新された場合、更新不可能な列は適切なメッセージでエラーを発生させます。
はい、トリガーを使用してそれを達成できますが、トリガーを使用しないでください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
を使用して、特定のテーブルの更新を制御することもできます。
データベースへの更新を制限する場合は、通常、更新および挿入用のストアド プロシージャを作成し、ストア プロシージャのみを使用してデータを更新します。テーブルの更新は使用しません。