2016-12-13 5 views
2

さまざまなテーブル、ビュー、トリガを作成する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

からもらいました基礎となる表。実際には何も特別なものはありません。

クエリに問題があり、オブジェクトが実際に無効ではない、またはデータベースに何か存在していますか?私はデータベースの所有者としてスクリプトを実行しているので、権限の問題ではないと思います。

おかげ

+1

これらのタイプの検証クエリに問題が見つかりました。 'inserted'と' deleted'は実際のテーブルではなく仮想テーブルであるため、存在するかどうかを判断しようとするクエリは、 'inserted'テーブルがこの場合仮想テーブルであり、誰かが「挿入された」という名前の実際のテーブル。 –

+0

しかし、この正確なクエリは、他のSQL 2016サーバ上でさえ、以前は問題にならなかったのはなぜですか? –

+0

これは良い質問です。 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 –

答えて

0

を実行し、問題のSQL Serverに対して、そして何の問題が示されていない1に対して、このクエリ:

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 

挿入/削除されたテーブルは、他の1つのリストに表示さではない場合は、これにはいくつかの違いがあります。私は識別子の引用ルールをチェックして起動します。

+0

挿入され削除されたものが問題データベースに表示されますが、他のものでは表示されませんが、その理由がわかりません。すべてのデータベースプロパティ(Auto Close以外)は同じです。 –

+0

これはMicrosoftの質問になると思います。 1つのトリガーを手動で削除して再作成し、それがまだ表示されているかどうかを確認し、挿入して削除したものが一時テーブルと見なされ、「依存情報[sysで表示されます。sql_expression_dependencies]は、ルール、デフォルト、一時テーブル、一時ストアドプロシージャ、またはシステムオブジェクトに対して作成または維持されません。 –

関連する問題