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





ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]
Это не похоже на переименование таблицы в SQL Server Management Studio с OldSchema.Table1 на NewSchema.Table1.
Вы обновили список таблиц? Я обнаружил, что Management Studio имеет тенденцию не обновлять список базы данных, чтобы отразить изменения, выполненные через tsql (в отличие от выбора таблицы и использования встроенных инструментов), если вы не заставляете это делать. Или отключаешь / подключаешься заново.
Ага. это определенно просто визуальная вещь, хотя SQL Server заставляет меня поверить, что это не так. После выполнения команды и обновления и еще много чего, если вы щелкните правой кнопкой мыши таблицу в режиме конструктора, а затем измените схему с oldSchema на newSchema в окне свойств, тогда имя таблицы будет обновлено (вместе с предупреждающим сообщением). Я просто надеюсь, что это будет GUI-эквивалентом вашей команды, а не чем-то совершенно другим. Есть ли способ проверить?
В SQL Server Management Studio:
спасибо, забавно, если вы просто щелкните правой кнопкой мыши -> свойства, схема не изменится, поэтому я предположил, что это была одна из тех командных задач только ниндзя. Рад знать, что это не так больно, как казалось.
Модификация может называться «Дизайн» в зависимости от используемой версии SQL Server Management Studio.
Если вы видите только окно «Свойства столбца». Перейдите в Просмотр и выберите «Окно свойств». После редактирования не забудьте сохранить изменения.
Вам нужно сначала остановить все подключения к базе данных, изменить владельца таблиц, которые являются 'db_owner', выполнив команду
sp_MSforeachtable @command1 = "sp_changeobjectowner ""?"",'dbo'"
куда ? это имя таблицы.
процедура sp_changedbowner устарела, а sp_MSforeachtable не заслуживает доверия, как и sp_MSforeachdatabase. Я использовал версию Бертрана
простой ответ
sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'
вам не нужно останавливать все подключения к базе данных, это можно сделать на лету.
Технически да. Тем не менее, он все еще в Денали и отлично работает для того, что просил сделать OP. Они всегда говорят, что собираются удалить его, но никогда этого не делают.
Когда я использую SQL Management Studio, у меня нет опции «Изменить», только «Дизайн» или «Редактировать». Если у вас есть Visual Studio (я проверял VS.NET 2003, 2005 и 2008), вы можете использовать Server Explorer для изменения схемы. Щелкните правой кнопкой мыши по таблице и выберите «Design Table» (2008) или «Open Table Definition» (2003, 2005). Выделите весь столбец «Имя столбца». Затем вы можете щелкнуть правой кнопкой мыши и выбрать «Страницы свойств» или «Свойства» (2008). На странице свойств вы должны увидеть «Владелец» (2003 и 2005) или «Схема» (2008) с раскрывающимся списком возможных схем.
Показать все TABLE_SCHEMA с помощью этого выбора:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
Вы можете использовать этот запрос, чтобы изменить всю схему для всех таблиц на схему таблицы dbo:
DECLARE cursore CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA <> 'dbo'
DECLARE @schema sysname,
@tab sysname,
@sql varchar(500)
OPEN cursore
FETCH NEXT FROM cursore INTO @schema, @tab
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER SCHEMA dbo TRANSFER ' + @schema + '.' + @tab
PRINT @sql
FETCH NEXT FROM cursore INTO @schema, @tab
END
CLOSE cursore
DEALLOCATE cursore
Это прекрасно работает. Обратите внимание, что PRINT @sql следует заменить на EXEC(@sql).
Я использую это в ситуациях, когда несколько таблиц должны находиться в другой схеме, в данном случае - схеме dbo.
declare @sql varchar(8000)
;
select
@sql = coalesce( @sql, ';', '') + 'alter schema dbo transfer [' + s.name + '].[' + t.name + '];'
from
sys.tables t
inner join
sys.schemas s on t.[schema_id] = s.[schema_id]
where
s.name <> 'dbo'
;
exec( @sql )
;
Улучшение слабый отличного ответа Саида ...
Я добавил exec, чтобы этот код самовыполнялся, и я добавил объединение вверху, чтобы я мог изменить схему обеих таблиц И хранимых процедур:
DECLARE cursore CURSOR FOR
select specific_schema as 'schema', specific_name AS 'name'
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> 'dbo'
UNION ALL
SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA <> 'dbo'
DECLARE @schema sysname,
@tab sysname,
@sql varchar(500)
OPEN cursore
FETCH NEXT FROM cursore INTO @schema, @tab
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']'
PRINT @sql
exec (@sql)
FETCH NEXT FROM cursore INTO @schema, @tab
END
CLOSE cursore
DEALLOCATE cursore
Мне тоже пришлось восстановить dbdump, и я обнаружил, что схема не dbo - я потратил часы, пытаясь заставить студию управления Sql Server или передачу данных визуальной студии изменить схему назначения ... Я просто запустил это против восстановленного дамп на новом сервере, чтобы все было так, как я хотел.
Отличный ответ! +1 за включение подпрограмм. Моя БД тоже содержала их. Существуют также системные объекты VIEWs и FUNCTIONs, у которых есть поле схемы. Но в моем случае все они были в схеме dbo.
Педантизм: * проигрыш Пожалуйста, исправьте.