문제

나는 sql 명령이나 tblfoo라는 테이블이있는 곳에서 이것을 할 수있는 일을 찾고 싶습니다. 그러나 기본 키도 변경되기를 원합니다. 예를 들어 현재는 다음과 같습니다.

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

그리고 이름 변경이 다음으로 변경되기를 원합니다.

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

그런 다음 재귀 적으로 진행 하여이 변경 사항이 최전된 주요 관계를 가진 모든 테이블에서 캐스케이드합니다. 이것으로부터:

CHECK ADD  CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])

이에:

 CHECK ADD  CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])

당연히, 나는 a) 오류가 발생하기 쉬운 프로세스이기 때문에 B) 확장되지 않기 때문에 수동으로이를 수행하지 않고 수동으로 수행하지 않습니다.

도움이 되었습니까?

해결책

이것은 내 머리 꼭대기에서 벗어나 완료되지 않습니다 (색인에 대한 유사한 코드를 추가해야합니다). 또한 동일한 기본 이름이있는 테이블에서 개체를 바꾸지 않도록 코드를 추가해야하지만 추가 문자 (예 :이 코드에는 TBLFOO2 및 관련 객체도 나열됩니다. 바라건대 그것은 당신을위한 시작입니다.

DECLARE
    @old_name   VARCHAR(100),
    @new_name   VARCHAR(100)

SET @old_name = 'tblFoo'
SET @new_name = 'tblFooBar'

SELECT
    'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + ''''
FROM dbo.sysobjects
WHERE name LIKE '%' + @old_name + '%'

다른 팁

Tom의 좋은 답변
인덱스를 포함하도록 그의 쿼리를 여기에서 확장했습니다

declare
 @old nvarchar(100),
 @new nvarchar(100)

set @old = 'OldName'
set @new = 'NewName'

select 'EXEC sp_rename ''' + name + ''', ''' + 
  REPLACE(name, @old, @new) + ''''
 from sys.objects 
 where name like '%' + @old + '%'
union -- index renames
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name)  +  ''', ''' +
  REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX'''
  from sys.objects 
   left join sys.indexes on sys.objects.object_id = sys.indexes.object_id
  where sys.indexes.name like '%' + @old + '%'

이름 바꾸기 테이블의 고통을 빼앗아가는 훌륭한 도구는 다음과 같습니다. 레드 게이트 SQL 리팩터그것은 당신의 의존성을 자동으로 찾아서 당신을 위해 모든 것을 작동시킬 것입니다.

큰 팬 :-)

SQL Server는 내가 알고있는 한 직접이 작업을 수행하지 않습니다. 변경 사항을 수행하려면 스크립트를 수동으로 작성해야합니다. 이는 테이블 정의에 대한 SQL을 생성하고 (SSMS가이를 수행 할 것입니다) 이름을 검색하고 교체함으로써 달성 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top