Как изменить схему БД на dbo
Я импортировал несколько таблиц со старого сервера sql (2000) в базу данных 2008 года. Все импортированные таблицы имеют префикс моего имени пользователя, например: jonathan.MovieData
, В таблице properties
это списки jonathan
как схема БД. Когда я пишу хранимые процедуры, я теперь должен включить jonathan.
перед всеми именами таблиц, что сбивает с толку.
Как мне изменить все мои таблицы на dbo вместо jonathan?
Текущий результат: jonathan.MovieData
Желаемый результат: dbo.MovieData
10 ответов
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
Смотрите ALTER SCHEMA.
Обобщенный синтаксис:
ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Вы можете выполнить следующее, что сгенерирует набор операторов ALTER sCHEMA для всех ваших талбов:
SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'
Затем вы должны скопировать и запустить операторы в анализаторе запросов.
Вот более старый сценарий, который, по-моему, тоже сделает это за вас, поменяв владельца объекта. Хотя не пробовал в 2008 году.
DECLARE @old sysname, @new sysname, @sql varchar(1000)
SELECT
@old = 'jonathan'
, @new = 'dbo'
, @sql = '
IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
WHERE
QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
AND TABLE_SCHEMA = ''' + @old + '''
)
EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''
EXECUTE sp_MSforeachtable @sql
Получил это с этого сайта.
Это также говорит о том, чтобы сделать то же самое для хранимых процедур, если вам нужно.
USE MyDB;
GO
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;
GO
Ссылка: ALTER SCHEMA
Переместите таблицу из схемы dbo в MySchema:
ALTER SCHEMA MySchema TRANSFER dbo.MyTable
Переместите таблицу из MySchema в схему dbo:
ALTER SCHEMA dbo TRANSFER MySchema.MyTable
Я только что опубликовал это на похожий вопрос: в SQL Server 2005, как я могу изменить "схему" таблицы без потери каких-либо данных?
Небольшое улучшение превосходного ответа saeid...
Я добавил 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 Management Studio или Visual Studio передавать данные, чтобы изменить схему назначения... В итоге я просто запустил это с восстановленной дамп на новый сервер, чтобы получить вещи, как я хотел.
Вы можете пакетно изменять схемы нескольких объектов базы данных, как описано в этом посте:
Как изменить схему всех таблиц, представлений и хранимых процедур в MSSQL
У меня была похожая проблема, но моя схема имела обратную косую черту. В этом случае включите скобки вокруг схемы.
ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;
Откройте SQL-сервер как учетную запись SA и нажмите на новый запрос после ударных запросов
чем нажать кнопку "Выполнить", он откатит всю принадлежащую схему обратно в учетную запись SA
alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]
Способ сделать это для отдельной вещи:
изменить схему передачи данных dbo jonathan.MovieData
Мс -помощь: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm
ALTER SCHEMA имя_схемы ПЕРЕДАЧА
Используйте этот код, если вы хотите изменить все таблицы, представления и процедуры сразу.
BEGIN
DECLARE @name NVARCHAR(MAX)
, @sql NVARCHAR(MAX)
, @oldSchema NVARCHAR(MAX) = 'MyOldSchema'
, @newSchema NVARCHAR(MAX) = 'dbo'
DECLARE objCursor CURSOR FOR
SELECT o.name
FROM sys.objects o
WHERE type IN ('P', 'U', 'V')
OPEN objCursor
FETCH NEXT FROM objCursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER SCHEMA '+ @newSchema +' TRANSFER '+ @oldSchema + '.' + @name
BEGIN TRY
exec(@sql)
PRINT 'Success: ' + @sql
END TRY
BEGIN CATCH
PRINT 'Error executing: ' + @sql
END CATCH
FETCH NEXT FROM objCursor INTO @name
END
CLOSE objCursor
DEALLOCATE objCursor
КОНЕЦ
Он выполнит такой код
ALTER SCHEMA dbo TRANSFER MyOldSchema.xx_GetUserInformation