FROM:http://blog.csdn.net/liangCK/archive/2008/10/07/3029315.aspx
在 SQL Server 2000 中修改系统表的方法大部分人都知道,介绍如何在 SQL 2005 中修改系统表的资料目前还比较少,虽然微软不赞成修改系统表,而且也把修改系统表的代码隐藏起来了。但微软一贯喜欢给自己留个小后门。我是这么想的:最先知道如何修改 SQL 2005 系统表的人只有微软 SQL Server 2005 的设计、开发者。于是就到 msdn 中逛逛,最后终于找到了 SQL 2005 修改系统表的方法:)
SQL 2005 修改系统表的两个先决条件
1. 在单用户模式(single-user mode)下启动 sql server instance(实例)。
2. 使用管理员专用连接(DAC: dedicated administrator connections),连接到 SQL Server Instance
下面,就来具体介绍如何实现这两个修改系统表的先决条件。
1. 单用户模式下启动 SQL Server 2005 Instance(实例)。
【开始】--【运行】--【services.msc】进入 Windows 服务管理器。
找到 【SQL Server 服务】--【右键】--【属性】
根据【可执行文件的路径】内容,我的是:
"D:\Microsoft SQL Server 2005\MSSQL.1\MSSQL\Binn\sqlservr.exe" -sSQLB
命令行下,进入 sqlservr.exe 安装路径,执行:sqlservr.exe -sSQLB -m
C:\>d:
D:\>cd D:\Microsoft SQL Server 2005\MSSQL.1\MSSQL\Binn
D:\Microsoft SQL Server 2005\MSSQL.1\MSSQL\Binn> sqlservr.exe -sSQLB -m
-sSQLB 表示要启动的SQL Server 实例名字为:SQLB;-m 参数表示以单用户模式启动 SQL Server 实例。如果顺利的话,SQL Server 实例就启动起来了。如果启动不了呢,可以重新启动下机器,再试,如果仍然启动不了,那你可以根据报错内容,到网上找找解决方法。
2. 使用 DAC 连接到 SQL Server 2005。
使用 DAC 连接到 SQL Server 2005 最常见的方法就是,在命令行下执行带有 -A 参数的 sqlcmd,如:
c:\sqlcmd -E -S MYPC\SQLB -A
也可以使用 SQL Server 超级用户和密码进入:
c:\sqlcmd -U sa -P **** -S MYPC\SQLB -A
注意:这里是“MYPC\SQLB”(computer_name\instance_name),而不单单只是 SQL Server 实例名“SQLB”。 小知识:“除默认实例外,所有数据库引擎实例都由安装该实例的过程中指定的实例名标识。应用程序必须提供准备连接的计算机的名称和命名实例的实例名。计算机名和实例名以格式 computer_name\ instance_name 指定”。
如果不能通过 DAC 连接到 SQL Server 2005 实例,那你就要检查下,SQL Server Browser 这个服务启动没有。SQL Server Browser 侦听 1434端口(UDP端口),它可以根据客户端发送来的实例名,返回相应的IP 和 Port,从而引导客户端建立正确的连接。
大部分情况下都能顺利完成 DAC 连接。但是,在命令行下操作 SQL Server,你不觉得很痛苦吗,如果没有配置好 cmd 环境,显示的结果总是乱七八糟的。呵呵,我在这里介绍下如何使用 SQL Server Management Studio(SSMS)DAC 到 SQL 2005。DAC 连接跟普通连接不一样,它有个自己专用的端口,我们只要找到这个 DAC 端口,就可以以任何方式(命令行或者 SSMS)连接到 SQL 2005 实例。
如何找到 DAC 的专用端口呢?当你在命令行单用户下启动 sql server 的时候, SQL Server 在屏幕上会输出好多日志信息。关键是找到包含“Dedicated admin connection”的内容:
Server is listening on [ 127.0.0.1 [ipv4] 1183].
Dedicated admin connection support was established for listening locally on port 1183.
这条信息告诉我们,SQL 2005 在网络地址 127.0.0.1 上的 1183 端口监听客户端的 DAC 连接。我们启动 SSMS,在服务器名称中输入:127.0.0.1,1183。这里的 ip 和 port 中间要用英文逗号“,”来分隔。当然,也可以在命令下通过 sqlcmd 来建立 DAC 连接。
c:\sqlcmd -E -S 127.0.0.1,1183
需要注意的是,如果指定了 DAC 端口,就不要在 sqlcmd 后加 -A 参数,否则会出错。这时候,也不需要启动 SQL Server Browser 了,因为我们已经告诉 sqlcmd 要连接到的 DAC 地址和端口是:127.0.0.1,1183。
就可以通过 DAC 连接到 SQL 2005 中,这时候会出现个错误,忽略它。
3. 在 SQL 2005 中修改系统表
use master
gocreate table ddd (id int not null)
goinsert into ddd values(10)
go
这时候,我们创建了一个表:ddd。下面在 SQL 2005 系统表 sys.sysschobjs 中查询这个表“ddd”的元数据。sys.sysschobjs 就类似于 SQL 2000 中的系统表 dbo.sysobjects。
select * from sys.sysschobjs where name = 'ddd'
下面列出的结果集中,由于版面的缘故,我省略了 created, modified 两个日期字段内容。
id name nsid nsclass status type pid pclass intprop created modified
---------- ----- ---- ------- -------- ---- ---- ------ -------- ------- --------
1211151360 ddd 1 0 917504 U 0 1 1 2008*** 2008***
这时候,我想把表“ddd”更名为“sqlstudy”:
update sys.sysschobjs set name = 'sqlstudy' where name = 'ddd'
警告: 数据库 ID 1 中的系统表 ID 34 已直接更新,但可能未维护缓存一致性。应重新启动 SQL Server。
(1 行受影响)
因为有缓存导致不一致,新的表名字可能没有马上生效,在命令行 Ctrl+C,重新启动 SQL Server 2005。就可以看到表“ddd”已经改名为“sqlstudy”了。
select * from sqlstudy
id
-------
10
补充内容:查看 SQL 2005 系统表的语句。
select name from sys.all_objects where type = 'S' order by name
name
-------------------
sysallocunits
sysasymkeys
sysbinobjs
sysbinsubobjs
syscerts
syschildinsts
sysclsobjs
syscolpars
sysconvgroup
sysdbfiles
sysdbreg
sysdercv
sysdesend
sysendpts
sysfiles1
sysftinds
sysguidrefs
syshobtcolumns
syshobts
sysidxstats
sysiscols
syslnklgns
syslogshippers
sysmultiobjrefs
sysnsobjs
sysobjkeycrypts
sysobjvalues
sysowners
sysprivs
sysqnames
sysremsvcbinds
sysrmtlgns
sysrowsetcolumns
sysrowsetrefs
sysrowsets
sysrts
sysscalartypes
sysschobjs
sysserefs
syssingleobjrefs
syssqlguides
systypedsubobjs
sysusermsgs
syswebmethods
sysxlgns
sysxmitqueue
sysxmlcomponent
sysxmlfacet
sysxmlplacement
sysxprops
sysxsrvs
在 SQL Server 2005 master 数据库中,共有 51 个系统表。并且这些系统表的 schema 是 “sys”。
本文《SQL 2005 修改系统表方法》示例,在 SQL Server 2005 Enterprise Edition SP2(9.00.3042.00) 环境下运行通过。操作系统:Windows Server 2003。
本文参考:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=89594&SiteID=1