You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置SQL Server表的Created/Edited列仅允许数据库内部修改?

禁止外部编辑Created/Edited列,仅允许SQL Server自动更新的方案

针对你的需求,要让Created和Edited列只能由数据库通过默认值、触发器自动维护,禁止外部手动修改,可以通过列级权限控制+触发器验证的组合方案实现:

一、列级权限控制:撤销用户对目标列的修改权限

直接从权限层面限制普通用户无法对Created和Edited列执行INSERT、UPDATE操作,确保用户只能依赖默认值和触发器来维护这两个列。

针对指定用户

-- 撤销指定用户对Created、Edited列的插入/更新权限
REVOKE INSERT (Created, Edited), UPDATE (Created, Edited) ON Vragen TO [你的用户名];

针对所有用户(PUBLIC角色)

如果要限制所有访问该表的用户,可对PUBLIC角色执行撤销:

REVOKE INSERT (Created, Edited), UPDATE (Created, Edited) ON Vragen TO PUBLIC;

执行后,用户在插入数据时无需指定Created和Edited(会自动使用默认值GETDATE()),也无法在更新语句中修改这两个列。

二、触发器验证:防止高权限用户绕过权限限制

如果存在拥有表全权限的用户(比如管理员),可以通过触发器进一步拦截手动修改Created/Edited的操作,确保无论权限高低都无法篡改这两个列。

1. 拦截手动指定Created/Edited的插入操作

创建INSTEAD OF INSERT触发器,检查插入语句是否手动设置了Created或Edited,如果是则抛出错误并终止插入:

CREATE TRIGGER trg_Vragen_PreventInsertCreatedEdited
ON Vragen
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;

    -- 检查是否有人手动指定了Created或Edited的值
    IF EXISTS (SELECT 1 FROM inserted WHERE Created IS NOT NULL OR Edited IS NOT NULL)
    BEGIN
        RAISERROR('禁止手动设置Created或Edited列的值,请依赖默认值', 16, 1);
        RETURN;
    END

    -- 执行合法插入,仅插入允许的列
    INSERT INTO Vragen (Tekstvraag, Active)
    SELECT Tekstvraag, Active FROM inserted;
END
GO

2. 拦截手动修改Created/Edited的更新操作

修改你已有的UPDATE触发器,增加对Created列修改的检查,以及对Edited列手动篡改的检查:

ALTER TRIGGER update_vragen_trigger
ON Vragen
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    -- 禁止手动修改Created列
    IF UPDATE(Created)
    BEGIN
        RAISERROR('禁止手动修改Created列,该值由数据库自动维护', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN;
    END

    -- 禁止手动修改Edited列(仅允许触发器自动更新)
    IF EXISTS (
        SELECT 1 
        FROM inserted i
        JOIN deleted d ON i.VraagID = d.VraagID
        WHERE i.Edited <> d.Edited
    )
    BEGIN
        RAISERROR('禁止手动修改Edited列,该值由数据库自动维护', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN;
    END

    -- 自动更新Edited为当前时间
    UPDATE Vragen 
    SET Edited = GETDATE() 
    FROM Vragen 
    WHERE VraagID IN (SELECT VraagID FROM inserted);
END
GO

三、方案说明

  • 列级权限是基础防护,适合普通用户场景;
  • 触发器是兜底防护,避免高权限用户误操作或恶意篡改;
  • 两种方案结合使用,能最大化确保Created和Edited列的准确性和不可篡改性。

内容的提问来源于stack exchange,提问作者Tim098b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:15:32