【问题标题】:SQL Exception Thrown when creating a trigger创建触发器时抛出 SQL 异常
【发布时间】:2020-06-07 22:02:05
【问题描述】:

我有 2 个表格,“TableA”和“TableB”设置如下。

表 A

+----------+------+----------------+ |流ID |姓名 |其他栏目 | +----------+------+----------------+

表 B

+----+--------------+------------+---- --------+ |身份证 |文件流ID |附加文件流ID |添加日期 | +----+--------------+------------+---- --------+

表 A 中的 FileStreamID 和 AdditionalFileStreamID 都是表 B 中 StreamID 列的外键约束。我尝试在两列上设置约束,以便在删除表 A 中的行时,两列都设置为 NULL ,但是出现“多级联路径”异常(以下类似问题):

2 foreign key to the same table may cause cycles or multiple cascade paths

相反,我尝试创建以下触发器来处理它:

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".

有人知道为什么会这样吗?

【问题讨论】:

  • 那个错误不是来自那个触发器。这表明您还有其他触发器,或者您没有向我们展示的其他 SQL。
  • 这有点清楚了。我会看一下表格,看看我是否能找到解决方案。感谢您的指导!
  • 我想我找到了问题所在。我的 TableA 是一个 SQL 文件表,有一个名为“file_type”的列。这是一个带有计算文本“(getfileextension([name]))”的计算列。
  • 看起来文件表不支持“INSTEAD OF”触发器。我可能不得不找到一种不同的方式来实现这一点。干杯! docs.microsoft.com/en-us/sql/relational-databases/blob/…

标签: sql-server tsql database-trigger


【解决方案1】:

我的 TableA 是文件表,文件表不支持“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

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2014-01-20
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多