В SQL Server, какова цель группировки хранимых процедур?

35

Одна из самых сложных проблем, с которыми мне приходилось сталкиваться, связана с группами хранимых процедур. Имея хранимую процедуру, usp_DoSomethingAwesomeя могу создать эту процедуру в другой группе, вызвав ее usp_DoSomethingAwesome;2.

Я обнаружил это при устранении некоторых проблем с репликацией (Publisher: SQL 2000 Ent., Dist / Sub: 2008 R2 Ent.), Возникающих при использовании некоторых сгенерированных системой хранимых процедур репликации, вставки и удаления.

Какова цель / мысль, стоящая за этой способностью «группировать»?

swasheck
источник

Ответы:

32

Это похоже на перегрузку метода. По сути, вы можете создать две или более версии хранимой процедуры, в которой каждая выполняет разные функции - принимает разное количество параметров, работает с разными таблицами, имеет разные выходные данные и т. Д.

Они называются пронумерованными процедурами, и они абсолютно устарели ( объявлено с 2005 года ). Они все еще поддерживаются в SQL Server 2012, но некоторые функции не очень хорошо с ними работают. Например, они считаются нарушением защиты в автономных базах данных, и любая процедура с номером> 1 не будет создана:

Сообщение 12829, уровень 16, состояние 1, процедура blat, строка 1
Хранимая процедура dbo.blat относится к группе пронумерованных хранимых процедур. Пронумерованные хранимые процедуры недоступны в отдельных базах данных. Пожалуйста, обратитесь к разделу Books Online: Понимание содержащихся баз данных для получения дополнительной информации о содержащихся базах данных.

Аарон Бертран
источник
5

Возможность (не рекомендуется) группировать хранимые процедуры, по-видимому, существует для одной (и довольно глупой) цели: возможность массового удаления с помощью одного DROPоператора. В соответствии с документацией SQL Server 2000 MSDN для создания хранимой процедуры :

Группирование
Процедура может быть создана с тем же именем, что и существующая хранимая процедура, если ей присвоен другой идентификационный номер, который позволяет группировать процедуры логически. Группировка процедур с одинаковым именем позволяет удалять их одновременно. Процедуры, используемые в одном приложении, часто группируются таким образом. Например, процедуры, используемые с приложением my_app, могут называться my_proc; 1, my_proc; 2 и т. Д. Удаление my_proc удаляет всю группу. После того, как процедуры были сгруппированы, отдельные процедуры в группе не могут быть удалены.

Нет никаких дополнительных преимуществ в использовании этой конструкции, поскольку использование одного и того же базового имени даже не допускает перегрузки (подписи не обязательно должны быть уникальными, и нет автоматической маршрутизации выполнения на определенное «число»), и поэтому вам все еще нужно используйте «число» при выполнении. Отсюда и определение «глупый» (и это, вероятно, слишком приятно об этом ;-).

Соломон Руцкий
источник