Изменить имя схемы таблицы в SQL


175

Я хочу изменить имя схемы таблицы Employeesв базе данных. В текущей таблице Employeesимя базы данных схемы dboя хочу изменить на exe. Как мне это сделать ?

Пример:

ИЗ

dbo.Employees

К

exe.Employees

Я пытался с этим запросом:

ALTER SCHEMA exe TRANSFER dbo.Employees

Но это дает мне ошибку:

Невозможно изменить схему exe, поскольку она не существует или у вас нет разрешения.

Что я пропустил?



1
Существует ли exe-схема?
Джеймс Кулшоу

Нет, я не создал. Что я должен сделать, чтобы создать это?
Чемпион


Я видел эту статью, но это немного сбивает с толку. Можете ли вы показать мне, как создать схему в моей ситуации?
Чемпион

Ответы:


272

Создать схему:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'exe')) 
BEGIN
    EXEC ('CREATE SCHEMA [exe] AUTHORIZATION [dbo]')
END

Схема ALTER:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
Можете ли вы объяснить, что такое sys.scemas и функция EXEC (...)?
Чемпион

10
sys.schemasтаблица, содержащая все схемы для базы данных Exec ('...') просто выполняет динамический вызов SQL, в этом случае это необходимо, потому что команда CREATE SCHEMA должна быть первым оператором в пакете запроса и выполняться, когда динамический SQL получает это.
Эрик Дж. Прайс

Для всех таблиц отметьте это и это, чтобы сделать это в одном утверждении, надеюсь, кому-то это поможет.
Shaijut

Использование измененной схемы кажется чрезвычайно медленным. (Я остановил его через 3 минуты для переноса небольшой таблицы с 300 строками.) Вместо этого я использовал select * into exe.Employees from dbo.Employees
fivelements

29

Попробуй ниже

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

Мне пришлось использовать, set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableчтобы убедиться, что некоторые специальные слова / символы не вызывают ошибку.
Стойнов

21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

Я всегда должен использовать скобки, когда я использую ALTER SCHEMAзапрос в SQL, или я получаю сообщение об ошибке.


5

Через SSMS я создал новую схему:

  • Щелкнув папку «Безопасность» в обозревателе объектов на моем сервере,
  • Схемы, нажимаемые правой кнопкой мыши
  • Избранная "Новая схема ..."
  • Названа моя новая схема (exe в вашем случае)
  • Хит ОК

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

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Ваш код:

FROM
 dbo.Employees
TO
 exe.Employees

Я пытался с этим запросом.

ALTER SCHEMA exe TRANSFER dbo.Employees

Просто напишите create schema exeи выполните его




0

Будьте очень, очень осторожны, переименовывая объекты в sql. Вы можете привести к сбою зависимостей, если вы не совсем уверены в том, что вы делаете. Сказав, что это работает легко (слишком много) для переименования вещей, если у вас есть правильный доступ к среде:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
К сожалению, в этом сценарии это не сработает, sp_rename работает только для изменения значения [name] объекта. Вы не можете изменить схему с ним. Если бы вы попробовали, exec sp_rename 'dbo.Employees', 'exe.Employees'вы бы получили имя [dbo]. [Exe.Employees]
Эрик Дж. Прайс

ALTER SCHEMA (имя схемы) TRANSFER (имя_схемы). (Имя_объекта);
djangojazz

Также обратите внимание, что при изменении схемы таблицы все представления, использующие эту таблицу , не будут обновляться. Вам нужно будет вручную обновить текст (имена схем) в этих представлениях. (Вздох ...)
Майк Гледхилл

0

Убедитесь, что вы находитесь в правильном контексте базы данных в SSMS. Получил ту же ошибку, что и вы, но я знал, что схема уже существует. Не понимал, что я был в «МАСТЕР» контексте. ALTER работал после того, как я изменил контекст моей базы данных.


0

В случае, если кто-то ищет более низкую версию -

Для SQL Server 2000:

sp_changeobjectowner @objname = 'dbo.Employess', @newowner = 'exe'

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.