仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 661|回复: 8
打印 上一主题 下一主题

[学习教程] 请慎用sp_rename修正sql server数据库中工具称号

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。我们在修正sqlserver数据库中工具称号的时分,大概会对照喜好利用sp_rename体系存储历程来操纵,由于利用它比起到可视化列表中往找工具,速率要快的多。但为何我们不倡始利用它呢,由于利用它大概会带来一些贫苦。并且,在利用它变动工具名时,数据库自己也会给出以下告诫:
告诫:变动工具名的任一部分都大概会损坏剧本和存储历程。

我们如今来做一个复杂的测试,先创立一个复杂的存储历程:
createprocedureusp_test
as
begin
select1
end

我们不往研讨这个存储历程的功效与语法,由于这个不是本章的重点。

然后利用sp_rename来修正usp_test的称号
sp_renameusp_test,usp_test_1

体系提醒告诫:
告诫:变动工具名的任一部分都大概会损坏剧本和存储历程。但称号是已被修正失落了。

这时候候,我们从企业办理器的存储历程列表中看到存储历程usp_test的称号已修正成usp_test_1了。并且,我们在右键当选择->修正,检察到的剧本中的称号也已存为usp_test_1,界说以下:
ALTERprocedure[dbo].[usp_test_1]
as
begin
select1
end
但我们在利用sp_helptext体系存储历程来检察界说,会发明经由过程这个办法查到的界说,称号并没有变动过去:
sp_helptextusp_test_1

前往了局以下:
createprocedureusp_test
as
begin
select1
end
在sys.sql_modules表中definition列的界说也没有修正过去
selectdefinitionfromsys.sql_moduleswhereobject_id=object_id(usp_test_1)

前往了局以下:
createprocedureusp_testasbeginselect1end

从这个测试中能够看出,我们在修正数据库中工具的称号的时分,大概会造中数据库中该工具的界说分歧步。这大概会招致一些毛病的产生,以下面的链接所酿成的成绩,也就是因为该缘故原由发生的
sqlserver年夜bug:表删除后表的触发器未删除

纠错:
经再次测试后发明,不但是利用sp_name来修正工具名会形成该成绩,经由过程任何体例修正工具名城市存在该成绩,看来,我们在修正工具的称号时要警慎了。一个语句分成两个event(实际上不止,其他可以忽略),一个table_mapevent和一个Rows_log_event。Table_mapevent是一样的,主要看Rows_log_event。
海妖 该用户已被删除
沙发
发表于 2015-1-18 12:01:50 | 只看该作者
无法深入到数据库系统层面去了解和探究
只想知道 该用户已被删除
板凳
发表于 2015-1-25 10:57:29 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
小妖女 该用户已被删除
地板
发表于 2015-2-2 21:54:58 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
爱飞 该用户已被删除
5#
发表于 2015-2-8 08:15:32 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
飘灵儿 该用户已被删除
6#
发表于 2015-2-25 05:55:10 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
深爱那片海 该用户已被删除
7#
发表于 2015-3-7 18:22:05 | 只看该作者
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
山那边是海 该用户已被删除
8#
发表于 2015-3-15 11:38:20 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
小女巫 该用户已被删除
9#
发表于 2015-3-22 01:10:08 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-1 11:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表