View
可以使用DROP VIEW
命令删除。DROP TABLE
如果桌子上有视图,是否有处理解决方案?
我试过了
DROP TABLE ORDER_TBL CASCADE;
现代DBMS中还有其他方法吗?
View
可以使用DROP VIEW
命令删除。DROP TABLE
如果桌子上有视图,是否有处理解决方案?
我试过了
DROP TABLE ORDER_TBL CASCADE;
现代DBMS中还有其他方法吗?
根据 MSDN 文档:
http://msdn.microsoft.com/en-us/library/ms173790.aspx
任何引用已删除表的视图或存储过程都必须使用 DROP VIEW 或 DROP PROCEDURE 显式删除。
换句话说,MSSQL 不会自动警告您,或为您删除视图。视图变得无效。
MSDN 继续:
要报告对表的依赖关系,请使用 sys.dm_sql_referencing_entities。
例如:
http://sqlserverdownanddirty.blogspot.com/2011/07/finding-object-dependancies-in-sql.html
SELECT referencing_schema_name, referencing_entity_name, is_schema_bound, [definition] FROM sys.dm_sql_referencing_entities ('mySchema.myTable', 'OBJECT') r INNER JOIN sys.sql_modules m ON r.referencing_id = m.object_id
如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看名为SQL Search的免费Red-Gate 工具,它会在您的整个数据库中搜索任何类型的字符串。
对于任何 DBA 或数据库开发人员来说,它都是一个很棒的必备工具——我是否已经提到它完全免费用于任何用途?
在删除表之前使用 SQL 搜索,您可以找出其他对象依赖于该表。您需要以某种方式处理这些问题 - 删除依赖项或删除这些对象以及您的表。
选项1:
如果您之前运行此脚本DROP TABLE
,它会列出在您的表上有引用的所有对象:
SELECT DISTINCT so.name,so.xtype
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%YOUR TABLE%'
如果您只想要视图,您可以通过过滤上述查询AND s.xtype='V'
。
选项 2:
您可以将WITH SCHEMABINDING添加到视图的定义中,这样您就不能删除基于表的表。