[sql-server] “테이블을 다시 작성해야하는 변경 내용 저장 방지”부정적인 영향

전문

오늘 SQL Server 2008에서 열을 수정하여 데이터 유형을 currency (18,0)에서 (19,2)로 변경했습니다.

SQL Server에서 “변경 내용을 변경 한 후 다음 테이블을 삭제하고 다시 만들어야합니다”라는 오류가 발생했습니다.

답을 구하기 전에 다음을 읽으십시오.

이미 도구 ► 옵션 ► 디자이너 ► 테이블 및 데이터베이스 디자이너에 있는 옵션이 있다는 것을 알고 있습니다 .
다섯 번의 클릭으로 테이블을 다시 작성해야하는 변경 내용 저장 방지
… 그렇게 대답 하지 마십시오 !

실제 질문

내 실제 질문은 다음과 같은 다른 것입니다.

이 작업을 수행 할 때 부정적인 영향 / 가능한 단점이 있습니까?

이 상자를 선택 해제하면 실제로 테이블이 자동으로 삭제되고 다시 작성됩니까?

그렇다면, 테이블 사본이 소스 테이블의 100 % 정확한 복제본입니까?



답변

SQL Server의 Management Studio가 작업 방법을 알도록 프로그래밍 된 유일한 방법 인 경우에만 테이블을 삭제하고 다시 만듭니다.

그것이이 필요하지 않을 때 그렇게하는 경우가 분명히있다,뿐만 아니라 관리 Studio에서 당신이 만드는 편집이됩니다 경우가있을 것입니다 하지 드롭과가 없기 때문에 재 만듭니다.

문제는 모든 사례를 열거하고 그들이 어느 라인에 있는지 결정하는 것이 매우 지루하다는 것입니다.

이것이 내가 ALTER TABLE하고있는 일을 숨기고 (솔직히 버그가있는) 시각 디자이너 대신 쿼리 창에서 사용하는 이유입니다. 무슨 일이 일어날 지 정확히 알고 있으며 유일한 가능성이있는 경우를 대비할 수 있습니다 테이블을 삭제하고 다시 작성하는 것입니다 (SSMS가이를 수행하는 빈도보다 적은 수임).


답변

도구-> 옵션-> 디자이너 노드-> “ 테이블 재생이 필요한 변경 사항 저장 방지 “를 선택 취소 하십시오 .


답변

참조 -이 옵션을 해제하면 테이블을 다시 만들지 않아도되고 변경 내용이 손실 될 수 있습니다. 예를 들어 SQL Server 2008의 변경 내용 추적 기능을 사용하여 테이블의 변경 내용을 추적한다고 가정합니다. 테이블을 다시 만드는 작업을 수행 할 때 “현상”절에서 설명한 오류 메시지가 나타납니다. 그러나이 옵션을 끄면 테이블을 다시 만들 때 기존 변경 내용 추적 정보가 삭제됩니다. 따라서이 옵션을 해제하여이 문제를 해결하지 않는 것이 좋습니다.


답변

SQL Server는 다음과 같은 경우에만 테이블을 삭제하고 다시 만듭니다.

  • 새 열 추가
  • 열에 대해 Null 허용 설정 변경
  • 표에서 열 순서 변경
  • 열 데이터 유형 변경

테이블을 다시 생성하는 동안 메타 데이터가 손실되는 경우 데이터가 손실되므로 ALTER를 사용하는 것이 더 안전합니다.


답변

예, 이로 인해 부정적인 영향이 있습니다.

이 플래그에 의해 차단 된 변경 사항을 스크립팅하면 아래 스크립트와 같은 것이 나타납니다 (접점의 ID 열을 자동 번호가 지정된 IDENTITY 열로 바꾸고 있지만 테이블에는 종속성이 있음). 다음을 실행하는 동안 발생할 수있는 잠재적 오류에 유의하십시오.

  1. 마이크로 소프트조차도 이것이 데이터 손실을 일으킬 수 있다고 경고합니다 (해설은 자동 생성됩니다)!
  2. 일정 기간 동안 외래 키는 적용되지 않습니다.
  3. ssms에서 수동으로이를 실행하고 ‘EXEC (‘INSERT INTO ‘가 실패하고 다음 명령문을 실행하도록 설정하면 (기본적으로’go ‘로 나눠 짐) 0 행을 삽입 한 다음 삭제합니다. 이전 테이블.
  4. 이것이 큰 테이블 인 경우 삽입의 런타임이 클 수 있고 트랜잭션이 스키마 수정 잠금을 보유하므로 많은 것을 차단 합니다.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/

BEGIN TRANSACTION
GO
ALTER TABLE raw.Contact
    DROP CONSTRAINT fk_Contact_AddressType
GO
ALTER TABLE ref.ContactpointType SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.Contact
    DROP CONSTRAINT fk_contact_profile
GO
ALTER TABLE raw.Profile SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE raw.Tmp_Contact
    (
    ContactID int NOT NULL IDENTITY (1, 1),
    ProfileID int NOT NULL,
    AddressType char(2) NOT NULL,
    ContactText varchar(250) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE raw.Tmp_Contact SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT raw.Tmp_Contact ON
GO
IF EXISTS(SELECT * FROM raw.Contact)
     EXEC('INSERT INTO raw.Tmp_Contact (ContactID, ProfileID, AddressType, ContactText)
        SELECT ContactID, ProfileID, AddressType, ContactText FROM raw.Contact WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT raw.Tmp_Contact OFF
GO
ALTER TABLE raw.PostalAddress
    DROP CONSTRAINT fk_AddressProfile
GO
ALTER TABLE raw.MarketingFlag
    DROP CONSTRAINT fk_marketingflag_contact
GO
ALTER TABLE raw.Phones
    DROP CONSTRAINT fk_phones_contact
GO
DROP TABLE raw.Contact
GO
EXECUTE sp_rename N'raw.Tmp_Contact', N'Contact', 'OBJECT'
GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    Idx_Contact_1 PRIMARY KEY CLUSTERED
    (
    ProfileID,
    ContactID
    )

GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    Idx_Contact UNIQUE NONCLUSTERED
    (
    ProfileID,
    ContactID
    )

GO
CREATE NONCLUSTERED INDEX idx_Contact_0 ON raw.Contact
    (
    AddressType
    )
GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    fk_contact_profile FOREIGN KEY
    (
    ProfileID
    ) REFERENCES raw.Profile
    (
    ProfileID
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION

GO
ALTER TABLE raw.Contact ADD CONSTRAINT
    fk_Contact_AddressType FOREIGN KEY
    (
    AddressType
    ) REFERENCES ref.ContactpointType
    (
    ContactPointTypeCode
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION

GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.Phones ADD CONSTRAINT
    fk_phones_contact FOREIGN KEY
    (
    ProfileID,
    PhoneID
    ) REFERENCES raw.Contact
    (
    ProfileID,
    ContactID
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION

GO
ALTER TABLE raw.Phones SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.MarketingFlag ADD CONSTRAINT
    fk_marketingflag_contact FOREIGN KEY
    (
    ProfileID,
    ContactID
    ) REFERENCES raw.Contact
    (
    ProfileID,
    ContactID
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION

GO
ALTER TABLE raw.MarketingFlag SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE raw.PostalAddress ADD CONSTRAINT
    fk_AddressProfile FOREIGN KEY
    (
    ProfileID,
    AddressID
    ) REFERENCES raw.Contact
    (
    ProfileID,
    ContactID
    ) ON UPDATE  NO ACTION
     ON DELETE  NO ACTION

GO
ALTER TABLE raw.PostalAddress SET (LOCK_ESCALATION = TABLE)
GO
COMMIT


답변