Agregar una llave primaria a una tabla existente

15/04/2009 - 17:17 por Ivan Rico | Informe spam
Hola a todos,

Tengo un sistema el cuál hay que hacerle unas cuantas modificaciones a su
diseño en la Base de Datos, (es un sql server 2005 ) y una de las tareas que
hare es agregar un índice a una tabla muy utilizada, por lo que he leído
debo hacerlo mediante comandos ya que lo he intentando desde el EM y marca
error, tal vez por que la tabla esta constantemente en uso, en fin este es
el código que pretendo ejecutar:


ALTER TABLE MENSAJES_RECIBIDOS
ADD ID_MENSAJE_RECIBIDO INT PRIMARY KEY IDENTITY

DROP INDEX IDX_ID_EQUIPO ON MENSAJES_RECIBIDOS
DROP INDEX MENSAJES_RECIBIDOS_INDEX ON MENSAJES_RECIBIDOS
DROP INDEX PK__MENSAJES_RECIBID__2FCC1EF8 ON MENSAJES_RECIBIDOS



CREATE CLUSTERED INDEX IDX_MENSAJE_RECIBIDO ON
MENSAJES_RECIBIDOS(ID_MENSAJE_RECIBIDO DESC)

CREATE NONCLUSTERED INDEX MENSAJES_RECIBIDOS_INDEX ON MENSAJES_RECIBIDOS
(ID_EQUIPO ASC, FECHA_RECEPCION DESC)

lo he ejecutado en la BD de pruebas y parece que todo va bien, por desgracia
la BD de prueba no tiene transacciones activas y por eso me queda la duda:

¿Qué va a pasar si ejecuto esto en la BD con transacciones activas
(insertar, actualizar o consultas)?
¿se pierden o se quedan como en espera hasta que se ejecute el script???

ya por último como se le puede hacer para el nuevo campo se agrege al
principio?

saludos a todos,

Iván Rico

Preguntas similare

Leer las respuestas

#6 Ivan Rico
16/04/2009 - 23:52 | Informe spam
si, no habrá problema por agregar el nuevo campo mientras tenga el IDENTITY
en ON.

sobre el orden era una mera curiosidad ya que en MySQL si se puede hacer eso
y quería saber como hacerlo en SQL Server.

en fin, con estos datos ya se como va a estar el asunto.

gracias por sus comentarios.

saludos

Ivan Rico

"Carlos Sacristan" <nomail> escribió en el mensaje
news:%
Jose Mariano, la clave primaria tiene la propiedad IDENTITY a ON, con lo
que no va a tener valores nulos.

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil. si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba

"Jose Mariano Alvarez"
escribió en el
mensaje news:
Durante la operacion del agregado de la columna tendras un problema ya
que esa columna no va a tener datos en los registros existentes por lo
que te dará error porque las PK no pueden tener valores nulos.

Recuerda que AL crear la Pk crea un indice por lo que es preferible
primero eliminarlos todos ya que quieres que sea CLustered segun veo en
tu script.

Te va a bloquear el acceso a toda la tabla durante el proceso.de creacion
de indices a menos que uses ONLINE ON.



Saludos


Ing. Jose Mariano Alvarez
http://blog.josemarianoalvarez.com/
Microsoft MVP
SQLTotal Consulting

(Cambia los ceros por O y saca lo que sobra)

Este mensaje se proporciona tal como es, SIN GARANTIAS de ninguna clase.
Por favor tratar de indicar la versión de SQL y Service Pack. La
inclusión de (CREATE, INSERTS, etc.) para poder reproducir el problema
también ayuda.










"Ivan Rico" wrote in message
news:
Hola,

Pero si lo llego a hacer en horario que no es de mantenimiento, que pasa
si se hace algun update o insert???
esa instrucción se ignora y se pierde o se queda en espera hasta que
termine???

"Maxi" escribió en el mensaje
news:
Hola, puede demorar la creacion de indices y el identoty dependiendo de
la cantidad de registros. Le recomiendo que programe este cambio en un
horario de mantenimiento



Maxi Accotto
Microsoft MVP en SQL Server
Consultor en SQL Server



"Ivan Rico" escribió en el mensaje de
noticias:
Hola a todos,

Tengo un sistema el cuál hay que hacerle unas cuantas modificaciones a
su diseño en la Base de Datos, (es un sql server 2005 ) y una de las
tareas que hare es agregar un índice a una tabla muy utilizada, por lo
que he leído debo hacerlo mediante comandos ya que lo he intentando
desde el EM y marca error, tal vez por que la tabla esta
constantemente en uso, en fin este es el código que pretendo ejecutar:


ALTER TABLE MENSAJES_RECIBIDOS
ADD ID_MENSAJE_RECIBIDO INT PRIMARY KEY IDENTITY

DROP INDEX IDX_ID_EQUIPO ON MENSAJES_RECIBIDOS
DROP INDEX MENSAJES_RECIBIDOS_INDEX ON MENSAJES_RECIBIDOS
DROP INDEX PK__MENSAJES_RECIBID__2FCC1EF8 ON MENSAJES_RECIBIDOS



CREATE CLUSTERED INDEX IDX_MENSAJE_RECIBIDO ON
MENSAJES_RECIBIDOS(ID_MENSAJE_RECIBIDO DESC)

CREATE NONCLUSTERED INDEX MENSAJES_RECIBIDOS_INDEX ON
MENSAJES_RECIBIDOS (ID_EQUIPO ASC, FECHA_RECEPCION DESC)

lo he ejecutado en la BD de pruebas y parece que todo va bien, por
desgracia la BD de prueba no tiene transacciones activas y por eso me
queda la duda:

¿Qué va a pasar si ejecuto esto en la BD con transacciones activas
(insertar, actualizar o consultas)?
¿se pierden o se quedan como en espera hasta que se ejecute el
script???

ya por último como se le puede hacer para el nuevo campo se agrege al
principio?

saludos a todos,

Iván Rico













email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida