Запрос без указания схемы таблицы

10

Я импортировал несколько таблиц из SQL Server 2000 в свою базу данных 2008 года. Все импортируемые таблицы с префиксом мое имя пользователя , например: erpadmin.tablename.

В свойствах таблицы в качестве схемы БД указано «erpadmin». Когда я пишу запрос, мне нужно включить «erpadmin». перед всеми именами таблиц, что сбивает с толку.

Текущий результат:

select *
from erpadmin.tablename

Желаемый результат:

select *
from  tablename
Рамдас Бхосале
источник

Ответы:

23

Если вы хотите вернуться к использованию схемы dbo, как это было в SQL Server 2000, вы можете переместить таблицу обратно в схему dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Альтернативой, если вам нравится иметь схему не-dbo, является установка схемы вашего пользователя по умолчанию, а erpadminзатем, если вы не укажете схему, она будет использовать ее по умолчанию. (Члены предопределенной роли сервера sysadmin игнорируют DEFAULT_SCHEMAи используют dboпо умолчанию.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

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

Адам Венгер
источник
17

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

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

Когда я пишу запрос, мне нужно включить «erpadmin». перед всеми именами таблиц, что сбивает с толку.

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

Томас Стрингер
источник
3
Другая причина всегда использовать имена из двух частей - это избежать ситуации, когда несколько пользователей выполняют один и тот же код (например select ... from table5 ;) и получают разные результаты. Это плохо для кэширования плана, а также плохо для устранения неполадок (специалист службы поддержки, «этот запрос работает нормально здесь»). Кроме того, привязка схемы, которая требуется для индексации функций и представлений, требует двух имен частей. TLDR: перестань быть ленивым - используйте две части имени.
Гринстоун Уолкер,
7

Как дополнение к ответу @AdamWenger. Для создания сценариев для перехода на другую схему вы можете использовать следующий сценарий

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'
Игорь Борисенко
источник
4

Вероятно, ваша проблема связана с тем, как была выполнена миграция. Материал не должен быть привязан к вашему пользователю, если вы не являетесь владельцем.

Схемы предназначены для того, чтобы помочь вам разделить таблицы по тому, что имеет смысл. Предположим, у вас есть одна таблица ресурсов для отдела кадров и вы хотите отдельную таблицу для производственного отдела, сохраняя обе в одной базе данных. В этом случае вы можете иметь две таблицы с именами ресурсов, одну в производственной схеме, а другую в схеме HR. Вот почему необходимо указывать shcemas, если вы не вносите материал в схему по умолчанию.

Если вы не переделываете миграцию по какой-либо другой причине, то перевод Адама Венгера должен быть разумным вариантом.

JoseTeixeira
источник
-2

Запустите вашу команду, указав, что у USE [tablename] вашего запроса нет связанной базы данных, на которую вы ссылаетесь, и база данных, на которую вы просматриваете, не является значением по умолчанию для вошедшего в систему пользователя. В верхней части окна запроса оно, вероятно, говорит «master».

Джон
источник
3
Вы имеете в виду [database_name], верно?
Дезсо