IT

sql server 2005에서 데이터 손실 없이 테이블의 "스키마"를 변경하려면 어떻게 해야 합니까?

itgroup 2023. 6. 22. 21:41
반응형

sql server 2005에서 데이터 손실 없이 테이블의 "스키마"를 변경하려면 어떻게 해야 합니까?

"db_owner" 스키마에 들어간 테이블이 있는데, "dbo" 스키마에 테이블이 필요합니다.

이를 전환하기 위해 실행할 스크립트 또는 명령이 있습니까?

SQL Server Management Studio에서 다음을 수행합니다.

  1. 표를 마우스 오른쪽 버튼으로 클릭하고 수정을 선택합니다(지금은 "설계"라고 함).
  2. 속성 패널에서 올바른 소유 스키마를 선택합니다.
ALTER SCHEMA [NewSchema] TRANSFER [OldSchema].[Table1]

모두 표시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

간단한 대답

sp_changeobjectowner [ @objname = ] 'object' , [ @newowner = ] 'owner'

데이터베이스에 대한 모든 연결을 중지할 필요는 없습니다. 이 작업은 즉시 수행할 수 있습니다.

sAid의 훌륭한 답변에 약간의 개선은...

이 코드가 자동으로 실행되도록 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 관리 스튜디오 또는 비주얼 스튜디오 데이터 전송을 시도하는 데 몇 시간이 걸렸습니다.새 서버의 복원된 덤프에 대해 원하는 방식으로 이 작업을(를) 실행했습니다.

SQL Management Studio를 사용하면 '수정' 옵션이 표시되지 않고 '설계' 또는 '편집'만 표시됩니다.Visual Studio(VS.NET 2003, 2005 및 2008을 확인했습니다)가 있는 경우 서버 탐색기를 사용하여 스키마를 변경할 수 있습니다.테이블을 마우스 오른쪽 버튼으로 클릭하고 '디자인 테이블'(2008) 또는 '테이블 정의 열기'(2003, 2005)를 선택합니다.전체 "열 이름" 열을 강조 표시합니다.그런 다음 마우스 오른쪽 단추를 눌러 '속성 페이지' 또는 속성(2008)을 선택할 수 있습니다.속성 시트에서 가능한 스키마에 대한 드롭다운 목록이 있는 'Owner'(2003 & 2005) 또는 'Schema'(2008)를 볼 수 있습니다.

테이블 묶음이 다른 스키마(이 경우 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 )
;

먼저 데이터베이스에 대한 모든 연결을 중지하고 명령을 실행하여 'db_owner'인 테이블의 소유권을 변경해야 합니다.

sp_MSforeachtable @command1="sp_changeobjectowner ""?"",'dbo'"

여기서 ?는 테이블 이름입니다.

언급URL : https://stackoverflow.com/questions/89606/in-sql-server-2005-how-do-i-change-the-schema-of-a-table-without-losing-any-d

반응형