SQL SERVER修改函数名容易引发的问题分析

 更新时间:2016年02月02日 11:15:54   作者:FishParadise  
这篇文章主要介绍了SQL SERVER修改函数名容易引发的问题分析的相关资料,需要的朋友可以参考下

1. 问题

今天遇到一个奇怪的问题:使用sp_helptext XXX查询出来的函数定义名竟然跟函数名不同,而sp_helptext实际是查询sys.all_sql_modules这个系统视图的。直接查询这个视图的definition字段,发现跟sp_helptext是一样的。难道是系统视图也存在缓存之类的机制?或者是个BUG?对于第一个问题,当时情况紧急,没有时间去求证是否存在了。第二个问题,我想没什么可能,SQL SERVER发展到今天(SQL 2016正式版准备推出,我使用的环境则是SQL 2008 R2,打了SP3),已经是很成熟的一个系统,即使是出现BUG也不是我这种水平的人能发现的,肯定是哪我哪里弄错了。于是求助于数据库技术交流群,很快有大神回答了是改名的问题。我马上就想起这个函数在一个多星期前,因为测试的需要,通过SSMS改了原函数名,而SQL SERVER不会因为改名去更新sys.all_sql_modules视图的definition字段的!于是就造成了已经编译好的函数与sys.all_sql_modules系统视图的函数定义出现了不一致的情况。

2. 重视与分析问题

做一个测试来重现下问题。首先,新建一个简单的测试函数dbo.ufn_test_1。

USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'dbo.ufn_test_1') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_test_1;
END
GO
CREATE FUNCTION dbo.ufn_test_1 ()
RETURNS CHAR(1)
AS
BEGIN
RETURN ('F');
END
GO 

code-1: 创建函数dbo.ufn_test_1

这时,使用sp_helptext和sys.all_sql_modules查询,一切正常。

EXEC sp_helptext [dbo.ufn_test_1];
GO
SELECT OBJECT_ID('dbo.ufn_test_1') AS a, * 
FROM sys.all_sql_modules
WHERE [object_id] = OBJECT_ID('dbo.ufn_test_1');
GO 

code-2:查询函数dbo.ufn_test_1的定义

figure-1: 查询函数dbo.ufn_test_1的定义

在SSMS上直接改名为dbo.ufn_test_2。

figure-2: 修改函数名

再去查询函数dbo.ufn_test_2的定义。这样,就出现了已经编译好的函数跟在视图中的函数定义出现了不一致的情况!如果通过sp_helptext和sys.all_sql_modules查询出现的定义去更新生产服务器,就肯定会出现问题。

3. 解决与结论

解决方法也很简单,把这个函数重建即可。如果使用SSMS的右键修改(Modify)或生成相关脚本(Script Function as)的菜单,则不会出现以上的问题。同样的问题与解决方法,也适用于存储过程。

结论:

(1)尽量不要修改对象名,确实要修改的话,就重建吧。如果是表并且包含的大量数据要重建的话,就比较麻烦了,即使是修改表名不会出现像函数、存储过程的问题,但修改表名涉及应用程序等问题。

(2)尽量使用SSMS的右键菜单修改或生成对象的定义。但如果函数或存储过程太多,会觉得sp_helptext和sys.all_sql_modules会更方便些,查询出来的结果要认真核对下对象名是否一致即可。这里提一下,sp_helptext有些限制,可以参考SQL中print、sp_helptext的限制与扩展

相关文章

  • SQL Server事务日志文件过大(已满)的解决方案

    SQL Server事务日志文件过大(已满)的解决方案

    随着数据库使用时间增长,日志文件也在不停的增大,这篇文章主要给大家介绍了关于SQL Server事务日志文件过大(已满)的解决方案,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • mssql 建立索引

    mssql 建立索引

    假设你想找到本书中的某一个句子。你可以一页一页地逐页搜索,但这会花很多时间。而通过使用本书的索引,你可以很快地找到你要搜索的主题。
    2009-04-04
  • SQL Server 数据库分离与附加 就这么简单!

    SQL Server 数据库分离与附加 就这么简单!

    这篇文章主要介绍了SQL Server 数据库分离与附加,很简单的图文教程,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 数据库中的内容字段被挂马的替换方法 SQL注入

    数据库中的内容字段被挂马的替换方法 SQL注入

    有时候有些数据库被挂马了,如果是sqlserver数据库,就可以用下面的方法,不过,这样的方法比较适合懂sqlserver的朋友,不过不懂的朋友也可以用,一些数据库的在线管理程序替换。
    2009-08-08
  • SQL语句之Union和Union All的用法

    SQL语句之Union和Union All的用法

    本文主要讲解SQL语句之Union和Union All的用法,比较实用,希望能给大家做一个参考。
    2016-06-06
  • SQL Server 字段设自增的实现流程

    SQL Server 字段设自增的实现流程

    这篇文章主要介绍了SQL Server 字段设自增的实现方法,在本文中,我将先向你展示整个实现的流程,然后逐步解释每个步骤需要做什么,并提供相应的代码示例,需要的朋友可以参考下
    2023-12-12
  • MS SQL Server STUFF实现统计记录行转为列显示

    MS SQL Server STUFF实现统计记录行转为列显示

    SQL语句行转列函数是一种用于将多个行数据转换为一列的函数,本文主要介绍了MS SQL Server STUFF实现统计记录行转为列显示,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • SQLServer中MERGE语句的使用

    SQLServer中MERGE语句的使用

    MERGE语句用于根据两个表之间的条件来插入、更新或删除记录,本文主要介绍了SQLServer中MERGE语句的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • SQL SERVER 2000通讯管道后复用劫持

    SQL SERVER 2000通讯管道后复用劫持

    这篇文章主要分享一个简单的例子,实现对SQL SERVER 2000管道通讯劫持的相关资料,需要的朋友可以参考下
    2014-06-06
  • 必须会的SQL语句(七) 字符串函数、时间函数

    必须会的SQL语句(七) 字符串函数、时间函数

    这篇文章主要介绍了sqlserver中字符串函数、时间函数使用方法,需要的朋友可以参考下
    2015-01-01

最新评论