是否可以在Sql server级别创建全局存储过程

时间:2010-04-21 07:02:53

标签: sql sql-server database stored-procedures function

我创建了一个在某个指定位置进行数据库备份的查询。 我想将它用作存储过程,但这应该充当全局存储过程,以便每当调用此SP时。然后进行数据库备份。

它使用DB_Name()来获取所有者数据库的数据库备份。

是否可以创建任何此类SP或函数。

我正在使用sql server 2005

3 个答案:

答案 0 :(得分:17)

第一个解决方案:

如果在master数据库中创建sp并将其标记为系统对象并在其前面加上“sp_”,则将存在将由所有数据库共享的单个副本。

来自msdn的

第二个解决方案

可以使用添加到过程名称的#和##前缀创建类似于临时表的专用和全局临时存储过程。 #表示本地临时存储过程; ##表示全局临时存储过程。 SQL Server关闭后,这些过程不存在。

一个例子:

    USE master
    CREATE TABLE test (c1 VARCHAR(50))
    INSERT test VALUES('master')
    go
    CREATE PROC sp_test AS
    SELECT * FROM test
    GO

USE northwind
    CREATE TABLE test (c1 VARCHAR(50))
    INSERT test VALUES('northwind')

USE pubs
    CREATE TABLE test(c1 VARCHAR(50))
    INSERT test VALUES('pubs')

USE pubs
    EXEC sp_test --returns 'master'

USE master
    EXEC sp_MS_marksystemobject sp_test

USE pubs
    EXEC sp_test --returns 'pubs'

USE northwind
    EXEC sp_test --returns 'northwind' 

答案 1 :(得分:4)

必须遵循三个步骤来创建服务器上所有数据库都可以访问的“系统”存储过程,并且能够在调用它时在当前数据库的上下文中运行。

  1. 主数据库 - 应在主数据库
  2. 中创建存储过程
  3. 前缀存储过程 - 存储过程名称应以 sp _
  4. 为前缀
  5. 将SP标记为系统对象 - 调用 sp_ms_marksystemobject 将自定义SP标记为系统对象
  6. 下面的示例代码

    --Step 1, Create in master database
    USE master
    GO
    
    --Step 2, Prefix with sp_ the custom proc
    CREATE PROCEDURE sp_myCustomSystemProc
    AS
    BEGIN
       PRINT 'myCustomCode'
    END
    GO
    
    --Step 3, Mark as system object so proc executes in context of current db
    EXEC sp_ms_marksystemobject 'sp_myCustomSystemProc'
    GO
    

答案 2 :(得分:1)

此类存储过程有3个要求

  1. 必须在master数据库中创建存储过程。
  2. 存储过程的名称必须以“sp _”开头。
  3. 必须将存储过程标记为系统对象。
  4. - 1.在主数据库中创建过程

    USE master
    GO
    

    - 2.使用前缀sp _

    创建过程
    CREATE PROCEDURE sp_[Stored_Procedure_Name]
    AS
    BEGIN
         -- Insert the logic of your stored procedure here
    END
    GO
    

    - 3.将存储过程标记为系统对象

    EXEC sys.sp_MS_marksystemobject sp_[Stored_Procedure_Name]