65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (5投票s)

2004年2月4日

2分钟阅读

viewsIcon

50900

用于远程监控和管理的SQL Server管理器。

引言

数据库管理员经常遇到需要查询表、检查服务器状态、检查错误日志或在SQL Server服务器上运行DBCC命令的情况,但他们无法直接访问该服务器。这种情况经常发生在他们不在现场、休假、没有远程客户端等情况下,但可以访问互联网。

本文介绍了如何使用电子邮件查询SQL Server,并将结果作为电子邮件附件返回。

先决条件

  1. SQLMail已配置并在服务器上运行。
  2. 您的SQLMail帐户可以接收电子邮件。
  3. 邮件客户端(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:“更改邮件客户端选项”

在您的邮件客户端中,将邮件选项更改为如下所示的设置

Mail Settings

步骤3:“创建作业”

创建一个每1分钟执行上述创建的过程 (usp_readmail) 的作业。

Job Properties

Job Properties

Job Properties

如何查询服务器?

假设您在XYZ公司工作,您的SQLMail电子邮件帐户是SQLMail@mysqlmail.com。 使用您的任何电子邮件帐户,例如,Yahoo!, Hotmail, 本地宽带电子邮件或您公司的网页邮件,并以以下格式发送电子邮件至SQLMail@sqlmails.com

Mail query

几分钟后,您将获得与下述类似的作为附件的结果。

Query Resultin Mail

查询格式

我使用此查询格式是因为每当您使用任何免费电子邮件帐户(如Yahoo!或Hotmail)时,都会有额外的文本广告和签名附加到电子邮件中。通过使用此格式,我们可以从这些广告中过滤掉查询和电子邮件帐户。

  1. 默认情况下,过程usp_osqlexecute将读取错误日志并将结果作为附件发送回来。

    示例

    <query>usp_osqlexecute 
      </query><email>jak@mymail.com</email>
  2. 想要将结果发送给很多人吗?

    示例

    <query>usp_osqlexecute
    
    </query><email>jak@mymail.com;reachme@yahoo.com</email>
  3. 简单查询

    示例

    <query>usp_osqlexecute @servername="SQL2k",
    
    @Query="Select name from sysobjects", @Databasename=Payroll 
         </query><email>jak@mymail.com</email>
  4. 需要读取不同服务器的错误日志吗?

    示例

    <query>usp_osqlexecute
    
    @servername="SQL2k\instance1"</query><email>jak@mymail.com</email>
  5. 想要在数据库上运行DBCC吗?

    示例

    <query>usp_osqlexecute @Query = "DBCC Checkdb", @Databasename ="PAY" , 
    
    @Servername ="sql2k\instance1"</query><email>jak@mymail.com</email>
  6. 需要使用SQL身份验证而不是Windows身份验证吗?

    示例

    <query>usp_osqlexecute @servername="SQL2k\instance1", @authentication=" -Usa 
    
    -Pyeahright "</query><email>jak@mymail.com</email>
  7. 需要删除您忘记删除的巨大日志表吗?

    示例

    <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服务器保持联系。 使用本文中描述的方法,您可以通过较小的延迟,在远程位置像使用查询分析器一样完成所有工作。

© . All rights reserved.