sql2005自动启动服务器,在SQL Server启动时自动执行存储过程

问题

当sql server启动时,我很想运行一个存储过程。有没有一种方法可以在每次SQL Server服务启动时都会自动执行这个存储过程呢?

专家解答

sql Server提供了系统存储过程sp_procoption,这个存储过程可以用于当SQL Server服务启动时指派一个或者多个存储过程自动执行。这是一个很不错的选择,它可以用于多种多样的用途。比如,你可能在你的数据库中有开销很大的查询,这个查询在首次执行时会花费一些时间。通过使用sp_procoption,你可以在服务器启动时运行这个查询以此来预先编译执行计划,由此,你的某个用户就不会成为第一个运行这个特殊查询的不幸的人。我曾经用这个功能建立了一个我自己写的概要分析器服务器端跟踪的自动执行功能,这个跟踪功能成为服务器启动时被设置成自动执行的存储过程的一部分。

sp_procoption Parameters

exec sp_procoption @ProcName = ['stored procedure name'],

@OptionName = 'STARTUP',

@OptionValue = [on|off]

以下是sp_procoption存储过程参数的解释:

l 参数@ProcName的意思是明显的,它是被标记成自动执行的过程的名称。

l 参数@OptionName是可选用项,唯一有效的选项是STARTUP。

l 参数@OptionValue切换自动执行的开与关。

使用有特定限制的sp_procoption:

l 你必须以系统管理员的身份登录服务器并使用sp_procoption。

l 你只能指派标准存储过程、扩展存储过程或者CLR存储过程来启动。

l 存储过程必须在主从数据库上。

l 存储过程不能要求任何输入参数或者返回任何输出参数。

在下面的例子中,我创建一个存储过程,每次启动我的SQL Server实例时,这个存储过程就自动执行。这个存储过程的目的是在记录服务启动时间的数据库表中写一行。通过这张数据库表,我产生一个获得服务器正常运行时间的想法。以下的脚本创建了一个新的数据库,这个数据库存储了一张叫做SERVER_STARTUP_LOG的公制表。这张表保留了上次服务器启动的日期和时间。一旦建立了这个基本的架构,我就创建存储过程,在服务器启动时,这个存储过程将用于把日期和时间插入到表中。注意,存储过程是在主从数据库上创建的。

USE MASTER

GO

CREATE DATABASE SERVER_METRICS

GO

USE SERVER_METRICS

GO

CREATE table DBO.SERVER_STARTUP_LOG

(

LOGID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,

START_TIME DATETIME NOT NULL

CONSTRAINT DF_START_TIME DEFAULT GETDATE()

)

GO

USE MASTER

GO

CREATE PROCEDURE DBO.LOG_SERVER_START

AS

SET NOCOUNT ON

PRINT '*** LOGGING SERVER STARTUP TIME ***'

INSERT INTO SERVER_METRICS.DBO.SERVER_STARTUP_LOG DEFAULT VALUES

GO

既然必要的对象已经创建,那么我们需要在服务器启动时把创建的存储过程设置为自动启动。执行下面的查询,我们可以看到sp_configure高级选项'scan for startup procs'需要被设置。这些操作不需要手动去做,运行sp_procoption会自动为你设置。

USE MASTER

GO

SELECT VALUE, VALUE_IN_USE, DESCRIPTION

FROM SYS.CONFIGURATIONS

WHERE NAME = 'scan for startup procs'

GO

10054891_200911121413151.jpg

现在,我们可以用sp_procoption标志自动存储的过程。

USE MASTER

GO

EXEC SP_PROCOPTION LOG_SERVER_START, 'STARTUP', 'ON'

GO

重新运行我们的配置检查,现在我们可以看到,服务器配置成查看启动过程(VALUE = 1),但是运行值目前实际上仍然设置成没有查看启动过程(VALUE_IN_USE = 0)。我们需要重新启动SQL server服务来使改动生效。

USE MASTER

GO

SELECT VALUE, VALUE_IN_USE, DESCRIPTION

FROM SYS.CONFIGURATIONS

WHERE NAME = 'scan for startup procs'

GO

10054891_200911121413521.jpg

如果我们重启SQL Server服务,我们会看到配置值现在生效了。

10054891_200911121414271.jpg

此外,查看之前创建的SERVER_STARTUP_LOG表,我们看到服务器启动时间已经被记录到表中。

USE SERVER_METRICS

GO

SELECT * FROM SERVER_STARTUP_LOG

GO

10054891_200911121414551.jpg

最后,查看SQL 错误日志也可以证明这个存储过程是自动运行的。

USE MASTER

GO

EXEC XP_READERRORLOG

GO

现在,让我们把自动执行服务关掉,下次SQL Server启动时,这个存储过程将不会运行。

10054891_200911121418091.jpg

USE MASTER

GO

EXEC SP_PROCOPTION LOG_SERVER_START, 'STARTUP', 'OFF'

GO

如果你不确定你创建的哪个存储过程已经被标成自动执行,你可以运行以下的查询:

SELECT ROUTINE_NAME

FROM MASTER.INFORMATION_SCHEMA.ROUTINES

WHERE OBJECTPROPERTY(OBJECT_ID(ROUTINE_NAME),'ExecIsStartup') = 1

有件事你必须意识到:删除和重新创建标记的存储过程将会要求重新运行sp_procoption。删除一个存储过程会导致存储过程变成“没有标记”的自动执行。如果你删除存储过程但是不打算重新创建它,那么系统配置设置'scan for startup procs'将会被遗弃成“on”,直到你通过sp_configure手动把它设置为“off”或者使用sp_procoption把存储过程的自动执行关掉。把存储过程自动执行关掉或启动的过程会保持系统配置设置自动执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值