Можно создать хранимую процедуру SQL для использования для всех баз данных. - PullRequest
1 голос
/ 07 сентября 2011

У меня есть хранимая процедура в одной базе данных на моем сервере SQL, которая устанавливает разрешения для всех хранимых процедур одновременно для этой конкретной базы данных.Есть ли способ создать эту хранимую процедуру таким образом, чтобы я мог легко вызывать ее из любой базы данных на сервере SQL, и если да, то как мне поступить таким образом

Ответы [ 3 ]

0 голосов
/ 07 сентября 2011

У меня есть хранимая процедура в одной базе данных на моем SQL-сервере, которая устанавливает разрешения для всех хранимых процедур одновременно для этой конкретной базы данных.

Выможет упростить архивирование того же результата:

  • создайте новую роль, например db_executor

    CREATE ROLE db_executor
    
  • предоставьте этой роли права на выполнение безуказание любых объектов:

    GRANT EXECUTE TO db_executor
    

Эта роль теперь имеет разрешения на выполнение всех хранимых процедур и функций - и она даже получит те же разрешения для любая будущая хранимая процедура , которую вы добавите в свою базу данных!

Просто назначьте эту роль нужным пользователям, и все готово ....

0 голосов
/ 11 июля 2017

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

Способ сделать это задокументирован в https://nickstips.wordpress.com/2010/10/18/sql-making-a-stored-procedure-available-to-all-databases/:

  1. Создать хранимую процедуру в базе данных master.
  2. Имя должно бытьначать с sp_, например sp_MyCustomProcedure
  3. Выполнить sys.sp_MS_marksystemobject с передачей имени процедуры, например EXEC sys.sp_MS_marksystemobject sp_MyCustomProcedure

Вот простой пример, который просто выбирает имятекущей базы данных:

use master
go

create procedure dbo.sp_SelectCurrentDatabaseName as begin
    select db_name()
end
go

execute sys.sp_MS_marksystemobject sp_SelectCurrentDatabaseName
go

В этом случае будет работать exec dbo.sp_SelectCurrentDatabaseName для любой базы данных.

Чтобы пометить процедуру как не системный объект, в * 1027 предложено несколько неприятных хаков*https://social.msdn.microsoft.com/Forums/sqlserver/en-US/793d0add-6fd9-43ea-88aa-c0b3b89b8d70/how-do-i-undo-spmsmarksystemobject?forum=sqltools, но это самый безопасный и простой способ - просто удалить и заново создать процедуру.

Предостережение

Конечно, создание системных процедур, подобных этой, нарушает общие правила.правило не называть свой собственный процессdures как sp_xxx из-за возможности их конфликта со встроенными процедурами в будущих версиях SQL Server.Поэтому это следует делать с осторожностью, а не просто создавать множество случайно названных процедур, которые вы считаете полезными.

Обычный простой способ избежать этого - добавить свой собственный префикс компании / личности к процедуре, которой занимается Microsoft.маловероятно использовать, например sp_MyCompany_MyCustomProcedure.

0 голосов
/ 07 сентября 2011

Вы пробовали 3 или 4 название части?

InstanceName.DatabaseName.dbo.usp_Name

Эта процедура может, в свою очередь, ссылаться на объекты в других базах данных, используя те же соглашения. Таким образом, вы можете параметризовать имя базы данных, с которой будете работать, и использовать динамический SQL для генерации 4 имен частей для ссылок на объекты, такие как системные таблицы.

...