2014-09-29 3 views
2

Предположим, у меня есть база данных MyDB, содержащая таблицу MyTable. Я могу ссылаться на это какКак следует использовать имена таблиц в SQL Server 2012?

MyDb.dbo.MyTable 

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

Если я квалифицировать как

dbo.MyTable 

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

MyOtherDb.dbo.MyTable 

Это: http://www.sql-server-performance.com/2001/sql-best-practices/ говорит

префиксов имен таблицу с именем владельца, так как это улучшает читаемость и устраняет любую ненужную путаницу. Microsoft SQL Server Books Online даже заявляет, что имена квалификационных таблиц с именами владельцев помогают в повторном использовании плана выполнения, что повышает производительность.

Я новичок в SQL Server и не совсем уверен, что такое владелец. Кроме того, многие другие ресурсы диктуют, что нужно использовать «полностью квалифицированное имя», не говоря уже о том, что они подразумевают под «полностью квалифицированным именем».

Извините, если это глупый вопрос, но что является лучшей практикой здесь? Я бы предпочел узнать об этом сейчас, чем проработать для себя три месяца подряд и много рефакторинга. Благодаря!

+5

Придерживайтесь формата 'schema.TableName'. Как только вы начнете ссылаться на другие базы данных из своего db, вы плотно соедините их вместе, не делайте этого! – DavidG

+0

Хорошая практика, чтобы квалифицировать ваши имена. Это сделает ваш SQL более удобочитаемым, и вы избежите любых конфликтов имен или вытаскиваете из неправильной базы данных (похоже, этого никогда не произойдет, но это может быть). Кроме того, среда разработки и производства IMO должна быть как можно более точно отражена - это помогает поддерживать стабильную и поддерживаемую среду. – bwhet

ответ

3

Используйте два имени части для объектов в одной базе данных.

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

Для объектов в разных базах данных вам необходимо использовать три имени части (или четыре, если это связанный сервер).

Часто вы можете использовать синонимы, чтобы централизовать эти внешние ссылки. Это облегчает перенаправление их в другое место в процессе разработки. Хотя синонимы не совсем обладают всеми функциональными возможностями, которые ссылаются на объект напрямую (например, TRUNCATE TABLE dbo.YourSynonym или CREATE INDEX ссылка на синоним не работает).

+0

+1 для синонимов – bornfromanegg

0

Владелец в Sybase (другой СУБД) похож на Schema на SQL Server. Полностью квалифицированное имя они имеют в виду следующее:

ServerName.DatabaseName.SchemaName.TableName (даже локальный компьютер, вы можете попробовать это с простым заявлением SQL)

Таким образом, если ваш запрос будет против связанных серверов все, что вам не нужно является последним 3 (DatabaseName.SchemaName.TableName), и ваш запрос никогда не будет иметь проблем с именами дубликатов таблиц.

Чтобы очистить свой ум несколько моментов, чтобы заметить, являются:

  1. хранимые процедуры могут быть и, как правило, хранятся в базе данных пользователя он будет против, так что знаю, первая часть (если не из-конечно, происходит от нескольких баз данных или даже хуже, против нескольких связанных серверов)

  2. Хранимые процедуры схемы связаны объекты (использует схему по умолчанию пользователя, создающего, если не указано)