完整的远程(内部/外部)SQL Server管理器





3.00/5 (5投票s)
2004年2月4日
2分钟阅读

50900
用于远程监控和管理的SQL Server管理器。
引言
数据库管理员经常遇到需要查询表、检查服务器状态、检查错误日志或在SQL Server服务器上运行DBCC命令的情况,但他们无法直接访问该服务器。这种情况经常发生在他们不在现场、休假、没有远程客户端等情况下,但可以访问互联网。
本文介绍了如何使用电子邮件查询SQL Server,并将结果作为电子邮件附件返回。
先决条件
- SQLMail已配置并在服务器上运行。
- 您的SQLMail帐户可以接收电子邮件。
- 邮件客户端(MS-Outlook)已打开并在我们创建所有过程和作业的服务器上运行。
如何配置?
步骤1:“创建过程”
在设置了SQL-Mail的SQL服务器上执行以下脚本
use master
go
CREATE procedure usp_osqlexecute
@servername varchar(128) =@@servername,
@Databasename varchar(128)='Master',
@authentication varchar(128)=' -E ',
@Query varchar(2000) = 'sp_readerrorlog'
as
declare @formsql varchar(3000)
set @formsql = 'osql -S'+@servername +'
-d'+@Databasename+' -Q"'+@Query+ '"
' +@authentication + ' >c:\output.txt'
set @formsql ='master.dbo.xp_cmdshell '''+ @formsql+''''
print @formsql
exec (@formsql)
go
CREATE Procedure usp_readmail as
declare @message varchar(1000)
declare @message2 varchar(1000)
declare @start int
declare @len int
declare @sendmailto varchar(128)
declare @count int
create table #messages (Originator varchar(1000)
,date datetime,recipients varchar(1000),cclist varchar(300),
bcclist varchar(300),subject varchar(300),message ntext,
unread varchar(10),attachments varchar(1000),messageid varchar(1000),
type varchar(1000))
set @sendmailto=' '
insert #messages exec "xp_readmail"
set @count = (select count(*) from #messages where unread='true')
if @count>0
begin
set @message=(select convert(varchar(1000),message) as message from #messages
where date = (select max(date) from #messages) and unread='true')
set @message2 = @message
set @start =charindex('<query>',@message)+7
set @len = charindex('</query>',@message)-@start
set @message= substring(@message,@start,@len)
exec (@message)
set @start =charindex('<email>',@message2)+7
set @len = charindex('</email>',@message2)-@start
set @sendmailto= substring(@message2,@start,@len)
exec master.dbo.xp_sendmail @recipients=@sendmailto,@attachments= 'c:\output.txt'
end
步骤2:“更改邮件客户端选项”
在您的邮件客户端中,将邮件选项更改为如下所示的设置
步骤3:“创建作业”
创建一个每1分钟执行上述创建的过程 (usp_readmail
) 的作业。
如何查询服务器?
假设您在XYZ公司工作,您的SQLMail电子邮件帐户是SQLMail@mysqlmail.com。 使用您的任何电子邮件帐户,例如,Yahoo!, Hotmail, 本地宽带电子邮件或您公司的网页邮件,并以以下格式发送电子邮件至SQLMail@sqlmails.com
几分钟后,您将获得与下述类似的作为附件的结果。
查询格式
我使用此查询格式是因为每当您使用任何免费电子邮件帐户(如Yahoo!或Hotmail)时,都会有额外的文本广告和签名附加到电子邮件中。通过使用此格式,我们可以从这些广告中过滤掉查询和电子邮件帐户。
- 默认情况下,过程
usp_osqlexecute
将读取错误日志并将结果作为附件发送回来。示例
<query>usp_osqlexecute </query><email>jak@mymail.com</email>
- 想要将结果发送给很多人吗?
示例
<query>usp_osqlexecute </query><email>jak@mymail.com;reachme@yahoo.com</email>
- 简单查询
示例
<query>usp_osqlexecute @servername="SQL2k", @Query="Select name from sysobjects", @Databasename=Payroll </query><email>jak@mymail.com</email>
- 需要读取不同服务器的错误日志吗?
示例
<query>usp_osqlexecute @servername="SQL2k\instance1"</query><email>jak@mymail.com</email>
- 想要在数据库上运行DBCC吗?
示例
<query>usp_osqlexecute @Query = "DBCC Checkdb", @Databasename ="PAY" , @Servername ="sql2k\instance1"</query><email>jak@mymail.com</email>
- 需要使用SQL身份验证而不是Windows身份验证吗?
示例
<query>usp_osqlexecute @servername="SQL2k\instance1", @authentication=" -Usa -Pyeahright "</query><email>jak@mymail.com</email>
- 需要删除您忘记删除的巨大日志表吗?
示例
<query>usp_osqlexecute @Query = "Delete from Logtable where date>=getdate()-10", @Databasename ="MAK" , @Servername ="sql2k\instance1"</query><email>jak@mymail.com</email>
注意:您可以通过在查询格式中添加RC4加密等安全性,和/或评估电子邮件的来源,和/或使用额外的查询标签(例如<user>JAK</User>
)来验证身份验证,从而限制用户访问此功能。
结论
通过这种方法,无论您在哪里可以访问互联网,都可以与您的SQL Server服务器保持联系。 使用本文中描述的方法,您可以通过较小的延迟,在远程位置像使用查询分析器一样完成所有工作。