Как убедиться, что строка не может быть случайно удалена в SQL Server? - PullRequest
3 голосов
/ 16 сентября 2010

В моей базе данных есть определенные данные, которые важны для функционирования приложения (константы, ...).И у меня есть тестовые данные, которые генерируются путем тестирования сайта.Поскольку данные теста расходуются, они регулярно удаляются.К сожалению, два типа данных находятся в одной таблице, поэтому я не могу сделать delete from T, но мне нужно сделать delete from T where IsDev = 0.

Как я могу убедиться, что случайно не удаляюданные не-dev, забыв вставить фильтр? Если это произойдет, мне придется восстанавливаться из производственной резервной копии, которая тратит мое время.Я бы потребовал какой-то внешний ключ, например, поведение, которое не удаляется при выполнении определенного условия.Это также было бы полезно, чтобы мой код не делал ничего вредного из-за ошибки.

Ответы [ 7 ]

8 голосов
/ 16 сентября 2010

Ну, вы можете использовать триггер, который выдает исключение, если какая-либо из записей в мета-таблице deleted имеет IsDev = 1.

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 голосов
/ 16 сентября 2010

Я бы использовал триггер.

1 голос
/ 17 сентября 2010

Вы можете создать дополнительный столбец IS_TEST в своих таблицах, переименовать TABLE_NAME в TABLE_NAME_BAK и создать представление TABLE_NAME для TABLE_NAME_BAK, чтобы в нем отображались только строки, для которых был установлен IS_TEST.Установка IS_TEST в ноль для данных, которые вы хотите сохранить, и добавление DEFAULT 1 в столбец IS_TEST должно завершить работу.Это похоже на процедуру, необходимую для создания «мягких удалений».

1 голос
/ 17 сентября 2010

Я предлагаю вместо того, чтобы каждый раз писать оператор удаления с нуля, просто создать хранимую процедуру для удаления и выполнить ее.

create procedure ResetT as delete from T where IsDev = 0
1 голос
/ 17 сентября 2010

В зависимости от того, насколько прозрачным вы хотите это сделать, вы можете использовать триггер INSTEAD OF, который всегда будет помнить WHERE для вас.

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
1 голос
/ 16 сентября 2010

Похоже, вам нужен триггер для операции удаления, который будет смотреть на строку и транзакцию отката, если он обнаружит, что это строка, которую никогда не следует удалять.

Кроме того, вы можете прочитать эту статью: Предотвращение случайного обновления или удаления команд всех строк в таблице SQL Server

1 голос
/ 16 сентября 2010

сохранить резервную копию строк, которые вы хотите сохранить, в отдельной административной таблице

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...