我正在针对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
触发器是针对视图的“而不是”触发器,然后修改基础表。其中任何一个都没什么特别的。
我的查询是否有问题,对象实际上并不是无效或数据库中有什么内容?我正在以脚本作为数据库所有者运行,因此我认为这不是权限问题。
由于
答案 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
如果插入/删除的表显示在一个列表中而不显示在另一个列表中,则会产生一些差异。我要检查标识符引用规则。