无法删除功能,因为它已被对象引用

时间:2018-09-07 14:01:45

标签: sql sql-server tsql

尝试删除一些用户定义函数时遇到此错误。

Msg 3729, Level 16, State 1, Line 13
Cannot DROP FUNCTION 'dbo.testfn2' because it is being referenced by object 'testtable2'.

Msg 3729, Level 16, State 1, Line 14
Cannot DROP FUNCTION 'dbo.testfn' because it is being referenced 
by object 'DF__testtable__idc__5CD6CB2B'.

此错误的一个原因是 一些列在其默认约束中使用了该功能。

我尝试删除所有默认约束。

但是除此之外还有其他原因。

还有其他可能性吗?

2 个答案:

答案 0 :(得分:4)

要显示依赖性,可以使用sp_depends过程:

exec sp_depends 'dbo.YourFunc'

或者,调用sys.dm_sql_referencing_entities表值函数:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.YourFunc','OBJECT')

答案 1 :(得分:0)

我的情况有两种情况。指定的功能由

使用
1. A Column for its default value
2. A Computed Column for its value calculation

案例1:

可以从sys.default_constraints中查看默认约束

 SELECT * FROM sys.default_constraints

我们可以删除默认约束

ALTER TABLE tableName DROP CONSTRAINT DF__tableName_ConstraintName

在删除此函数的所有用法作为默认约束之后,我们可以删除该函数

DROP FUNCTION schemaName.fnName 

案例2:

我们可以从sys.computed_columns中看到计算出的列

 SELECT * FROM sys.computed_columns 

出于我的目的,可以删除使用指定功能的计算列。

我们可以删除列

ALTER TABLE schema.tableName DROP COLUMN columnName

使用此函数删除所有计算出的列后,我们可以像之前一样删除它。