none
删除自定义函数却报错了? RRS feed

  • 问题

  • 以前是使用sql2000,自定义函数,调用,删除操作都很流畅。现在改用了sql2005后,问题来了,要删除自定义的函数删不了:消息 3729,级别 16,状态 1,第 1 行
    无法对 'dbo.f_GetId' 执行 DROP FUNCTION,因为对象 'DF__tb__id__7834CCDD' 正引用它。

    修改也要报错:消息 3729,级别 16,状态 3,过程 f_GetId,第 5 行
    无法对 'dbo.f_GetId 执行 ALTER,因为对象 'DF__tb__id__7834CCDD' 正引用它。

    这是什么问题,为什么强加这个限制?貌似创建时也没加什么约束啊?请教如何处理?

    2010年7月7日 5:54

答案

  • 查找指定函数的依赖项

    以下示例返回指定函数的依赖项。运行以下查询之前,请使用有效名称替换 <database_name><schema_name.function_name>

    USE <database_name>;
    GO
    SELECT OBJECT_NAME(object_id) AS referencing_object_name
        ,COALESCE(COL_NAME(object_id, column_id), '(n/a)') AS referencing_column_name
        ,*
    FROM sys.sql_dependencies
    WHERE referenced_major_id = OBJECT_ID('<schema_name.function_name>')
    ORDER BY OBJECT_NAME(object_id), COL_NAME(object_id, column_id);
    GO

     

     


    ===用该语句查询有一条记录。但是有两个问题不明白,请教,能否解释一下呢,谢谢:

    1、直接在函数名称上,鼠标右键,查看依赖关系,为什么没有查到?和写语句查询有何区别?

    2、如何删除依赖?


    先执行 这个代码

    SELECT distinct OBJECT_NAME(referenced_major_id) AS referenced_object_name
    FROM sys.sql_dependencies
    WHERE object_id = OBJECT_ID('dbo.f_GetIdf')
    GO

    找到函数中被引用的表的名字

    然后根据

    无法对 'dbo.f_GetId' 执行 DROP FUNCTION,因为对象 'DF__tb__id__7834CCDD' 正引用它。

    这个 提示 知道了表上的约束名

    然后执行

    alter table [上面第一步找出的表名] drop constraint DF__tb__id__7834CCDD
    
    2010年7月8日 6:51

全部回复

  • 应该是你在其他的地方使用的这个自定义函数

    比如你建表的时候某个字段默认值使用了这个函数,或者视图里面使用了。

    你需要把使用的地方都去删除了,才能删除这个函数。

    以前2000不检查依赖,2005开始检查,这个应该是好的,否则这种删除会导致其他问题。


    family as water
    2010年7月7日 8:11
  • 应该是你在其他的地方使用的这个自定义函数

    比如你建表的时候某个字段默认值使用了这个函数,或者视图里面使用了。

    你需要把使用的地方都去删除了,才能删除这个函数。

    以前2000不检查依赖,2005开始检查,这个应该是好的,否则这种删除会导致其他问题。


    family as water

    我检查了该函数的依赖关系,没有查到哪里有引用。
    2010年7月7日 9:08
  • 查找指定函数的依赖项

    以下示例返回指定函数的依赖项。运行以下查询之前,请使用有效名称替换 <database_name><schema_name.function_name>

    USE <database_name>;
    GO
    SELECT OBJECT_NAME(object_id) AS referencing_object_name
        ,COALESCE(COL_NAME(object_id, column_id), '(n/a)') AS referencing_column_name
        ,*
    FROM sys.sql_dependencies
    WHERE referenced_major_id = OBJECT_ID('<schema_name.function_name>')
    ORDER BY OBJECT_NAME(object_id), COL_NAME(object_id, column_id);
    GO

     

     

    2010年7月7日 12:23
  • 查找指定函数的依赖项

    以下示例返回指定函数的依赖项。运行以下查询之前,请使用有效名称替换 <database_name><schema_name.function_name>

    USE <database_name>;
    GO
    SELECT OBJECT_NAME(object_id) AS referencing_object_name
        ,COALESCE(COL_NAME(object_id, column_id), '(n/a)') AS referencing_column_name
        ,*
    FROM sys.sql_dependencies
    WHERE referenced_major_id = OBJECT_ID('<schema_name.function_name>')
    ORDER BY OBJECT_NAME(object_id), COL_NAME(object_id, column_id);
    GO

     

     


    ===用该语句查询有一条记录。但是有两个问题不明白,请教,能否解释一下呢,谢谢:

    1、直接在函数名称上,鼠标右键,查看依赖关系,为什么没有查到?和写语句查询有何区别?

    2、如何删除依赖?

    2010年7月8日 0:41
  • 查找指定函数的依赖项

    以下示例返回指定函数的依赖项。运行以下查询之前,请使用有效名称替换 <database_name><schema_name.function_name>

    USE <database_name>;
    GO
    SELECT OBJECT_NAME(object_id) AS referencing_object_name
        ,COALESCE(COL_NAME(object_id, column_id), '(n/a)') AS referencing_column_name
        ,*
    FROM sys.sql_dependencies
    WHERE referenced_major_id = OBJECT_ID('<schema_name.function_name>')
    ORDER BY OBJECT_NAME(object_id), COL_NAME(object_id, column_id);
    GO

     

     


    ===用该语句查询有一条记录。但是有两个问题不明白,请教,能否解释一下呢,谢谢:

    1、直接在函数名称上,鼠标右键,查看依赖关系,为什么没有查到?和写语句查询有何区别?

    2、如何删除依赖?


    先执行 这个代码

    SELECT distinct OBJECT_NAME(referenced_major_id) AS referenced_object_name
    FROM sys.sql_dependencies
    WHERE object_id = OBJECT_ID('dbo.f_GetIdf')
    GO

    找到函数中被引用的表的名字

    然后根据

    无法对 'dbo.f_GetId' 执行 DROP FUNCTION,因为对象 'DF__tb__id__7834CCDD' 正引用它。

    这个 提示 知道了表上的约束名

    然后执行

    alter table [上面第一步找出的表名] drop constraint DF__tb__id__7834CCDD
    
    2010年7月8日 6:51
  • ALTER TABLE tbname DROP CONSTRAINT DF__tb__id__7834CCDD
    GO
    DROP FUNCTION dbo.f_GetId
    GO
    2010年7月8日 7:06