Я видел различные правила именования хранимых процедур.
Некоторые люди добавляют к имени sproc префикс usp_, другие - аббревиатуру имени приложения, а третьи - имя владельца. Вы не должны использовать sp_ в SQL Server, если вы действительно это не имеете в виду.
Некоторые начинают имя процедуры с глагола (Получить, Добавить, Сохранить, Удалить). Другие подчеркивают имя (имена) сущности.
В базе данных с сотнями sproc может быть очень сложно прокрутить и найти подходящий sproc, если вы думаете, что он уже существует. Соглашения об именах могут упростить поиск sproc.
Вы используете соглашение об именах? Опишите его и объясните, почему вы предпочитаете его другим вариантам.
Резюме ответов:
Почему я выбрал именно тот ответ: Так много хороших отзывов. Спасибо вам всем! Как видите, выбрать что-то одно будет очень непросто. Тот, который я выбрал, мне понравился. Я пошел по тому же пути, который он описывает, - пытался использовать Verb + Noun, а затем не смог найти все sprocs, применимые к Customer.
Очень важно иметь возможность найти существующий sproc или определить, существует ли он вообще. Если кто-то случайно создаст дубликат sproc с другим именем, могут возникнуть серьезные проблемы.
Поскольку я обычно работаю над очень большими приложениями с сотнями sprocs, я предпочитаю самый простой для поиска метод именования. Для небольшого приложения я мог бы рекомендовать Verb + Noun, поскольку он следует общему соглашению о кодировании для имен методов.
Он также выступает за добавление префикса к имени приложения вместо не очень полезного usp_. Как указали несколько человек, иногда база данных содержит sprocs для нескольких приложений. Таким образом, префикс с именем приложения помогает разделить sproc И помогает администраторам баз данных и другим пользователям определить, для какого приложения используется sproc.
Я считаю, что usp - это сокращение от «пользовательская процедура». Это отличает его от системных процедур с префиксом sp_. Это важное различие, о чем вы можете прочитать в ответах.
спасибо док. Grazie Mille
usp = пользовательская хранимая процедура
Я поддерживаю его только потому, что он закрыт, надеюсь, чтобы показать сильным мира сего, что подобные вопросы полезны для сообщества.
Извините за задержку с комментарием, но это может помочь. Поскольку я являюсь фронтенд-программистом, я использую следующее как для MySQL, так и для SQLServer: SPx_PAGE / MODULE_ACTION_OBJECT x: R для чтения, I для вставки, U для обновления, W для записи (объединяет вставку, если индекс не существует, или обновление, если существует) и D для удаления. SPR_DASHBOARD_GET_USERS


Я всегда инкапсулирую хранимые процедуры в пакеты (на работе я использую Oracle). Это уменьшит количество отдельных объектов и поможет повторно использовать код.
Соглашение об именах - дело вкуса, и вы должны согласовать его со всеми другими разработчиками в начале проекта.
Пакеты хорошие. Начиная с SQL Server 2005, Management Studio позволяет создавать «решения» для хранения связанных sprocs и других операторов SQL.
@DOK - обратите внимание, что эти пакеты не имеют места в самой базе данных. Это чисто артефакты интерфейсного инструмента. Вы не можете запрашивать по пакетам в словаре данных. Пакеты Oracle являются объектами первого класса в словаре системных данных и имеют свою собственную область действия.
для небольших баз данных я использую uspTableNameOperationName, например uspCustomerCreate, uspCustomerDelete и т. д. Это упрощает группировку по «основному» объекту.
для больших баз данных добавьте схему или имя подсистемы, например Получение, покупка и т. д., Чтобы они были сгруппированы вместе (поскольку sql-сервер любит отображать их в алфавитном порядке)
я стараюсь избегать сокращений в именах для ясности (и новым людям в проекте не нужно задумываться, что означает UNAICFE, потому что sproc называется uspUsingNoAbbreviationsIncreasesClarityForEveryone)
Да, особенно спасибо за использование сокращений.
@ [DOK]: пожалуйста - что, без голосов? ;-)
Стив, ты проголосовал за. Я был слишком занят чтением множества ответов и комментариев и мучительно размышлял о том, какой ответ «лучший».
@ [DOK]: спасибо; «лучший» ответ - это, вероятно, комбинация, которая имеет смысл в вашей ситуации.
Я думаю, что соглашение об именах usp_ никому не приносит пользы.
Раньше я использовал префиксы Get / Update / Insert / Delete для операций CRUD, но теперь, поскольку я использую Linq to SQL или EF для выполнения большей части своей работы CRUD, они полностью исчезли. Поскольку у меня так мало хранимых процессов в моих новых приложениях, соглашения об именах больше не имеют значения, как раньше ;-)
Добавление к каждому sproc префикса _usp не помогает различать их. Я думаю, что некоторым администраторам баз данных нравится этот префикс, потому что он указывает на тип объекта базы данных. Может быть, мы услышим от кого-нибудь из них, кому это понравится.
Для текущего приложения, над которым я работаю, у нас есть префикс, который идентифицирует имя приложения (четыре строчные буквы). Причина этого в том, что наше приложение должно иметь возможность сосуществовать с унаследованным приложением в той же базе данных, поэтому префикс является обязательным.
Если бы у нас не было устаревшего ограничения, я совершенно уверен, что мы бы не использовали префикс.
После префикса мы обычно начинаем имя SP с глагола, описывающего, что делает процедура, а затем с имени объекта, с которым мы работаем. Допускается множественное число имени объекта - мы стараемся сделать упор на удобочитаемость, чтобы было очевидно, что делает процедура, только по имени.
Типичные имена хранимых процедур в нашей команде:
shopGetCategories
shopUpdateItem
Ну, вы никогда не знаете, когда вы работаете с базой данных, выделенной для одного приложения, будет ли позже другое приложение, использующее ту же базу данных. В вашей ситуации это действительно помогает отделить звездочки.
Системы Венгерский (как и префикс usp выше) заставляет меня вздрогнуть.
Мы разделяем многие хранимые процедуры в разных базах данных с аналогичной структурой, поэтому для конкретных баз данных мы используем префикс самого имени базы данных; общие процедуры не имеют префикса. Я полагаю, что использование других схем может быть альтернативой для полного избавления от таких несколько уродливых префиксов.
Фактическое имя после префикса практически не отличается от именования функций: обычно это глаголы типа «Добавить», «Установить», «Создать», «Вычислить», «Удалить» и т. д., За которыми следует несколько более конкретных существительных, таких как «Пользователь». "," Ежедневные доходы "и т. д.
В ответ на комментарий Ant:
Так как узнать, взаимодействуете ли вы с процедурой, функцией, представлением, таблицей или чем-то еще?
Я бы предположил, что функции могут начинаться с «Get» или быть именем, которое не начинается с глагола. Все остальное будет процедурой, потому что в конце концов они называются хранимыми процедурами. Процедуры скрывают особенности, такие как представления, таблицы и все остальное.
Но это не венгерский. «Usp» - это не объявление переменной венгерского языка. «U» не означает «обновление», это означает «пользователь», как в «определяемой пользователем хранимой процедуре», и это просто защищает от того, что SQL Server просматривает главную базу данных каждый раз, когда он ищет вашу хранимую процедуру. Естественно, есть и другие способы, но «usp» обычно считается стандартом во многих корпусах, и, судя по тому, что я видел, он работает хорошо. Этому также учат Microsoft и рекомендованное Microsoft соглашение об именах: msdn.microsoft.com/en-us/library/ms124456(v=SQL.100).aspx
@Ant Тип объекта можно напрямую определить по его синтаксису, например SELECT * FROM foo ясно, что foo - это TABLE или VIEW. SELECT * FROM dbo.MyFunction() - это UDF, SELECT * FROM @tvv - это возвращающая табличное значение переменная, а хранимые процедуры могут быть вызваны только через EXEC. Так что двусмысленности нет.
@Ant Что касается SELECT * FROM foo, не показывающего тип foo (поскольку foo может быть VIEW или TABLE) - это не должно иметь значения (это также может быть синонимом!), Потому что они намеренно взаимозаменяемы - вы также можете INSERT INTO и UPDATE как VIEW. , не забывай. Когда базы данных вносят критические изменения в свои схемы, они часто добавляют VIEW в качестве замены для старых таблиц - так что, если таблица была названа tbl_Foo и была преобразована в CREATE VIEW tbl_Foo, то это просто глупая ошибка и по вашим собственным стандартам. Отсюда: не использовать системные префиксы венгерского языка в базах данных!
Я не думаю, что действительно имеет значение, какой у вас префикс, если вы логичны и последовательны. Лично я использую
spu_ [описание действия] [описание процесса]
где описание действия - это одно из небольшого набора типичных действий, таких как получение, установка, архивирование, вставка, удаление и т. д. Описание процесса является чем-то коротким, но информативным, например
spu_archiveCollectionData
или же
spu_setAwardStatus
Я называю свои функции аналогично, но с префиксом udf_
Я видел, как люди пытались использовать псевдовенгерскую нотацию для именования процедур, которая, на мой взгляд, скрывает больше, чем раскрывает. До тех пор, пока я перечисляю свои процедуры в алфавитном порядке, я могу видеть их сгруппированные по функциональности, тогда для меня это, кажется, золотая середина между порядком и ненужной строгостью.
spu_, интересно. Избегает проблемы с SQL Server sp_.
Запускать имя хранимой процедуры с помощью sp_ в SQL Server - это плохо, потому что все системные sprocs начинаются с sp_. Последовательное именование (даже до степени hobgoblin-dom) полезно, потому что оно облегчает автоматические задачи на основе словаря данных. Префиксы немного менее полезны в SQL Server 2005, поскольку он поддерживает схемы, которые могут использоваться для различных типов пространств имен так же, как и префиксы в именах, которые используются. Например, в звездообразной схеме можно иметь схемы тусклый и факт и ссылаться на таблицы в соответствии с этим соглашением.
Для хранимых процедур префикс полезен для идентификации цепочек приложений из системных цепочек. up_ по сравнению с sp_ позволяет относительно легко идентифицировать несистемные хранимые процедуры из словаря данных.
Именование sprocs «sp_» также является очень плохой идеей для скорости, потому что SQL Server пытается оптимизировать свои поиски для тех, которые основаны на предположении, что они являются системными процедурами. Посмотрите сюда, 5-я точка вниз: rakph.wordpress.com/2008/04/19/tips-store-procedure
В моем последнем проекте я использовал usp_ [Action] [Object] [Process], например, usp_AddProduct или usp_GetProductList, usp_GetProductDetail. Однако теперь база данных насчитывает более 700 процедур, и становится намного сложнее найти все процедуры для определенного объекта. Например, теперь мне нужно искать нечетные 50 процедур добавления для добавления продукта и нечетные 50 для получения и т. д.
Из-за этого в моем новом приложении я планирую сгруппировать имена процедур по объектам, я также отбрасываю usp, поскольку считаю, что он несколько избыточен, кроме того, чтобы сказать мне, что это процедура, которую я могу вычесть из имени сама процедура.
Новый формат выглядит следующим образом
[App]_[Object]_[Action][Process]
App_Tags_AddTag
App_Tags_AddTagRelations
App_Product_Add
App_Product_GetList
App_Product_GetSingle
Это помогает сгруппировать вещи, чтобы их было легче найти позже, особенно если имеется большое количество спрок.
Что касается того, где используется более одного объекта, я обнаружил, что большинство экземпляров имеют первичный и вторичный объект, поэтому первичный объект используется в обычном экземпляре, а вторичный объект упоминается в разделе процесса, например App_Product_AddAttribute.
Что делать, если задействовано более одного объекта? Например, что, если sproc запрашивает информацию как из таблицы «Клиент», так и из таблицы «Заказы»?
Измененный вопрос, чтобы ответить на этот вопрос.
Итак, вы удалили избыточный префикс usp_ и заменили его на App_. Как это лучше ??
Что происходит, если несколько приложений используют сохраненную процедуру?
Спасибо, Митч, давайте проясним. Этот префикс «App» является заполнителем для другой аббревиатуры, указывающей фактическое имя приложения (или аббревиатуру). Таким образом, если 3 приложения используют одну базу данных, могут быть ICA_Product_Add, CRM_Product_Add и BPS_Product_Add.
Зачем дублировать каждую процедуру 3 раза для 3 приложений? Весь смысл процедур хранения состоит в том, чтобы иметь единое место, где происходит данное действие. "ICA_Product_Add, CRM_Product_Add и BPS_Product_Add" уничтожает это.
Джейсон, эти sprocs могут быть вставлены в разные таблицы. У них могут быть разные входные параметры или возвращаемые значения. Или у них может быть другое поведение. Если sprocs делают то же самое, я согласен, версия должна быть только одна. Как предложил кто-то другой, общие sprocs могут не иметь префикса.
Даже если один и тот же sproc не отображается в нескольких приложениях, он все равно упрощает поиск sproc, которые используются конкретным приложением, путем добавления к нему индикатора приложения, чтобы все они были сгруппированы вместе.
Если у вас есть несколько приложений, вызывающих одну и ту же процедуру, вам нужно быть особенно осторожным, любое изменение этой процедуры может нарушить работу этих нескольких приложений. С точки зрения наименования, это серая область, но вы можете назвать ее общим / глобальным или как угодно. @localghosts: спасибо за информативность.
Я очень опаздываю ... но @Simon Shaw меня заинтриговал, почему вы "ненавидите" хранимые процедуры для таких вещей, как "Product_GetList". Как бы вы предпочли это сделать? Даже если ваш способ наверняка лучше ненавидеть то, что кажется очень разумным, использование хранимой процедуры - это немного перебор?
@Shawn: Мне также было бы любопытно, в чем на самом деле ваша проблема с хранимыми процедурами. Без каких-либо пояснений ваш комментарий просто смешон. Спасибо, что подробно остановились на этом.
есть ли разница между Product_GetDetail и Product_GetSingle?
Каков ваш текущий опыт использования этого нового подхода?
Очень поздно, но все еще не могу понять после прочтения всех ответов, если вы не используете префикс usp или что-то в этом роде, как можно узнать, что это хранимая процедура, а не представление или функция?
@HameedSyed, вы не можете выполнить представление, функцию или таблицу ... см. sp_prefix для получения дополнительной информации.
@dnolan, вместо того, чтобы указывать префикс App, не могли бы вы просто использовать разные Schema для каждого приложения? Я думаю, это подводит меня к тому, чтобы разобраться, для чего мне следует использовать схемы ...
По префиксу sp (БЕЗ подчеркивания. Не используйте sp_, это специальные системные объекты): это может показаться вам излишним, если вы используете только обозреватель объектов. Но если вы регулярно запрашиваете INFORMATION_SCHEMA или таблицы sys, возможность упорядочить по имени, а не включать столбец типа объекта, легко сэкономила мне десятки часов за эти годы. Он также позволяет использовать префиксы, такие как zz и tmp, для разделения процессов на более высоком уровне, чем <имя приложения>.
Я всегда использую:
usp [Имя таблицы] [Действие] [Дополнительная информация]
Учитывая таблицу с именем "tblUser", я получаю:
Процедуры отсортированы в алфавитном порядке по имени таблицы и по функциональности, поэтому легко увидеть, что я могу сделать с любой данной таблицей. Использование префикса «usp» позволяет мне узнать, что я вызываю, если я (например) пишу процедуру из 1000 строк, которая взаимодействует с другими процедурами, несколькими таблицами, функциями, представлениями и серверами.
Пока редактор в среде IDE SQL Server не будет так же хорош, как Visual Studio, я сохраняю префиксы.
Избегайте sp_ * на сервере SQl, потому что все хранимые процедуры системы начинаются с sp_, и поэтому системе становится сложнее найти объект, соответствующий имени.
Так что если вы начнете с чего-то другого, кроме sp_, все станет проще.
Поэтому для начала мы используем обычное название Proc_. Это упрощает идентификацию процедур, если они представлены одним большим файлом схемы.
Кроме того, мы назначаем префикс, который идентифицирует функцию. Нравиться
Proc_Poll_Interface, Proc_Inv_Interface и др.
Это позволяет нам находить все сохраненные процессы, которые выполняют функцию ОПРОСА по сравнению с инвентаризацией и т. д.
В любом случае система префиксов зависит от вашей проблемной области. Но Ал сказал и сделал нечто подобное, должно присутствовать, даже если это просто для того, чтобы люди могли быстро найти хранимую процедуру в раскрывающемся списке explorere для редактирования.
другие функции eg.
Proc_Order_Place
Proc_order_Delete
Proc_Order_Retrieve
Proc_Order_History
Мы следовали именованию на основе функций coz Procs похожи на код / функцию, а не на статические объекты, такие как таблицы. Не помогает то, что Procs могут работать более чем с одной таблицей.
Если процедура выполняет больше функций, чем может быть обработано одним именем, это означает, что ваша процедура выполняет гораздо больше, чем необходимо, и пора снова разделить их.
Надеюсь, это поможет.
Вот некоторые пояснения по поводу проблемы с префиксом sp_ в SQL Server.
Хранимые процедуры, названные с префиксом sp_, являются системными sprocs, хранящимися в базе данных Master.
Если вы дадите своему sproc этот префикс, SQL Server сначала будет искать их в базе данных Master, а затем в базе данных контекста, что приводит к ненужной трате ресурсов. И, если созданный пользователем sproc имеет то же имя, что и системный sproc, созданный пользователем sproc не будет выполнен.
Префикс sp_ указывает, что sproc доступен из всех баз данных, но должен выполняться в контексте текущей базы данных.
Вот - хорошее объяснение, которое включает демонстрацию хита производительности.
Вот - еще один полезный источник, предоставленный Ant в комментарии.
Хм, я не понимаю. Почему sp снижает производительность? Usp или gsp в порядке?
@ user2609980 DOK говорит, что SQL Server сначала ищет процесс с префиксом sp_ в главной БД, а затем в текущей БД, если не найден
+1 за четкое изложение чего-то, что имеет более запутанные объяснения в другом месте. Для меня это не новость, но я думаю, что это простое и лаконичное объяснение для начинающих.
Ссылка на демонстрацию хита производительности взята из статьи, написанной в 2001 году. С тех пор она изменилась, вот более подробная статья (от 2012 года) Аарона Бертрана: sqlperformance.com/2012/10/t-sql-queries/sp_prefix
префикс приложения_ префикс операции_ описание задействованных объектов базы данных (за вычетом пробелов между символами подчеркивания - нужно было поставить пробелы, чтобы они отображались).
префиксы операций, которые мы используем -
например
wmt_ ins _ customer _details
"инструмент управления персоналом, вставьте детали в таблицу клиентов"
преимущества
Все хранимые процедуры, относящиеся к одному и тому же приложению, сгруппированы по имени. Внутри группы хранимые процедуры, выполняющие однотипные операции (например, вставки, обновления и т. д.), Группируются вместе.
У нас эта система работает хорошо, имея ок. 1000 хранимых процедур в одной базе данных неуместно.
Минусов у такого подхода пока не обнаружено.
Я вообще ненавижу использование подчеркиваний, но способ их использования - не только для разделения префикса, но и для разделения операции - упростит поиск при сканировании списка из сотен sproc. Pretty_neat_idea.
За эти годы я использовал практически все разные системы. Наконец-то я разработал вот этот, который продолжаю использовать сегодня:
Префикс:
Указатель действия:
Ins - INSERT
Sel - SELECT
Upd - UPDATE
Del - DELETE
(В случаях, когда процедура выполняет много действий, общая цель используется для выбора спецификатора действия. Например, для клиента INSERT может потребоваться большая подготовительная работа, но общая цель - INSERT, поэтому выбирается «Ins».
Объект:
Для gen (CRUD) это затрагивается имя таблицы или представления. Для rpt (Report) это краткое описание отчета. Для tsk (Task) это краткое описание задачи.
Дополнительные осветлители:
Это необязательные биты информации, используемые для улучшения понимания процедуры. Примеры включают «По», «Для» и т. д.
Формат:
[Префикс] [Спецификатор действия] [Сущность] [Необязательные пояснители]
Примеры названий процедур:
genInsOrderHeader
genSelCustomerByCustomerID
genSelCustomersBySaleDate
genUpdCommentText
genDelOrderDetailLine
rptSelCustomersByState
rptSelPaymentsByYear
tskQueueAccountsForCollection
Теперь есть интересный взгляд на приставку. Похоже, это хороший способ разделить звенья по их использованию.
В настоящее время я использую следующий формат
Обозначение:
[ПРЕФИКС] [ЗАЯВЛЕНИЕ] [МОДУЛЬ] _ [ИМЯ]
Пример:
P_CMS_USER_UserInfoGet
Мне нравится это обозначение по нескольким причинам:
GetXXX - получает XXX на основе @ID
GetAllXXX - получает все XXX
PutXXX - вставляет XXX, если передано значение @ID -1; еще обновления
DelXXX - удаляет XXX на основе @ID
TableName_WhatItDoes
Comment_GetByID
Customer_List
UserPreference_DeleteByUserID
Никаких приставок и глупой венгерской чепухи. Просто название таблицы, с которой она наиболее тесно связана, и краткое описание того, что она делает.
Одно предостережение к вышесказанному: я лично всегда ставлю перед всеми автоматически сгенерированными CRUD префиксы zCRUD_, чтобы они попадали в конец списка, где мне не нужно было его смотреть.
Отделить элементы «z» от остальных - отличная идея.
Мне нравится этот метод. Их должно быть легко найти. Когда я просматриваю список первых sprocs глаголов и вижу 200 Gets, 200 Inserts, 200 обновлений, трудно найти все для конкретной таблицы или группы. Сначала я использовал метод глагола, и он быстро превратился в беспорядок. Имя таблицы сначала решает эту проблему. Так, например, в ответе выше все ваши комментарии или комментарии клиентов будут сгруппированы вместе, чтобы их было легко найти.
А что делать, если у вас есть запрос, объединяющий несколько таблиц?
Я поздно присоединился к теме, но хочу написать здесь свой ответ:
В моих последних двух проектах есть разные тенденции, например, в одном из них мы использовали:
To get Data : s<tablename>_G
To delete Data : s<tablename>_D
To insert Data : s<tablename>_I
To update Data : s<tablename>_U
Это соглашение об именах также сопровождается префиксом слова dt во внешнем интерфейсе.
Пример:
exec sMedicationInfo_G
exec sMedicationInfo_D
exec sMedicationInfo_I
exec sMedicationInfo_UС помощью приведенных выше соглашений об именах в нашем приложении мы получили хорошие и легко запоминающиеся имена.
Во втором проекте мы использовали те же соглашения об именах, но с разницей:
To get Data : sp_<tablename>G
To delete Data : sp_<tablename>D
To insert Data : sp_<tablename>I
To update Data : sp_<tablename>U
Пример:
exec sp_MedicationInfoG
exec sp_MedicationInfoD
exec sp_MedicationInfoI
exec sp_MedicationInfoUИнтересно. Я никогда не видел, чтобы это делалось таким образом, но правильные названия легко запомнить или угадать.
Спасибо DOK, да, его легко запомнить, и мы, разработчики, не боимся каких-либо сложностей в именах
Почему не _C _R _U _D?
@onedaywhen - это хорошая идея, я предлагаю нашему администратору базы данных, чтобы мы могли соответствующим образом поддерживать преобразование имен. Но главный мотив этого соглашения об именах - правильно представить весь объект, если я ничего не пропустил ...
Префикс sp_ использовать не рекомендуется.
Что означает usp?