代码之家  ›  专栏  ›  技术社区  ›  usr

如何确保不会在SQL Server中意外删除行?

  •  3
  • usr  · 技术社区  · 15 年前

    在我的数据库中,我有一些对应用程序的运行很重要的数据(常量,…)。我有测试数据,这些数据是通过测试站点生成的。由于测试数据是可消耗的,所以会定期删除它。不幸的是,这两种类型的数据出现在同一个表中,因此我无法执行 delete from T 但我必须做一个 delete from T where IsDev = 0 .

    如何确保我不会忘记放入过滤器而意外删除非开发人员数据? 如果发生这种情况,我必须从浪费时间的生产备份中恢复。我需要一些类似于外键的行为,当满足某个条件时,这些行为将导致删除失败。这对于确保我的代码不会因为bug而做任何有害的事情也很有用。

    7 回复  |  直到 15 年前
        1
  •  8
  •   harpo Binary Worrier    15 年前

    deleted

    CREATE TRIGGER TR_DEL_protect_constants ON MyTable FOR DELETE AS
    BEGIN
        IF EXISTS(SELECT 1 FROM deleted WHERE IsDev <> 0)
        BEGIN
            ROLLBACK
            RAISERROR('Can''t delete constants', 1, 16)
            RETURN
        END
    END
    

        2
  •  2
  •   codingguy3000    15 年前

        3
  •  1
  •   Beth    15 年前

        5
  •  1
  •   Joe Stefanelli    15 年前

    CREATE TRIGGER TR_IODEL_DevOnly ON YourTable
    INSTEAD OF DELETE
    AS
    BEGIN
        DELETE FROM t
            FROM Deleted d
                INNER JOIN YourTable t
                    ON d.PrimaryKey = t.PrimaryKey
            WHERE t.IsDev = 0
    END
    
        6
  •  1
  •   Jeffrey L Whitledge    15 年前

    我建议不要每次都从头开始编写DELETE语句,而是创建一个存储过程来执行删除操作。

    create procedure ResetT as delete from T where IsDev = 0
    
        7
  •  1
  •   Brian Hooper    15 年前

    您可以在表中创建一个额外的列is_test,将表\u name重命名为表\u bak,并在表\u name_bak上创建一个视图表\u name,以便只在其中显示设置了\u test的行。对于要保留的数据,将“测试”设置为零,并将默认值1添加到“测试”列将完成该作业。它类似于创建“软删除”所需的过程。

    推荐文章