前言
我在SQL Server今天2008修改列,改变从类似货币(18,0)的数据类型为(19,2)。
我得到的错误从SQL Server“你已经要求下面的表格将被删除并重新创建的变化”。
之前,你争我夺的回答,请阅读以下内容:
我已经知道有在工具►选项►设计►表和数据库设计►取消选中该复选框选项“阻止保存需要表重新创建的变化。” ......所以不要与回答!
实际问题
我实际的问题是其他的东西,具体如下:
是否有这样做的任何负面影响/可能的缺点?
请问表实际上掉下来,当不选中此框会自动重现?
如果是这样,则表复制源表的100%的精确复制品?
该表仅下降,在情况下,这是SQL Server的管理工作室已经被编程为知道如何做到这一点的唯一方法重新创建。
当然,还有情况下,它会做,当它并不需要,但也将在那里修改,请在Management Studio中做出不删除并重新创建,因为它不必案件。
问题是,枚举所有的案件,并确定它们落在线的一侧将是相当繁琐的。
这就是为什么我喜欢使用ALTER TABLE
在查询窗口,而不是可视化设计器是隐藏他们在做什么(很坦率地说有错误) -我知道到底是什么事情发生,我可以为案件做准备,其中唯一的可能性是删除并重新创建表(比SSMS多久会这样对你少一些数量)。
工具- >选项- >设计师节点- >取消选中“禁止保存需要表休闲的变化”。
参考 -关闭该选项可以帮助您避免重新创建表,它还会导致丢失的变化。 例如,假设您启用SQL Server 2008中的更改跟踪功能来跟踪变化表。 当您执行导致要重新创建表的操作时,您将收到“症状”一节中提到的错误消息。 但是,如果您关闭此选项,现有的更改跟踪信息重新创建表时被删除。 因此,微软建议您不要通过关闭选项来解决这个问题。
SQL Server会删除并重新创建唯一的表,如果你:
- 添加新列
- 更改允许空值设置为列
- 更改表中列的顺序
- 更改列数据类型
使用ALTER是安全的,因为如果当你重新创建表中的元数据丢失,您的数据将会丢失。
是的,有从这个负面影响:
如果你编写脚本阻止这个标志的改变你喜欢的东西下面的脚本(我的全部转向接触的ID列到autonumbered IDENTITY列,但该表有依赖关系)。 请注意以下运行时可能出现的潜在错误:
- 即使是微软警告说,这可能会导致数据丢失(产生自该评论)!
- 一段时间后,外键都没有得到执行。
- 如果您手动运行该SSMS中和“EXEC(” INSERT INTO'失败,你让下面的语句运行(这是他们在默认情况下这样做,因为他们被分成‘走出去’),那么你将插入0行,再滴旧表。
- 如果这是一个大表,刀片的运行可能很大,交易持有一个架构修改锁,所以块多东西。
-
/* 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
文章来源: “Prevent saving changes that require the table to be re-created” negative effects