SQL 2005 修改系统表
本文由 www.sqlstudy.com 原创,版权所有,转载请注明作者和出处!
在 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\BinnD:\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 mastergocreate 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 sqlstudyid-------10补充内容:查看 SQL 2005 系统表的语句。select name from sys.all_objects where type = ‘S‘ order by namename-------------------sysallocunitssysasymkeyssysbinobjssysbinsubobjssyscertssyschildinstssysclsobjssyscolparssysconvgroupsysdbfilessysdbregsysdercvsysdesendsysendptssysfiles1sysftindssysguidrefssyshobtcolumnssyshobtssysidxstatssysiscolssyslnklgnssyslogshipperssysmultiobjrefssysnsobjssysobjkeycryptssysobjvaluessysownerssysprivssysqnamessysremsvcbindssysrmtlgnssysrowsetcolumnssysrowsetrefssysrowsetssysrtssysscalartypessysschobjssysserefssyssingleobjrefssyssqlguidessystypedsubobjssysusermsgssyswebmethodssysxlgnssysxmitqueuesysxmlcomponentsysxmlfacetsysxmlplacementsysxpropssysxsrvs
在 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