SQL Server触发器报告'inserted'表丢失

时间:2016-12-13 21:38:20

标签: sql-server

我正在针对SQL Server 2016数据库运行脚本,该数据库创建了各种表,视图和触发器。这个相同的脚本一直在对抗许多其他服务器,但是它对这个特定的服务器出错了。

似乎创建了所有触发器但是当我检查无效对象时,它会将所有触发器报告为无效。真正奇怪的是,它说问题是“插入”表(或“删除”表,取决于触发器)缺失。

我正在使用此查询检查无效对象:

SELECT 
    QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' 
        + QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
    o.type_desc,
    ISNULL(QuoteName(referenced_server_name) + '.', '')
    + ISNULL(QuoteName(referenced_database_name) + '.', '')
    + ISNULL(QuoteName(referenced_schema_name) + '.', '')
    + QuoteName(referenced_entity_name) AS MissingReferencedObject
FROM
    sys.sql_expression_dependencies sed
LEFT JOIN 
    sys.objects o ON sed.referencing_id = o.object_id
WHERE
    (is_ambiguous = 0)
    AND (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
    + ISNULL(QuoteName(referenced_database_name) + '.', '')
    + ISNULL(QuoteName(referenced_schema_name) + '.', '')
    + QuoteName(referenced_entity_name)) IS NULL)
ORDER BY
    ProblemObject,
    MissingReferencedObject

我从这里得到的

Find broken objects in SQL Server

触发器是针对视图的“而不是”触发器,然后修改基础表。其中任何一个都没什么特别的。

我的查询是否有问题,对象实际上并不是无效或数据库中有什么内容?我正在以脚本作为数据库所有者运行,因此我认为这不是权限问题。

由于

1 个答案:

答案 0 :(得分:0)

针对问题SQL Server运行此查询,并针对未显示问题的问题运行此问题:

SELECT *
FROM
    sys.sql_expression_dependencies sed
LEFT JOIN 
    sys.objects o ON sed.referencing_id = o.object_id
WHERE type = 'TR'
ORDER BY 
    type_desc,
    referenced_entity_name

如果插入/删除的表显示在一个列表中而不显示在另一个列表中,则会产生一些差异。我要检查标识符引用规则。