SQL Server 2008修改系统存储过程

时间:2013-06-12 20:23:34

标签: sql-server-2008 stored-procedures

我继承了SQL Server(2008)的维护,我想修改一些系统存储过程。这些是用户定义的系统存储过程(例如:sys.sp_customproc)。我只能假设它们是作为系统程序创建的,因此可以跨多个数据库共享它们?但无论如何,我需要修改它们。

以下是其中一个例子。

USE [msdb]
GO
/****** Object:  StoredProcedure [sys].[sp_dbmmonitorhelpmonitoring]    Script Date: 06/12/2013 13:16:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [sys].[sp_dbmmonitorhelpmonitoring] 
as
begin
set nocount on
if (is_srvrolemember(N'sysadmin') <> 1 )
    begin
        raiserror(21089, 16, 1)
        return (1)
    end

declare @freq_type              int,    -- 4 = daily
        @freq_interval          int,    -- Every 1 days 
        @freq_subday_type       int,    -- 4 = based on Minutes
        @freq_subday_interval   int,    -- interval
        @job_id                 uniqueidentifier,
        @schedule_id            int,
        @retention_period       int,
        @jobname                nvarchar( 256 )

select @jobname   = isnull( formatmessage( 32047 ), N'Database Mirroring Monitor Job' )

select @job_id = job_id from msdb.dbo.sysjobs where name = @jobname
if (@job_id is null)    -- if the job does not exist, error out
begin
    raiserror( 32049, 16, 1 )
    return 1 
end

select @schedule_id = schedule_id from msdb.dbo.sysjobschedules where job_id = @job_id
select  @freq_type = freq_type,
        @freq_interval = freq_interval, 
        @freq_subday_type = freq_subday_type,
        @freq_subday_interval = freq_subday_interval
    from msdb.dbo.sysschedules where schedule_id = @schedule_id

-- If the frequency parameters are not what we expect then return an error
-- Someone has changed the job schedule on us
if (@freq_type <> 4) or (@freq_interval <> 1) or (@freq_subday_type <> 4)
begin
    raiserror( 32037, 16, 1)
    return 1
end

select @freq_subday_interval update_period

return 0
end

当我尝试执行它时,我收到错误:

消息208,级别16,状态6,过程sp_dbmmonitorhelpmonitoring,第46行 无效的对象名称'sys.sp_dbmmonitorhelpmonitoring'。

我的登录名是'sa',我被映射到[msdb]数据库中的用户'dbo'。如何修改此存储过程?

1 个答案:

答案 0 :(得分:0)

将标记为“系统存储过程”后,无法更改SP。相反,您必须删除它,重新创建它并再次将其标记为系统存储过程(使用sp_ms_marksystemobject)。 我相信你已经意识到弄乱任何被标记为“系统”的东西是多么危险。我强烈要求强烈建议您在尝试任何此类之前进行大量备份。即,备份:master,model和MSDB。