Подтвердить что ты не робот

Установить схему по умолчанию для SQL-запроса

Есть ли способ установить схему для запроса, чтобы в остальной части запроса я мог ссылаться на таблицы только по их имени, не добавляя их с именем схемы?

Например, я хотел бы сделать что-то вроде этого:

Use [schemaName]
select * from [tableName]

в отличие от этого:

select * from [schemaName].[tableName]
4b9b3361

Ответ 1

Быстрый google указал мне на эту страницу. В нем объясняется, что с сервера SQL Server 2005 вы можете установить схему по умолчанию для пользователя с помощью инструкции ALTER USER. К сожалению, это означает, что вы постоянно меняете его, поэтому, если вам нужно переключаться между схемами, вам нужно будет устанавливать его каждый раз, когда вы выполняете хранимую процедуру или партию операторов. В качестве альтернативы вы можете использовать описанную здесь технику.

Если вы используете SQL Server 2000 или старше, эта страница объясняет, что пользователи и схемы эквивалентны. Если вы не добавили имя таблицы с помощью схемы \user, сервер sql сначала рассмотрит таблицы, принадлежащие текущему пользователю, а затем те, которые принадлежат dbo для разрешения имени таблицы. Кажется, что для всех других таблиц вы должны добавить схему \user.

Ответ 2

Я не верю, что существует способ "для каждого запроса". (Вы можете использовать ключевое слово use, чтобы указать базу данных, а не схему, но это технически отдельный запрос, поскольку вы должны впоследствии выпустить команду go.)

Помните, что на SQL-сервере полные имена таблиц имеют формат:

[база]. [Схема]. [Таблица]

В SQL Server Management Studio вы можете настроить все параметры по умолчанию, о которых вы спрашиваете.

  • Вы можете настроить по умолчанию database для каждого пользователя (или в строке подключения):

    Безопасность > Логины > (щелкните правой кнопкой мыши) > Свойствa > Общие

  • Вы можете настроить по умолчанию schema для каждого пользователя (но я не верю, что вы можете настроить его в своей строке соединения, хотя, если вы используете dbo, который всегда является значением по умолчанию):

    Безопасность > Логины > (щелкните правой кнопкой мыши) > Свойствa > Пользовательское сопоставление > Схема по умолчанию

Короче говоря, если вы используете dbo для своей схемы, вы, вероятно, будете иметь наименьшее количество головных болей.

Ответ 3

То, что я иногда делаю, когда мне нужно много tablenames, я просто получаю их плюс их схему из системной таблицы INFORMATION_SCHEMA: Значение


select  TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)

Ответ 4

SETUSER может работать, имея пользователя, даже осиротевшего пользователя в БД с необходимой схемой по умолчанию. Но SETUSER в наследство не поддерживается навсегда. Таким образом, аналогичной альтернативой может быть установка роли приложения с необходимой схемой по умолчанию, если не требуется перекрестный доступ к БД, это должно работать как удовольствие.

Ответ 5

Очень старый вопрос, но так как Google привел меня сюда, я добавлю решение, которое мне показалось полезным:

Шаг 1. Создайте пользователя для каждой схемы, которую вам нужно использовать. Например. "User_myschema"

Шаг 2. Используйте EXECUTE AS для выполнения операторов SQL в качестве требуемого пользователя схемы.

Шаг 3. Используйте REVERT, чтобы вернуться к исходному пользователю.

Пример: Допустим, у вас есть таблица "mytable", присутствующая в схеме "otherschema", которая не является вашей схемой по умолчанию. Запуск "SELECT * FROM mytable" не будет работать.

Создайте пользователя с именем "user_otherschema" и задайте для этой пользовательской схемы по умолчанию значение "otherschema".

Теперь вы можете запустить этот скрипт для взаимодействия с таблицей:

EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT

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

Ссылка на документ EXECUTE AS: https://docs.microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017

Ответ 6

Попробуйте setuser. Пример

declare @schema nvarchar (256)
set @schema=(
  select top 1 TABLE_SCHEMA
  from INFORMATION_SCHEMA.TABLES
  where TABLE_NAME='MyTable'
)
if @schema<>'dbo' setuser @schema

Ответ 7

Другой способ добавления схемы динамически или, если вы хотите изменить ее на что-то другое

DECLARE @schema AS VARCHAR(256) = 'dbo.'
--User can also use SELECT SCHEMA_NAME() to get the default schema name


DECLARE @ID INT

declare @SQL nvarchar(max) = 'EXEC ' + @schema +'spSelectCaseBookingDetails @BookingID = '  + CAST(@ID AS NVARCHAR(10))

Не нужно приводить @ID, если это nvarchar или varchar

выполнить (@SQL)