Текстовая нотация SQL

Может кто-нибудь, пожалуйста, объясните мне, как SQL Server использует точечную нотацию для идентификации расположение таблицы? Я всегда думал, что местоположение Database.dbo.Table
Но я вижу код, у которого есть что-то еще вместо dbo, что-то вроде:
DBName.something.Table Может ли кто-нибудь объяснить это?

Ответ 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 и использует таблицу оттуда