SQL Исключение выдается при создании триггера - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть 2 таблицы, настройки «TableA» и «TableB», как показано ниже.

Таблица A

+----------+------+---------------+
| StreamID | Name | Other Columns |
+----------+------+---------------+

Таблица B

+----+--------------+------------------------+-----------+
| ID | FileStreamID | AdditionalFileStreamID | DateAdded |
+----+--------------+------------------------+-----------+

И FileStreamID, и AdditionalFileStreamID в таблице A являются ограничениями внешнего ключа для столбца StreamID в таблице B. Я попытался установить ограничение для обоих столбцов, чтобы при удалении строки в таблице A для обоих столбцов установлено значение NULL, однако получено исключение «несколько каскадных путей» (аналогичная проблема ниже):

2 внешний ключ к одной и той же таблице может вызвать циклы или несколько каскадных путей

Вместо этого я попытался создать следующий триггер для его обработки:

CREATE TRIGGER dbo.File_Deletion_Trigger
    ON dbo.TableA
    INSTEAD OF DELETE
AS BEGIN
    UPDATE dbo.TableB
    SET FileStreamID = NULL
    WHERE FileStreamID IN (SELECT d.StreamID FROM deleted d)

    UPDATE dbo.TableB
    SET ScheduleStreamID = NULL
    WHERE AdditionalFileStreamID IN (SELECT d.StreamID FROM deleted d)

    DELETE FROM  dbo.TableA
    WHERE   StreamID IN (SELECT d.StreamID FROM deleted d)
END
GO

При попытке создать триггер я получаю следующее исключение:

Msg 195, Level 15, State 10, Procedure TableA, Line 1 [Batch Start Line 0]
'getfileextension' is not a recognized built-in function name.
Msg 474, Level 16, State 0, Procedure File_Deletion_Trigger, Line 6 [Batch Start Line 0]
Unable to load the computed column definitions for table "deleted".

Кто-нибудь знаете, почему это может происходить?

1 Ответ

0 голосов
/ 24 февраля 2020

Моя таблица A является файловой таблицей, а файловые таблицы не поддерживают триггеры «INSTEAD OF».

Поэтому я изменил свой триггер на следующий, и, похоже, он работает:

CREATE TRIGGER dbo.File_Deletion_Trigger
    ON dbo.TableA
    FOR DELETE
AS BEGIN
    UPDATE dbo.TableB
    SET FileStreamID = NULL
    WHERE FileStreamID IN (SELECT d.StreamID FROM deleted d);

    UPDATE dbo.TableB
    SET AdditionalFileStreamID = NULL
    WHERE AdditionalFileStreamID IN (SELECT d.StreamID FROM deleted d);
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...