Java堂  


怎样在SQL Server2005中删除数据库用户

归档在: Database — Jet @ 12:40 下午
Tags:
原文出处: http://www.javatang.com/archives/2006/08/28/402448.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

以前在SQL Server2000中删除数据库用户很简单,只要直接删除或者使用Drop User命令就可以了,但是SQL Server2005中直接操作是不行的,这是因为在SQL Server 2005中架构是做为实体对待的。所以要删除该用户,需要先删除该用户所拥有的架构或更改此架构的所有者。否则会提示”数据库主体在该数据库中拥有架构,无法删除。

另外,每一个数据库用户对应于一个系统登陆帐号,并且每一个架构只能赋予一个用户。所以直接删除用户的架构是不可以的,可以这样:首先创建一个新的登陆名,然后将需要删除的架构赋予这个新用户。这样就可以删除之前的用户了。

参考资料:
SQL 2005 应用手记
http://silverfox.mynew.ws/blog/index.php?/archives/111-SQL-2005.html

MS SQL Server 中事务日志变大的处理

归档在: Database — Jet @ 8:44 上午
Tags:
原文出处: http://www.javatang.com/archives/2006/08/21/444857.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为“自动收缩”外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下:

  1. -- 第一步:清空日志
  2. DUMP TRANSACTION databasename WITH NO_LOG 
  3. -- 第二步:截断事务日志
  4. BACKUP LOG databasename WITH NO_LOG 
  5. -- 第三步:收缩数据库
  6. DBCC SHRINKDATABASE(databasename)

需要说明几点:
1. 上面的SQL命令需要按照顺序执行;
2. 执行上面的命令通常比直接使用右键菜单中的“收缩”命令要快很多

参考资料:
SQL SERVER 数据库日志已满,如何收缩数据库日志
http://blog.csdn.net/faintbear/archive/2005/02/06/283316.aspx
如何收缩数据库日志
http://www.cndiy8.com/data/web5701/20050228/20050228__3794589.html

SQL Server中删除重复数据最快的方法

归档在: Database — Jet @ 11:34 下午
原文出处: http://www.javatang.com/archives/2006/07/23/342351.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进行删除的时候有许多种方法。我发现在网上流行的一种方法是利用临时表的方法,SQL脚本如下:

  1. select distinct * into #Tmp from tableName
  2. drop table tableName 
  3. select * into tableName from #Tmp
  4. drop table #Tmp

该方法首先使用select distinct命令将不重复的列表数据写入到临时表#Tmp中,然后删除原来的表,再将临时表中的数据写入到tableName中,最后删除临时表。
但是这种方法执行效率是一个方面,另外如果数据库中有text类型的字段的话将不能执行,非常的有局限性。

下面提供一个通用的方法并且执行效率也是非常不错的,脚本如下:

  1. declare @max int,@rowname varchar(400) 
  2. declare cur_rows cursor local for 
  3.     select repeatedrow,count(*) from tableName  group by repeatedrow having count(*) > 1 
  4.  
  5. open cur_rows 
  6. fetch cur_rows into @rowname ,@max 
  7. while @@fetch_status=0 
  8. begin 
  9.     select @max = @max -1 
  10.     set rowcount @max 
  11.     delete from tableName  where repeatedrow = @rowname 
  12.     fetch cur_rows into @rowname ,@max 
  13. end 
  14. close cur_rows 
  15. set rowcount 0

简单说明一下:首先声明了两个变量,一个是记录重复的数量,另外一个是记录重复字段的值,变量的类型以及长度可根据你实际的字段进行定义;接下来声明一个游标,该游标主要是列出重复的数据以及重复的数量;然后打开游标并从中取出数据,其中“select @max = @max -1”这句的意思是保留一条重复数据,剩下的逐一删除;最后关闭游标,搞定。

执行完教本之后可以使用下面的教本检查是否含有重复的数据:

  1. select repeatedrow,count(*) from tableName  group by repeatedrow having count(*) > 1

微软官方发布SQLServer JDBC 1.1 CTP版本

归档在: Database — Jet @ 11:38 下午
原文出处: http://www.javatang.com/archives/2006/06/28/381650.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

经过漫长的6个月的等待,微软官方终于发布了SQL Server JDBC 1.1版本的驱动,不过该版本为CTP(Community Technology Preview) 社区预览版,主要修改了所有已知的bug。
这里引用SQL Server JDBC项目一名开发人员 Angel 的一段说明:

Announcing the June 2006 Community Tech Preview of the JDBC 2005 driver:
http://www.microsoft.com/downloads/details.aspx?familyid=f914793a-6fb…

This preview contains all the changes of CTP 1 including Integrated
Security, it includes rollup fixes for all the QFEs we have shipped to date
and we have addressed most customer issues filed through the product
feedback center.

To round it off we have also added a brand new feature: Client Failover. As
far as I know this is the first JDBC driver to take advantage of Sql Server
2005 Database Mirroring. This feature has been fully documented for this
CTP, we could really use feedback on both the functionality and the docs.

For a complete change list take a look at the release.txt file that ships
with the package, for the first time we are providing comprehensive
information on the work we have done since v1.0, let us know if this is
helpful information.

下载地址:http://msdn.microsoft.com/data/ref/jdbc/

安装SQL Server2005遇到的几个问题

归档在: Database — Jet @ 11:20 上午
Tags:
原文出处: http://www.javatang.com/archives/2006/06/18/204746.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

原来有个项目是SQL Server2000,想移植到最新的2005中。手头得到的是一个2005企业版,安装的时候遇到了几个问题,现在一一列出来希望对大家有所帮助。
1. “系统兼容性”警告
在执行到系统检测那一步的时候有一个警告,提示是“系统兼容性错误”,因为是一个警告,当时也没有在意就继续安装了。但是安装的时候只有一个客户端可以选择,不能安装sql server服务。后来没办法,又重新回到刚才的警告,自己看了下“安装帮助”,原来企业版只能运行在win2k server和2003等系统上,不能运行在XP上。这一点跟之前的2000是类似的。所以本机只能安装标准版的了。

2. 性能计数器要求安装错误
提示的对话框如下:
查看了联机帮助,提示下面的解决办法(这个方法我试了之后不是很好,另外一个方法见下面):

1 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击“开始”、“运行”,然后在“打开”中键入 regedit.exe,再单击“确定”。在 Windows 2000 中,使用 regedt32.exe 启动注册表编辑器。

2 定位到以下注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib]

“Last Counter”=dword:00000ed4 (5276)

“LastHelp”=dword:00000ed5 (5277)

3 上一步的“Last Counter”值 (5276) 必须与以下注册表项中“Perflib\009”的“Counter”项的最大值匹配,并且上一步的“Last Help”值 (5277) 必须与以下注册表项中“Perflib\009”的“Help”项的最大值匹配。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]

注意 009 是英文中的一个示例。“Last Counter”和“Last Help”值是由 Windows 动态分配的;这两个值会因计算机的不同而不同。

4 如有必要,可修改“\Perflib”项中的“Last Counter”和“Last Help”值的值:在右侧窗格中,右键单击“Last Counter”或“Last Help”,单击“修改”,再单击“Base = “Decimal””,在“值数据”中设置值,再单击“确定”。如有必要,对另一个项重复以上过程,然后关闭注册表编辑器。

5 再次运行 SQL Server 安装程序。

可是按照上面的方法还是无法解决问题,后来网上查了下,找到一个解决的办法(见下面的参考资料)。不过其实没有作者介绍的那么复杂,只要在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib] 找到04项下Count和Help中最大的项值(一般是最后一项)修改到Perflib目录下对应的“Laster Counter”项和“Laster Help”项就可以了。

3. SQL Server2005与SQL Server2000或SQL Server7.0共存的方法
因为都是在本机,安装2005的时候原来的SQL Server2000也不想删除,查了下资料这样是可以的,需要注意以下两点:
1) 在安装SQL2005的时候不要使用默认实例名称(SQL Server2000的实例名称是MSSQLSERVER),手工输入一个自定义的不同于MSSQLSERVER的实例名称;
2) 如果和SQL Server2000安装到同一目录(例如C:\Program Files\Microsoft SQL Server),那么在安装时不要选择安装SQL Server Management Studio,而是在安装之后到光盘的Tools\Setup目录下,运行SqlRun_Tools.msi安装。如果不小心已经安装上的话,在“添加/删除”里面删除掉SQL Server Management Studio然后在到光盘的Tools\Setup目录下,运行SqlRun_Tools.msi重新安装就可以了。

参考资料:
安装Ms SQL Server 2005 开发版时出现性能计数器要求安装错误的解决办法
http://submaie.cnblogs.com/archive/2006/02/07/326538.html
SQL Server2005与2000能否装在同一个系统?求确切答案
http://www.readbook8.com/dev/5701/4402802.htm

拿到了SQL Server JDBC V1.1 CTP驱动

归档在: Database, JavaPlateform — Jet @ 11:29 下午
原文出处: http://www.javatang.com/archives/2006/05/10/293234.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

目前微软官方提供的SQL Server JDBC的最后版本为1.0,但是该版本的驱动有许多bug,今天得到的这个1.1版本的驱动是微软JDBC小组内部发行的一个版本,解决了许多已知的bug,比如:

Bug Details: Statement.execute() returns incorrect results for stored procedures
http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=dc43eb80-69b5-4137-8671-9f4e813ce259

Bug Details: JDBC 2005 GA Driver error when running a callablestatement on SQLServer 2000
http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=3fcf439d-79ed-44d9-bbbf-320e4ee25d89
Exception Message: “SQL Error: A server cursor is not allowed on a remote stored procedure or stored procedure with more than one SELECT statement. Use a default result set or client cursor”

Bug Details: JDBC Driver executeBatch does not work with INSERT statement
http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=e13a8009-7466-4803-ba19-6bfd4b5f8966
Exception Message: “java.sql.BatchUpdateException: com.microsoft.sqlserver.jdbc.SQLServerException: sp_cursoropen/sp_cursorprepare: The statement parameter can only be a single select or a single stored procedure.“

Bug Details: SQL2005 JDBC Driver bug with time zone handling **Available as a QFE**
http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=e73c8b79-53a6-4779-98f1-71c0043179eb

如果需要的可以在下面留言。
现在微软官方已经推出了新的正式版的1.1版本的驱动,大家可以在官方下载:http://msdn.microsoft.com/data/ref/jdbc/

SQL Server JDBC 1.0 中关于executeBatch()方法的两个bug

归档在: Database — Jet @ 4:08 下午
原文出处: http://www.javatang.com/archives/2006/05/07/081332.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

SQL Server JDBC的bug真是多多啊, 今天又发现两个很奇怪的错误, 查了网上的一些资料, 果然是驱动的bug. 情况是这样的:
将SQL Server JDBC的连接字段中SelectMethod设置为cursor, 然后执行下面一段代码:

  1. PreparedStatement stmt = connection.prepareStatement("insert into table1
  2. values (?, ?)");
  3. stmt.setInt(1, 1);
  4. stmt.setInt(2, 2);
  5. stmt.addBatch();
  6. stmt.executeBatch();
  7. stmt.close();

这个时候会产生 “sp_cursoropen/sp_cursorprepare: 语句参数只能是单个 SELECT 语句或单个存储过程。” 的SQLServerException, 同时数据不能写入到数据库中.
第二个错误是使用CallableStatement调用SQL Server的存储过程的时候, 如果使用executeBatch()方法的时候, 数据不能进行写入或更新, 并且没有抛出任何的异常.
查了一下微软的bug中心, 发现以上两个错误果然是JDBC的bug.
Bug Details: JDBC Driver executeBatch does not work with INSERT statement
http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackid=e13a8009-7466-4803-ba19-6bfd4b5f8966
Bug Details: Statement.execute() returns incorrect results for stored procedures
http://lab.msdn.microsoft.com/ProductFeedback/viewfeedback.aspx?feedbackid=dc43eb80-69b5-4137-8671-9f4e813ce259

bug记录上面显示状态为fixed, 但是对外公开的最新的驱动还没有更新, 只能是耐心的等待了 :(

参考资料:
Batch inserts dont work with PreparedStatement and selectMethod=cursor
http://groups.google.com/group/microsoft.public.sqlserver.jdbcdriver/browse_thread/thread/97b17f5b551ad146/385a82eb5315dccc?q=Batch+inserts+dont+work+&rnum=1

一篇专门介绍SQL Server JDBC的教程《MS_SQLSERVER.JDBC 》

归档在: Database, JavaPlateform — Jet @ 3:48 下午
原文出处: http://www.javatang.com/archives/2006/05/07/483631.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

市面上关于JDBC的介绍大多是关于Oracle或MySQL的, 而关于SQL Server JDBC的资料不是很多. 昨天从网上找到一篇专门介绍SQL Server JDBC的文章, 虽然是内容是关于JDBC2000的, 但是现在最新的SQL Server JDBC1.0对旧版本的改变大多是修改许多bug, 外部的API用法或者名称改变的不多, 所以这篇教程依然是一个非常好的参考资料.

教程原地址: http://www.csuchico.edu/computing/JAVAINFO/MS_SQLSERVER.JDBC/Preface.html

为方便大家, 我将其做成了chm格式的文档. 可以在本地下载.

SQL Server JDBC 1.0中提高Select的效率

归档在: Database — Jet @ 3:00 下午
原文出处: http://www.javatang.com/archives/2006/05/07/002930.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

如下一段代码, 其中myArray为一个存储数据的数组:

  1. // 建立Connection
  2. for(int i = 0; i < myArray.length; i ++){ 
  3.     link = myArray[i];
  4.     if(link == null) 
  5.         continue;
  6.     else 
  7.         link = link.replaceAll("'", "''");
  8.     String query = "Select Top 1 a_id From _osd_article Where link='" + link + "'";
  9.     Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
  10.     ResultSet rs = s.executeQuery(query);
  11.     boolean have = rs.next();
  12.     rs.close();
  13.     s.close();
  14.     if(have) 
  15.         continue;
  16. } 
  17. // 释放Connection...

执行之后发现Select的速度非常的慢, 并且在执行的过程中出现CPU使用率100%的情况. 查阅了一些资料, 原来是由于SQL Server JDBC 1.0默认的SelectMethod为direct造成的. 在direct模式下, 每一个Connection必须只对应一个Statement, 所以在查询的时候系统资源占用非常的高; 另外, direct模式下也容易产生互锁的事务. 如果修改为cursor模式就可以了. 关于驱动连接的参数以及详细的说明可以见参考资料.

参考资料:
Why is com.microsoft.jdbc.sqlserver.S-QLServerDriver so slow?
http://groups.google.com/group/microsoft.public.sqlserver.jdbcdriver/browse_thread/
thread/c11b52262f313bcb/c293b3aef59bb71a?q=select+slow&rnum=2

(SQL Server JDBC) Connection String Properties
http://www.csuchico.edu/computing/JAVAINFO/MS_SQLSERVER.JDBC/jdbcsqlsrv3.html
JDBC连SQL SERVER数据库常见问题
http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=123&threadID=18621

被保护: JDBC操作SQL Server小结

归档在: Database, JavaPlateform — Jet @ 4:06 上午
原文出处: http://www.javatang.com/archives/2006/05/03/061828.html
作者: Jet Mah from Java堂
声明: 可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明!

这篇文章受到密码保护。要阅读它,请在下面输入您的密码:


下一页 »