如何检查是否存在使用某个表的视图

3

在SQL Server Management Studio中,是否可以通过检查视图所在的数据库或其他数据库来确定表是否属于视图?

如果可以通过某些插件实现,那也可以。

3个回答

5

像这样:

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也允许延迟解析。


2
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_dependsINFORMATION_SCHEMAsysdepends 等都容易失去同步。更多信息请参见:

以下是一个快速的示例:

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的习惯(或尽可能避免使用视图)。当然,如果您需要以不影响视图的方式更改表,则这可能会变得麻烦,但应该认真考虑表格更改。


1

对于同一个数据库,您可以检查该表的依赖关系并查看使用它的其他对象。

EXEC sp_depends @objname = N'your_table_name' ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接