db 스키마를 dbo로 변경하는 방법


115

이전 SQL 서버 (2000)에서 2008 데이터베이스로 여러 테이블을 가져 왔습니다. 가져온 모든 테이블에는 내 사용자 이름이 접두사로 붙습니다 (예 : jonathan.MovieData. 테이블 properties에는 jonathandb 스키마로 나열 됩니다. 저장 프로 시저를 작성할 때 jonathan.혼란스러운 모든 테이블 이름 앞에 포함해야합니다 .

모든 테이블을 조나단 대신 dbo로 변경하려면 어떻게해야합니까?

현재 결과 : jonathan.MovieData

원하는 결과 : dbo.MovieData

답변:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

ALTER SCHEMA를 참조하십시오 .

일반화 된 구문 :

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
Google 직원을위한 시간 절약 : ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
— Co7e

1
사용자에게 백 슬래시가있는 경우 다음을 실행하십시오. ALTER SCHEMA dbo TRANSFER "DOMAIN \ user".tableName
— PatricF

@PatricF 인용 식별자 규칙은 다른 이름과 마찬가지로 스키마 이름에 적용됩니다 [DOMAIN\user].[tableName]. 일반적으로 SQL Server 커뮤니티에서는 Transact-SQL 인용 식별자가 사용됩니다 ( [및 ]) ". 특정 요구 사항이없는 한 피 하십시오.
— Remus Rusanu 2016 년

그가 내 모든 테이블을 요청 했을 때 이것 과 이것을 확인 하여 하나의 문장으로 수행하면 희망이 도움이됩니다.
— shaijut

2
@leigero 사용 [과 ]다른 경우처럼, 당신은 SQL 오브젝트 이름에 대한 정확하고 싶을 때. [domain\user123].TableName.
— 레무스 Rusanu

40

다음을 실행하면 모든 탈브에 대한 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

이 사이트 에서 가져 왔습니다. .

필요한 경우 저장된 procs에 대해 동일한 작업을 수행하는 것에 대해서도 설명합니다.


두 번째 비트는 소용이 없었지만 링크 덕분에 조사해 보겠습니다.
— jonathan hall

위의 INFORMATION_SCHEMA 선택을 사용하여 모든 ALTER SCHEMA 문을 자동으로 생성 할 수 없습니까?
— patmortech

INFORMATION_SCHEMA.TABLES 설명서 에서 다음 인용문을 참고하십시오 . " 중요 개체의 스키마를 확인하는 데 INFORMATION_SCHEMA 뷰를 사용하지 마십시오. 개체의 스키마를 찾는 유일한 방법은 sys.objects 카탈로그 뷰를 쿼리하는 것입니다." 따라서 sys.tables대신 사용하도록 예제를 다시 작성해야합니다 (sys.objects의 하위 집합).
— Heinzi


15

dbo 스키마에서 MySchema로 테이블을 이동합니다.

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


MySchema에서 dbo 스키마로 테이블 이동 :

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

방금 비슷한 질문에이 글을 올렸습니다 . SQL Server 2005에서 데이터 손실없이 테이블의 "스키마"를 어떻게 변경합니까?


약간 압라의 훌륭한 대답 개선 ...

이 코드가 자체 실행되도록 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 데이터 전송을 가져와 대상 스키마를 변경하는 데 몇 시간을 보냈습니다. 내가 원하는 방식으로 물건을 얻기 위해 새 서버에 덤프하십시오.


치료 효과가 있습니다. 감사.
— bgx



2

비슷한 문제가 있었지만 내 스키마에는 백 슬래시가 있습니다. 이 경우 스키마 주위에 대괄호를 포함하십시오.

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;

2

SQL Server를 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]

1

ms-help : //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA schema_name TRANSFER securable_name

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.