Установить схему по умолчанию для SQL-запроса
Есть ли способ установить схему для запроса, чтобы в остальной части запроса я мог ссылаться на таблицы только по их имени, не добавляя их с именем схемы?
Например, я хотел бы сделать что-то вроде этого:
Use [schemaName]
select * from [tableName]
в отличие от этого:
select * from [schemaName].[tableName]
Ответы
Ответ 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)