さまざまなテーブル、ビュー、トリガを作成するSQL Server 2016データベースに対してスクリプトを実行しています。この同じスクリプトは、他の数十のサーバーに対して動作していますが、この特定のサーバーに対してエラーが発生しています。SQL Serverトリガレポートの「挿入された」テーブルが見つかりません
すべてのトリガーが作成されているようですが、無効なオブジェクトをチェックすると、すべてが無効であると報告されます。本当に奇妙な部分は、問題は「挿入された」テーブル(またはトリガに応じて「削除された」テーブル)が見つからないということです。
私はこのクエリを使用して無効なオブジェクトをチェックしています:
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
からもらいました基礎となる表。実際には何も特別なものはありません。
クエリに問題があり、オブジェクトが実際に無効ではない、またはデータベースに何か存在していますか?私はデータベースの所有者としてスクリプトを実行しているので、権限の問題ではないと思います。
おかげ
これらのタイプの検証クエリに問題が見つかりました。 'inserted'と' deleted'は実際のテーブルではなく仮想テーブルであるため、存在するかどうかを判断しようとするクエリは、 'inserted'テーブルがこの場合仮想テーブルであり、誰かが「挿入された」という名前の実際のテーブル。 –
しかし、この正確なクエリは、他のSQL 2016サーバ上でさえ、以前は問題にならなかったのはなぜですか? –
これは良い質問です。 Hmmm ....ローカルのSQL Serverインスタンスに対してこのSQLフラグメントを実行しましたが、「挿入されました。および 'deleted'は、検証される項目のリストには表示されません。この場合、2016年になぜそれが表示されますか? DBはカプセル化されていますか? * FROM sys.sql_expression_dependenciesを選択 LEFTが sys.objects \t type_desc BY O ON sed.referencing_id = o.object_id タイプ= 'TR' ORDER、 \t referenced_entity_name –