首先,来看SQL Server Profiler工具跟踪到的信息。
具体代码是:
Go
declare @SmoAuditLevel int
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'AuditLevel', @SmoAuditLevel OUTPUT
declare @SmoDefaultFile nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @SmoDefaultFile OUTPUT
declare @SmoDefaultLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @SmoDefaultLog OUTPUT
declare @NumErrorLogs int
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'NumErrorLogs', @NumErrorLogs OUTPUT
declare @SmoLoginMode int
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', @SmoLoginMode OUTPUT
declare @SmoMailProfile nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'MailAccountName', @SmoMailProfile OUTPUT
declare @BackupDirectory nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @BackupDirectory OUTPUT
declare @SmoPerfMonMode int
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'Performance', @SmoPerfMonMode OUTPUT
if @SmoPerfMonMode is null
begin
set @SmoPerfMonMode = 1000
end
SELECT
'Server[@Name=' + quotename(CAST(
serverproperty(N'Servername')
AS sysname),'''') + ']' + '/Setting' AS [Urn],
@SmoAuditLevel AS [AuditLevel],
ISNULL(@SmoDefaultFile,N'') AS [DefaultFile],
ISNULL(@SmoDefaultLog,N'') AS [DefaultLog],
ISNULL(@NumErrorLogs, -1) AS [NumberOfLogFiles],
(case when @SmoLoginMode < 3 then @SmoLoginMode else 9 end) AS [LoginMode],
-1 AS [TapeLoadWaitTime],
ISNULL(@SmoMailProfile,N'') AS [MailProfile],
@BackupDirectory AS [BackupDirectory],
@SmoPerfMonMode AS [PerfMonMode]
我们可以把上面的代码Copy到查询分析器上执行,返回类似的结果信息:
这里可以看出返回的是默认的数据库文件存储位置,数据库备份路径等信息。
通过查询这里的代码,我们可以在注册表中快速检索到对应的位置:
(注:SQL2000/SQL2005/SQL2008有些差异,但不难找到)
接下来我们可以做个很好玩的测试,就是读其他键值,看看是否可以读出来。如取得SQLServer协议中的命名管道名称,
先看下MSSQLSERVER的协议中,管道名称是什么,
它在注册表的位置如图:
在查询分析器中,调用xp_instance_regread读取时这样:
Go
declare @PipeName nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\SuperSocketNetLib\Np', N'PipeName', @PipeName Output
Select @PipeName As [PipeName]
它能返回类似"\\.\pipe\sql\query"的管道名称.
O(∩_∩)O~,有点意思了。当然我们也可以通过xp_instance_regread读取到别的注册表键值,如:
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\Active Setup\Install Check', N'IE40', @tmp Output
Select @tmp As [tmp]
这个不是MSSQL Instance下的一样可以读取。,但必须是在HKEY_LOCAL_MACHINE根下,不然可能会出现错误:
如,我们要查HKEY_CURRENT_USER\Volatile Environment下的LOGONSERVER键值“\\WWW-57F11DF7D7A”。
SQL语句:
exec master.dbo.xp_instance_regread N'HKEY_CURRENT_USER', N'Volatile Environment', N'LOGONSERVER', @tmp Output
Select @tmp As [tmp]
GO
执行代码,这里,我收到了一个错误:
消息22001,级别1,状态1
原来我们这里,因为当前的MSSQLSERVER账号是 localSystem, 这一账号是无法访问HKEY_CURRENT_USER下的内容的, 我们可以修改为其他可以访问HKEY_CURRENT_USER的账号,如:
在 SQL Server 配置管理器(Microsoft Management Console)工具中,我们可以到
我这里把locaSystem账号改成是Administrator账号
这样,我们再来执行上面的查询语句,看看结果:
OK 了,问题能得到解决了。
好了,前面些的是说是读实例属性中的一些参数,可以使用存储过程xp_instance_regread,要是想设置数据库文件默认位置,可以调用xp_instance_regwrite,如:
EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'D:\SQL2008DATA\DE'
这里看到,语法使用简单,没有什么难。
最后,这里列出一些有关注册表扩展存储的过程,有兴趣的朋友可以自己去研究下:
- xp_regread
- xp_instance_regread
- xp_regenumkeys
- xp_instance_regenumkeys
- xp_regenumvalues
- xp_instance_regenumvalues
- xp_regwrite
- xp_instance_regwrite
- xp_regaddmultistring
- xp_instance_regaddmultistring
- xp_regremovemultistring
- xp_instance_regremovemultistring
- xp_regdeletevalue
- xp_instance_regdeletevalue
- xp_regdeletekey
- xp_instance_regdeletekey
注:当使用注册表扩展存储的过程时,可能会收到错误消息,这个错误信息有可能与SQL Server用户账号权限无关,只是MS因安全考虑,在内部做一些访问控制。具体看查询类似的Support:
http://support.microsoft.com/kb/887165
其他可以参考:
http://www.kodyaz.com/articles/article.aspx?articleid=48
(完)
No incapable except unthinkable.
MSN:weiguohao008@hotmail.com