Зміна назви схеми таблиці в 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 SCHEMA exe 
    TRANSFER dbo.Employees

3
Чи можете ви пояснити, що таке функція sys.scemas та EXEC (...)?
Чемпіон

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

Для всіх таблиць перевірте це, і це зробити в одному висловлюванні, сподівання допоможе комусь.
shaijut

Використання схеми alter здається надзвичайно повільним. (Я зупинив її через 3 хвилини, щоб перенести невеликий стіл на 300 рядків.) Натомість я використав select * у exe.E Employees від dbo.E 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 я створив нову схему:

  • Натиснувши папку "Захист" в Провіднику об'єктів на моєму сервері,
  • Клацнувши правою кнопкою Схеми
  • Вибрано "Нова схема ..."
  • Назвав мою нову схему (наприклад, у вашому випадку)
  • Натисніть ОК

Я знайшов цю публікацію, щоб змінити схему, але також отримував ті ж помилки дозволів при спробі зміни на нову схему. У мене є кілька баз даних, перелічених у моїй 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.E Employees]
Ерік Дж. Ціна

ALTER SCHEMA (Назва схеми) TRANSFER (schemaName). (ObjectName);
djangojazz

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

0

Переконайтеся, що ви знаходитесь у правильному контексті бази даних у SSMS. Отримав таку ж помилку, що і ви, але я знав, що схема вже існує. Не зрозумів, що я в контексті "МАЙСТЕР". ALTER працював після того, як я змінив контекст до своєї бази даних.


0

У випадку, якщо хтось шукає нижчу версію -

Для SQL Server 2000:

sp_changeobjectowner @objname = 'dbo.E zaposess', @newowner = 'exe'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.