是否可以使用 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'
应该适用于任何符合 ISO SQL 的数据库,而不仅仅是 SQL Server。
请注意,跨数据库依赖是另一回事。理论上,它们应该出现在这里,但实际上这可能不一致,因为 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' ;