Browse by Tags
All Tags »
DATABASE (
RSS)
在给客户解决一个小的技术问题时,发现一些技术人员对SQL2005的T-SQL还有些东西是不太熟悉的,这次我就通过与SQL2000对比着来说一下SQL2005的TOP子句吧。 首先说一下大家熟悉的SELECT语句。 SQL2000中我们主要类似这样写:SELECT TOP 10 * FROM [News] ORDER BY [Id] DESC。这样我就能获取News表按Id列倒序的前10条记录。那么一个小问题就来了,我们知道SQL2000的TOP后面只能跟常量的,不能跟变量的,如果我们把这个语句放在一个存储过程中,而由于业务原因一些地方需要取出同样条件的10条有些20条还有57条……,那么我们怎么办呢?很多人说“简单啊,存储过中声明一个 @Top AS INT 的参数,然后先写一行SET ROWCOUNT @Top;然后写一行SELECT * FROM [News] ORDER BY [Id] DESC; 就行了。对了,最好在后面紧接着加上SET ROWCOUNT 0; 以避免影响后面的查询语句”。嗯这个回答在SQL2000是比较对的,起码比回答重新组合SQL语句的要好一些,尤其最好不要忘记那个SET ROWCOUNT 0; 但是我们看到这种方式在实际应用中,体验是不好的,一旦语句复杂到一定程度时,SET ROWCOUNT前后影响可能会让SQL编写人员撞墙。ok,那么我们在SQL2005中该如何处理呢? SQL2005中SELECT语句的TOP则方便多了,因为TOP支持使用任意的独立表达式,而不仅仅是常量。所以我们上面的同样问题可以简化为:SELECT TOP (@Top) * FROM [News] ORDER BY [Id] DESC。人性化多了,而且语句表达的意思很明确,不会像使用SET...
近期在对一些客户做技术培训的时候,发现了一个问题。一些我们平常天天在用的软件工具,比如:Windows、Office、SQL Server、Visual Studio等等,很多都没有得到用户较充分的使用。很多已经被软件厂商早已攻克的问题,却在用户那里在被重复研究解决方案,原因为什么?因为用户根本不知道原来这个每天都在用的软件工具还有这样或那样的功能,可以解决我们目前所碰到的问题。比如说: Excel就已经可以轻松解决家庭的收支结算问题,有人却偏偏要安装什么管家婆或者形形色色的所谓家庭财务管理软件,甚至还要求你安装个sql server呢。难道你只把excel当作一个普通表格使用吗? 不少人抱怨Word排版很差,对文章分层次时,要手工敲入那些“第一、第二”或者“1)、2)”等,为什么不用编号功能呢? sql server 2005 有个“数据库引擎优化顾问”,可以在一定程度上帮助优化数据库,而对应于sql 2000中也存在“索引优化向导”,而他们都依赖于sql profile,另外数据库有执行计划等一系列分析优化的工具,为什么连这些都没用过就问人索要什么优化工具呢? Windows自身就带有磁盘清理等系统优化工具,为啥你只为了清理一下系统盘的空间,却要安装“超级**”或是“**优化大师”呢? 上述都只是一些简单的例子,但在相当多用户中存在类似的问题,而在软件开发人员中问题依然不少见。问题出在哪里,用户自身是问题之一,而作为软件提供商来说,是否应该考虑一下自身的问题,是否应该下一下功夫对用户进行培训教育呢?UI是否可以设计的再合理一些,让用户更直接的了解到软件的已有功能呢? 正如某些分析师说的:“ 微软的Windows、Word和Excel等产品中功能丰富,但消费者却并不完全了解...
在一些网站或者软件系统中,由于安全或者程序异常等问题,可能会在SQL Server 2000中造成一个异常问题:在企业管理器中打开数据库发现有一些“坏表”,即无法使用,也无法正常删除。其原因往往是因为在尝试建表的过程中,只向数据库服务器的系统表sysobjects中写入了类型为“U”的记录,却并未真正在数据库中成功创建该表的实体。ok,解决问题有思路了: 假设“坏表”的表名为cmd,那么我们在查询分析器中对当前的数据库写一个sql语句: delete from sysobjects where [name]='cmd' and xtype='U' 按F5执行,可能会碰到一个错误提示:“未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作。” 解决这个小小的问题的方法是:打开mssql server 属性---》服务器选项----》启用对系统目录的特殊更新(允许对系统目录进行直接修改) 即可。之后重新在查询分析器中执行刚才的sql语句。 执行成功后。在企业管理器中会发现那个坏表已经不存在了。 [ 注:SQL2005中,由于微软做了重大调整,正常情况下不允许对系统表进行即席更新操作。所以本文提到的问题目前仅适用于SQL2000数据库,敬请注意 ] Read More...
asp.net 2.0中引入的Membership机制给我们做web开发带来很多便利,使得我们在做很多项目开发时处理用户和角色及权限问题时减少了相当的工作量。不过我们开发中可能会碰到一个小小的问题如下: 我们知道MembershipUser中有如下重载的方法 MembershipUser.ResetPassword () :将用户密码重置为一个自动生成的新密码。 MembershipUser.ResetPassword (String passwordAnswer) :将用户密码重置为一个自动生成的新密码。 msdn中有如下描述: ResetPassword 调用 ProviderName 属性所引用的成员资格提供程序的 MembershipProvider.ResetPassword 方法,以将成员资格用户的密码重置为自动生成的新密码。然后将该新密码返回到调用方。 如果 EnablePasswordReset 为 false ,则成员资格提供程序将返回一个异常。 如果 RequiresQuestionAndAnswer 为 true ,则必须使用以密码提示问题答案作为参数的 ResetPassword 重载方法,并提供成员资格用户的密码。如果需要密码答案并提供了不正确的密码答案,成员资格提供程序将引发 MembershipPasswordException。 而另外一个方法 MembershipUser.ChangePassword(String oldPassword, String newPassword) 又必须提供原始密码,那么这里就产生了一个矛盾:我们希望用户能够通过安全问题和答案来作为找回密码,又希望管理员可以重置某用户的密码怎么办?上述方法均无法直接使用,要么使用...
数据库镜像是SQL Server 2005的一个新特性,它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server上。它还让你可以在发生错误的时候,通过镜像数据库来进行错误恢复。镜像的拷贝是一个备用的拷贝,不能直接访问,它只用在错误恢复的情况下。SQL2005的这一特性给数据库系统维护人员带来了不错的实惠,而给最终用户的体验也是不错的。至于如何配置数据库镜像系统,大家可以到 TechNet 中文网络广播 中查找一下相关视频教程,尤其推荐大家去看看MVP 牛可 的相关讲座视频哦。再这里就不多说了。我们直奔主题吧!! 在使用数据库镜像功能时,如果我们使用的是工作组,那么我们需要注意一下数据库用户的问题:用普通方式创建的数据库用户,在主数据库中和镜像数据库中是有一些差异的,而这个差异最终会造成一个“奇怪”的结果,我们在主数据库和镜像数据库中对某数据库影射的“相同用户”,在发生故障转移后数据库验证会发生异常,称该用户无法登录我们的数据库, WHY? 原来是两个数据库中的同名用户在系统表syslogins中的sid不同造成的。解决方法就是在两个数据库上建立同名同sid的用户,具体方法如下: 假设有镜像的服务器是MIR-A和MI-B,要访问镜像数据库的登录账号是tom,使用下面这个方法就可以在MIR-A上创建登录名tom,然后在镜像数据库中创建数据库用户tom并映射到登录名tom 执行下列语句取回tom的sid select [name], sid from syslogins where [name] = 'tom' ------ ----------------------------------------------- tom 0xD6AABCC8F83E3243A6C3C97F28A4CB55...
More Posts