Подтвердить что ты не робот

Возможно ли создать глобальную хранимую процедуру на уровне сервера Sql

Я создал запрос, который берет резервную копию базы данных в определенном месте. Я хочу использовать его как хранимую процедуру, но это должно действовать как глобальная хранимая процедура, так что всякий раз, когда вызывается этот SP. Затем выполняется резервное копирование базы данных.

Он использует DB_Name() для получения резервной копии базы данных владельца базы данных.

Можно ли создать любой такой SP или Function.

Я использую SQL Server 2005

4b9b3361

Ответ 1

первое решение:

Если вы создаете свой 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' 

Ответ 2

Необходимо выполнить три шага, чтобы создать "системную" хранимую процедуру, доступную для всех баз данных на Сервере, а также иметь возможность запускаться под контекстом текущей базы данных при ее вызове.

  • Основная база данных. Хранимая процедура должна быть создана в базе данных Master
  • Сохраненная процедура префикса. Имя хранимой процедуры должно иметь префикс sp_
  • Отметить SP как системный объект - вызвать sp_ms_marksystemobject, чтобы отметить пользовательский SP как системный объект

Пример кода ниже

--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

Ответ 3

Существует 3 требования для такой хранимой процедуры

  • Хранимая процедура должна быть создана в основной базе данных.
  • Имя хранимой процедуры должно начинаться с "sp_".
  • Хранимая процедура должна быть отмечена как системный объект.

- 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]