Вопрос

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

 ALTER TRIGGER [Globalization].[CountriesTracker] 
 ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
 BEGIN
SET NOCOUNT ON;
IF ((Select COUNT(*) from [Deleted]
     Where [Deleted].[CountryId] = '36bd1536-fb56-4ec4-957e-1b3afde16c56') = 1)
BEGIN       
    RAISERROR('You can not delete this specific record!', 0, 0)
    ROLLBACK TRANSACTION
    RETURN
END
END

Как я могу убедиться, что строки, не соответствующие вышеуказанному условию, не удаляются, как и ожидалось?

Это было полезно?

Решение

У вас есть вместо триггера, поэтому вам нужен фактический удаление в нем.

Я также рассмотрел просто фильтрацию защищенного ряд, потому что:

  • Вам нужна бросание ошибок? Или молча игнорировать?
  • Как насчет мультирянных удалений, которые содержат защищенный строк: прервать целое или удалить остальные?

Что-то типа:

ALTER TRIGGER [Globalization].[CountriesTracker]  ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
SET NOCOUNT ON;

DELETE
   CT
FROM
   [Globalization].[Countries] C
   JOIN
   DELETED D ON C.CountryId = D.CountryId
WHERE
    [Deleted].[CountryId] <> '36bd1536-fb56-4ec4-957e-1b3afde16c56'
 GO

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top