SQL Server Management Studioを使用して、テーブルが同じデータベースまたは異なるデータベースのビューの一部であるかどうかを確認することはできますか?
いくつかのプラグインを介してそれを行うことができれば、それも問題ありません。
SQL Server Management Studioを使用して、テーブルが同じデータベースまたは異なるデータベースのビューの一部であるかどうかを確認することはできますか?
いくつかのプラグインを介してそれを行うことができれば、それも問題ありません。
このような:
SELECT *
FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
WHERE TABLE_SCHEMA = 'dbo' --(or whatever your Schema name is)
AND TABLE_NAME = 'YourTableName'
SQL Serverだけでなく、ISOSQL準拠のデータベースで動作する必要があります。
データベース間の依存関係は別の問題であることに注意してください。理論的にはここに表示されますが、実際には、SQL Serverでは、データベース間の参照に関しては、ビューに対しても遅延解決が許可されているため、これは一貫性がない可能性があります。
SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
+ '.' + QUOTENAME(OBJECT_NAME([object_id]))
FROM sys.sql_dependencies
WHERE referenced_major_id = OBJECT_ID(N'dbo.your_table_name');
または:
SELECT referencing_schema_name, referencing_entity_name
FROM sys.dm_sql_referencing_entities(N'dbo.your_table_name', N'OBJECT');
ただし、、などを含むこれらのメソッドの一部はすべて同期が外れる傾向があることに注意しsp_depends
てくださいINFORMATION_SCHEMA
。sysdepends
詳細はこちら:
簡単な例:
CREATE TABLE dbo.table1(id INT);
GO
CREATE VIEW dbo.view1
AS
SELECT id FROM dbo.table1;
GO
SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
+ '.' + QUOTENAME(OBJECT_NAME([object_id]))
FROM sys.sql_dependencies
WHERE referenced_major_id = OBJECT_ID('dbo.table1');
-- returns 1 row
GO
DROP TABLE dbo.table1;
GO
CREATE TABLE dbo.table1(id INT);
GO
SELECT QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
+ '.' + QUOTENAME(OBJECT_NAME([object_id]))
FROM sys.sql_dependencies
WHERE referenced_major_id = OBJECT_ID('dbo.table1');
-- returns 0 rows!!!!
以下を実行すると、再び行が返されます。
EXEC sp_refreshsqlmodule N'dbo.view1';
しかし、メタデータをチェックするたびに、システム内のすべてのビューを更新したいのは誰ですか?
したがって、この方法を、すべてのビューのテキストのブルートフォース解析と組み合わせることができます。
SELECT name FROM sys.views
WHERE OBJECT_DEFINITION([object_id])
LIKE N'%your_table_name%';
これは、テーブルの名前によっては誤検知が発生する可能性がありますが、おそらく適切なクロスチェックです。
この種の問題を回避するために、私は自分のビューを作成する習慣を身につけようとしましたWITH SCHEMABINDING
(または、ビューをできるだけ避けるようにしました)。確かに、ビューに影響を与えない方法でテーブルを変更する必要がある場合、それは苦痛になる可能性がありますが、とにかくテーブルの変更は真剣に受け止められる必要があります。
同じデータベースについて、そのテーブルの依存関係をチェックし、他のオブジェクトがそれを使用していることを確認できます。
EXEC sp_depends @objname = N'your_table_name' ;