sql server - saving - "Evite guardar cambios que requieran que la tabla se vuelva a crear" efectos negativos
prevent saving changes sql server (5)
La tabla solo se elimina y vuelve a crearse en los casos en que esa es la única forma en que Management Studio de SQL Server ha sido programado para saber cómo hacerlo.
Ciertamente, hay casos en los que hará eso cuando no sea necesario, pero también habrá casos en los que las ediciones que realice en Management Studio no se eliminarán ni volverán a crearse porque no es necesario.
El problema es que enumerar todos los casos y determinar en qué lado de la línea caerán será bastante tedioso.
Por eso me gusta usar ALTER TABLE
en una ventana de consulta, en lugar de diseñadores visuales que ocultan lo que están haciendo (y francamente tienen errores). Sé exactamente lo que va a suceder, y puedo prepararme para los casos en los que la única posibilidad es eliminar y volver a crear la tabla (que es un número menor que la frecuencia con que SSMS le hará eso).
Preámbulo
Hoy estaba modificando una columna en SQL Server 2008, cambiando el tipo de datos de algo así como la moneda (18,0) a (19,2).
Recibí el error "Los cambios que ha realizado requieren que las siguientes tablas se eliminen y se vuelvan a crear" de SQL Server.
Antes de que luches por responder, lee lo siguiente:
Ya sé que existe la opción en Herramientas ► Opciones ► Diseñador ► Diseñadores de tablas y bases de datos ► Desmarque la casilla "Evitar guardar los cambios que requieren la recreación de tablas" ... entonces no respondas con eso!
Pregunta actual
Mi pregunta real es para otra cosa, como sigue:
¿Hay efectos negativos / posibles inconvenientes de hacer esto?
¿La tabla realmente se cae y se vuelve a crear automáticamente cuando esta casilla no está marcada?
Si es así, ¿es la tabla copia una réplica exacta al 100% de la tabla de origen?
Sí, hay efectos negativos de esto:
Si ejecuta una secuencia de comandos de un cambio bloqueado por este indicador, obtendrá algo como la siguiente secuencia de comandos (todo esto está convirtiendo la columna de ID en Contacto en una columna de IDENTIDAD autonumerada, pero la tabla tiene dependencias). Tenga en cuenta los posibles errores que pueden ocurrir mientras se ejecuta lo siguiente:
- Incluso Microsoft advierte que esto puede causar la pérdida de datos (ese comentario se genera automáticamente).
- Durante un período de tiempo, las claves foráneas no se aplican.
- si lo ejecuta manualmente en ssms y falla ''EXEC ('' INSERT INTO '', y deja que se ejecuten las siguientes instrucciones (que lo hacen de forma predeterminada, ya que están divididas por'' go ''), entonces insertará 0 filas y luego las eliminará. la mesa vieja
- Si esta es una tabla grande, el tiempo de ejecución de la inserción puede ser grande, y la transacción mantiene un bloqueo de modificación de esquema, por lo que bloquea muchas cosas.
-
/* 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
SQL Server descarta y vuelve a crear las tablas solo si usted:
- Añadir una nueva columna
- Cambiar la configuración de Permitir valores nulos para una columna
- Cambiar el orden de las columnas en la tabla.
- Cambiar el tipo de datos de la columna.
Usar ALTER es más seguro, ya que en caso de que se pierdan los metadatos mientras vuelve a crear la tabla, se perderán sus datos.
Reference : desactivar esta opción puede ayudarlo a evitar volver a crear una tabla, y también puede provocar la pérdida de cambios. Por ejemplo, suponga que habilita la función de seguimiento de cambios en SQL Server 2008 para realizar un seguimiento de los cambios en la tabla. Cuando realiza una operación que hace que la tabla se vuelva a crear, recibirá el mensaje de error que se menciona en la sección "Síntomas". Sin embargo, si desactiva esta opción, la información de seguimiento de cambios existente se elimina cuando se vuelve a crear la tabla. Por lo tanto, Microsoft recomienda que no solucione este problema desactivando la opción.
Herramientas -> Opciones -> Nodo de diseñadores -> Desmarque " Evitar guardar cambios que requieran recreación de tablas ".