我创建了一个在某个指定位置进行数据库备份的查询。 我想将它用作存储过程,但这应该充当全局存储过程,以便每当调用此SP时。然后进行数据库备份。
它使用DB_Name()来获取所有者数据库的数据库备份。
是否可以创建任何此类SP或函数。
我正在使用sql server 2005
答案 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)
必须遵循三个步骤来创建服务器上所有数据库都可以访问的“系统”存储过程,并且能够在调用它时在当前数据库的上下文中运行。
下面的示例代码
--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.在主数据库中创建过程
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]