「テーブルの再作成を必要とする変更の保存を防ぐ」マイナスの影響


255

前文

今日SQL Server 2008で列を変更し、データ型をcurrency(18,0)などから(19,2)に変更しました。

SQL Serverから、「行った変更には、次のテーブルを削除して再作成する必要があります」というエラーが表示されました。

解答する前に、以下をお読みください。

[ ツール]► [オプション] ►[デザイナー]►[テーブルおよびデータベースデザイナー ]にオプションがあることをすでに知っています。 5回のクリックでテーブルの再作成が必要な変更を保存しない ...だから答えないで!

実際の質問

私の実際の質問は、次のように何か他のものです:

これを行うことの悪影響/考えられる欠点はありますか?

このボックスをオフにすると、テーブルは実際に削除されて自動的に再作成されますか?

その場合、テーブルはソーステーブルの100%正確なレプリカをコピーしていますか?


65
[ツール]> [オプション]> [デザイナー...]を探していました。ありがとう!
nrod 2013


2
MS SQL Server 2014を使用している場合-> Extras> Options> Designerトップメニューから。
Vityata 16

回答:


89

このテーブルは、SQL ServerのManagement Studioがその方法を知るようにプログラムされている唯一の方法である場合にのみ、削除および再作成されます。

必要のないときにそうするケースは確かにありますが、Management Studioで行った編集はドロップする必要がないためにドロップおよび再作成されない場合もあります。

問題は、すべてのケースを列挙して、どちらに当てはまるかを判断するのが非常に面倒になることです。

これが、私がALTER TABLEクエリウィンドウで使用するのが好きな理由です。ビジュアルデザイナが行っていることを非表示にするのではなく(そして率直に言ってバグがあります)、私は何が起こるかを正確に理解しており、唯一の可能性がある場合に備えることができますテーブルを削除して再作成することです(これは、SSMSがそれを行う頻度よりも少ない数です)。


5
本当に良い答えですが、OPによって提起されたすべての質問に対する答えを提供するものではないと感じています。実際、それらの質問は私が興味を持っているものです。特に、これを行うことの悪影響/考えられる欠点はありますか?そしてもしそうなら、テーブルは、ソース表の100%正確なレプリカをコピーしていますか?。これらの質問に関する情報はありますか?
tfrascaroli 2017年


12

参考 -このオプションをオフにすると、テーブルの再作成を回避でき、変更が失われる可能性もあります。たとえば、SQL Server 2008の変更追跡機能を有効にして、テーブルへの変更を追跡するとします。テーブルを再作成する操作を実行すると、「現象」に記載されているエラーメッセージが表示されます。ただし、このオプションをオフにすると、テーブルが再作成されるときに既存の変更追跡情報が削除されます。したがって、このオプションをオフにしてこの問題を回避しないことをお勧めします。


11

SQL Serverは、次の場合にのみ、テーブルを削除して再作成します。

  • 新しい列を追加する
  • 列のnullを許可する設定を変更する
  • テーブルの列の順序を変更する
  • 列のデータ型を変更する

テーブルの再作成中にメタデータが失われる場合があるため、ALTERの使用はより安全です。データは失われます。


8
あなたのリストは完全ではありません。IDENTITYたとえば、列のプロパティを追加/削除します。
アーロンベルトラン2013年

2
NULLABLEであるフィールドの最後に新しい列を追加しても、テーブルを再構築する必要はありません。
PseudoToad 2014

2

はい、これにはマイナスの影響があります:

このフラグによってブロックされた変更をスクリプト化すると、以下のスクリプトのようになります(Contactの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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.