2011-09-28 2 views
0

가 단 한 번의 가장 좋은 대답하지만, 여기에 문제가있는 경우 가장 좋은 방법은이 작업을 수행하거나하지 않도록 : 나는에서 구성된 SQL Server 2000 데이터베이스를이 나는 ​​테이블의 고유 ID 열을 변경해야

최소 13 개의 테이블. 테이블 중 일부에는 고유 한 ID (SysName)가있어 유일한 SysName 값 (alpha001, alpha002, alpha003 등)이 하나만있을 수 있습니다.

지금까지 나와 함께?

이제 클라이언트는 데이터베이스에 여러 개의 sysnames 값 (alpha001, alpha001, alpha001, alpha002, alpha002, alpha003, alpha003, alpha003, alpha003, alpha003 등)을 삽입 할 수 있기를 원합니다. 그 중 하나의 테이블에서 sysname (alpha001에서 beta001)의 값을 변경하면 다른 테이블의 값도 업데이트됩니다 (지금이 순간에 호출되는 것에 대해 두려움을 느끼고 있습니다) .

새 열 (SysNameID)을 추가하고 자동 증가로 설정하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 데이터베이스를 통과하여 테이블을 다시 작성할 필요가 없도록 SysNameID 값 (1,2,3,4,5,6 ...)을 추가하는 것입니다.

나는 영향을받는 모든 테이블에 SysNameID 열을 추가하고 데이터 무결성 목적으로 상관 관계를 유지하기 위해 테이블간에 (두뇌 방귀 용어)를 설정해야한다고 생각합니다.

요청이 명확하지 않은 경우 의견을 남겨 주시면 최대한 답변을 드리겠습니다. 너희 중 몇 명은 매우 영리해서 나를 위해 그것을 바보 취급해야 할 수도있다. 예, 당신은 쉽게 테이블에 자동 증가 열을 추가 할 수 있습니다 (: :)

+1

계단식 업데이트는 당신의 두뇌 방귀에 대한 –

+0

@ 주권-더 YES를 무엇이다! 고맙습니다! – HPWD

답변

3

기본 과정 : 당신은 현재 백업을 가지고 통해없이 자극에이 작업을 수행하지 않도록

이 확인 t은 적어도 삽입되는 중복 값을 방지하기 위해 컬럼에 UNIQUE 제약 조건을 넣어 먼저 개발에 대한 테스트. 이것은 매우 광범위한 변경 사항입니다, 당신은 새로운 dev 인스턴스로 복원하는 것이 좋습니다. 왜냐하면 시간이 오래 걸리고 까다 롭고 다른 개발 작업도 간섭을 받기 때문입니다.

당신은 또한 SysNameId라는 각각의 자식 테이블에있는 int 열을 추가 (자세한 내용은 @marc_s '대답을 참조)

SysNameID라는 부모 테이블에 ID 열을 추가합니다. 자동 증가 열이 아니며 널 (null)을 허용해야합니다.

현재 sysname 열을 사용하여이 열을 업데이트하면 해당 sysname으로 식별 된 ID를 찾을 수 있습니다.

모든 열이 채워지면 열을 NULL을 허용하지 않도록 설정하고 상위 테이블에 대한 외래 키를 만듭니다. 서로 게이트 키가 변경되어서는 안되기 때문에 캐스케이드 업데이트가 필요합니다.

마지막으로 자식 테이블에서 sysname 열을 삭제하고이를 사용하는 모든 코드를 부모 테이블에 조인하여 조회합니다. 또는 각 하위 테이블의 이름을 바꾸고 자식 테이블을 부모 테이블에 조인하고 거기에서 sysname 열을 가져 오는보기를 만듭니다. 기존 코드가 손상되지 않도록해야합니다.

귀하의 요구 사항을 충족하는 간단한 방법은 없습니다. 데이터베이스가 작동하는 방식의 근본을 바꾸고 있습니다. 그것은 자식 테이블에 대한 거의 모든 쿼리에 영향을 줄 가능성이 있습니다. 보고서에 영향을 미칠 수 있습니다 (더 이상 고유하지 않은 sysname으로 정렬 될 가능성이 높음). 이것은 중요한 변화이며 제대로 수행하려면 몇 달이 걸릴 수 있습니다.

연구 교재 :! http://www.amazon.com/Refactoring-Databases-Evolutionary-Database-Design/dp/0321293533/ref=sr_1_1?ie=UTF8&s=books&qid=1268158669&sr=8-1

+0

@glgem - 제가 여기서 일하는 것을 확실히 이해하고 계십니다. 그것을 해체 해줘서 고마워. 나는 뷰를 사용하는 것에 대해 생각하지 않았기 때문에 뷰를 살펴볼 수 있습니다. 나는 정확한 답을 표시하고 있지만 해결책을 위해 marc_s를 보는 주석을 추가 할 것입니다. – HPWD

+0

SQL 문에 대한 marc_s POST를 보시기 바랍니다. – HPWD

+1

책의 사본을 받고 읽으면이 과정을 많이 디자인하는 데 도움이됩니다. – HLGEM

3

나는 완전히

하지만 두 번째 부분

.... 질문/도전은 현재 sysname 열이 무엇인지 이해하지 못하는 SQL Server는 자동 증가 값으로 기존 행을 채 웁니다. $

(예 : "테이블 다시 작성"과 같은) - 아무것도 수행 할 필요가 없습니다.
ALTER TABLE dbo.YourTableNameHere 
    ADD SysNameID INT IDENTITY(1,1) NOT NULL 

일반적으로 IDENTITY 열을 테이블의 기본 (클러스터 된) 키로 만들 것을 권장합니다. 그렇지 않은 경우

ALTER TABLE dbo.YourTableNameHere 
    ADD CONSTRAINT UC_SysNameID UNIQUE(SysNameID) 
+0

@ marc-s 기존 테이블에 ID를 추가하려고 시도했을 때 Studio를 사용하여 테이블을 다시 작성해야한다고했습니다. 메시지를 다시 받으면 참조 용으로 게시 할 것입니다. – HPWD

+0

@dlackey : OK - hmm ... 시각적 디자이너에서이 열을 추가 했습니까? 나는 T-SQL 스크립트를 독점적으로 사용하는 경향이있다. 그런 접근법과 같은 메시지는 전혀 없었다. ... –

+0

@ marc-s 아니요, Microsoft SQL Server Manager Studio 2008을 사용하여 SQL2000 데이터베이스에 연결했습니다. 테이블을 찾아서 마우스 오른쪽 버튼으로 클릭하고 디자인을 클릭 한 다음 필요한 열을 추가합니다. – HPWD