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

175

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

Пример:

ИЗ

dbo.Employees

К

exe.Employees

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

ALTER SCHEMA exe TRANSFER dbo.Employees

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

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

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

чемпион
источник
1
Существует ли exe-схема?
Джеймс Кулшоу
Нет, я не создал. Что я должен сделать, чтобы создать это?
Чемпион
запустите create schema: msdn.microsoft.com/en-US/library/ms189462%28v=sql.90%29.aspx
a_horse_with_no_name
Я видел эту статью, но это немного сбивает с толку. Можете ли вы показать мне, как создать схему в моей ситуации?
Чемпион

Ответы:

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
Pandian
источник
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
DevelopmentIsMyPassion
источник
Мне пришлось использовать, set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableчтобы убедиться, что некоторые специальные слова / символы не вызывают ошибку.
Стойнов
21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

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

Lauren
источник
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и выполните его

user2599599
источник
3
CREATE SCHEMA exe AUTHORIZATION [dbo]
GO

ALTER SCHEMA exe
TRANSFER dbo.Employees
GO
Дилип Кр Сингх
источник
0

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

exec sp_rename 'Nameofobject', 'ReNameofobject'
djangojazz
источник
1
К сожалению, в этом сценарии это не сработает, sp_rename работает только для изменения значения [name] объекта. Вы не можете изменить схему с ним. Если бы вы попробовали, exec sp_rename 'dbo.Employees', 'exe.Employees'вы бы получили имя [dbo]. [Exe.Employees]
Эрик Дж. Прайс
ALTER SCHEMA (имя схемы) TRANSFER (имя_схемы). (Имя_объекта);
djangojazz
Также обратите внимание, что при изменении схемы таблицы все представления, использующие эту таблицу , не будут обновляться. Вам нужно будет вручную обновить текст (имена схем) в этих представлениях. (Вздох ...)
Майк Гледхилл
0

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

billmack30
источник
0

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

Для SQL Server 2000:

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

iravinandan
источник