Может кто-нибудь, пожалуйста, объясните мне, как SQL Server использует точечную нотацию для идентификации
расположение таблицы? Я всегда думал, что местоположение Database.dbo.Table
Но я вижу код, у которого есть что-то еще вместо dbo
, что-то вроде: DBName.something.Table
Может ли кто-нибудь объяснить это?
Текстовая нотация SQL
Ответ 1
Это схема базы данных. Полное трехчастное имя таблицы:
databasename.schemaname.tablename
Для схемы по умолчанию для пользователя вы также можете опустить имя схемы:
databasename..tablename
Вы также можете указать имя связанного сервера:
servername.databasename.schemaname.tablename
Вы можете больше узнать об использовании идентификаторов в качестве имен таблиц в MSDN:
Имена серверов, баз данных и владельцев называются квалификаторами имени объекта. Когда вы ссылаетесь на объект, вам не нужно указывать сервер, базу данных и владельца. Отборочные могут быть опущены путем маркировки их позиций периодом. Действительные формы имен объектов включают следующее:
server_name.database_name.schema_name.object_name
server_name.database_name..object_name
server_name..schema_name.object_name
server_name... object_name
database_name.schema_name.object_name
database_name..object_name
schema_name.object_name
object_name
Имя объекта, которое указывает все четыре части, называется полным именем. Каждый объект, созданный в Microsoft SQL Server, должен иметь уникальное, полное имя. Например, в одной базе данных могут быть две таблицы с именем xyz, если у них разные владельцы.
Большинство ссылок на объекты используют имена из трех частей. По умолчанию имя_сервера - это локальный сервер. Базовое имя по умолчанию - это текущая база данных соединения. По умолчанию schema_name представляет собой схему по умолчанию для пользователя, представляющего инструкцию. Если не указано иное, стандартная схема новых пользователей представляет собой схему dbo.
Ответ 2
Что сказал @Шимон. Вы также должны указывать на то, чтобы всегда ссылаться на объекты схемы (будь то таблица, представление, хранимая процедура и т.д.). Ссылки на неквалифицированные объекты разрешаются следующим образом:
-
Задайте пространство имен текущей базы данных для объекта указанного имени, принадлежащего схеме по умолчанию учетных данных, под которыми работает текущее соединение.
-
Если этого не найдено, проверьте пространство имен текущей базы данных для объекта с указанным именем, принадлежащим схеме
dbo
.
И если ссылка на объект относится к хранимой процедуре, имя которой начинается с sp_
, это хуже, поскольку к процессу разрешения добавляются еще два шага (если только ссылки не соответствуют базам данных): повторяются два вышеуказанных шага, но на этот раз, глядя в базу данных master
вместо текущей базы данных.
Итак, запрос типа
select *
from foo
требует, чтобы два зонда пространства имен разрешали foo
(предполагая, что таблица/представление фактически dbo.foo
): сначала по вашей схеме по умолчанию (john_doe.foo
), а затем, не будучи найденной, под dbo
(dbo.foo
'), тогда как
select *
from dbo.foo
немедленно разрешается одним зондом пространства имен.
Это имеет 3 значения:
-
Резервный поиск дорог.
-
Он блокирует кэширование плана запроса, так как каждое выполнение должно быть переоценено, что означает, что запрос должен быть перекомпилирован для каждого выполнения (и он вынимает блокировки времени компиляции).
-
В какой-то момент вы начнете стрелять себе в ногу и непреднамеренно создать что-то под своей стандартной схемой, которая должна существовать (и, возможно, уже существует) в рамках схемы
dbo
. Теперь у вас есть две версии, плавающие вокруг.В какой-то момент вы или кто-то другой (обычно это происходит в процессе производства) будет запускать запрос или выполнять хранимую процедуру и получать... неожиданные результаты. Потребуется достаточно времени, чтобы понять, что существует две [разные] версии одного и того же объекта, и каждый из которых выполняется, зависит от их учетных данных пользователя и от того, была ли ссылка ссылкой на схему.
Всегда указывать схему, если у вас нет реальной причины не делать этого.
При этом может быть полезно, чтобы в целях развития была возможность поддерживать "новую" версию чего-либо под вашей личной схемой и "текущую" версию в рамках схемы "dbo". Это упрощает проведение бок о бок тестирования. Однако это не без риска (см. Выше).
Ответ 3
Когда SQL увидит синтаксис, он сначала рассмотрит схему текущих пользователей, чтобы увидеть, существует ли таблица, и будет использовать ее, если это произойдет. Если это не так, то он смотрит на схему dbo и использует таблицу оттуда