transact tabla saving requieren recreación realizado que prevent permitted permitir permite not modificar los impedir guardar columna changes cambios sql-server sql-server-2008 database-design sql-server-2005

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:

  1. Incluso Microsoft advierte que esto puede causar la pérdida de datos (ese comentario se genera automáticamente).
  2. Durante un período de tiempo, las claves foráneas no se aplican.
  3. 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
  4. 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 ".