У меня есть поле "InsertTime" в таблице в базе данных SQL Server 2005, которая принята значение по умолчанию к "getDate ()", когда запись сначала вставляется в базу данных. Я хочу удостовериться, что этот столбец не обновляется снова.
Этот столбец может быть установлен на только для чтения или является там лучшим способом сделать это, не пишущий все sql для разработчиков?
Запишите сохраненную процедуру обновления в эту таблицу и убедитесь, что она не коснется поля InsertTime. Затем установите все права пользователей так, чтобы они сами не могли делать необработанные Update в этой таблице, но могли вызвать сохраненную процедуру.
Вы можете реализовать поле «только для чтения», создавая триггер обновления, который проверяет наличие обновлений на этот столбец, а затем возвращает их обратно.
IF EXISTS (SELECT name FROM sys.objects
WHERE name = 'ReadOnlyInsertTime_tr' AND type = 'TR')
DROP TRIGGER dbo.ReadOnlyInsertTime_tr;
GO
CREATE TRIGGER ReadOnlyInsertTime_tr
ON dbo.MyTable
AFTER UPDATE
AS
IF (UPDATE(InsertTime))
BEGIN
ROLLBACK
-- Raise an informative error
-- RAISERROR (50009, 16, 10)
END;
GO
Вместо триггера также может выполнять эту работу.
CREATE TRIGGER [dbo].[MyTableUpdateTrigger]
ON [dbo].[MyTable]
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON
UPDATE MyTable
SET Column1 = Inserted.Column1
,Column2 = Inserted.Column2
-- Don't set this for the "InsertTime" field.
FROM Inserted
INNER JOIN MyTable
ON Inserted.TheKey = MyTable.TheKey
END