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

#1 Maxi
15/04/2009 - 17:20 | Informe spam
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

Respuesta Responder a este mensaje
#2 Ivan Rico
15/04/2009 - 17:46 | Informe spam
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

Respuesta Responder a este mensaje
#3 Carlos Sacristan
15/04/2009 - 19:22 | Informe spam
Si se hace en una tabla con muchas transacciones es normal que se produzcan
bloqueos, ralentizando la operación, pero no se perderán (a menos que tengas
un timeout de la operación muy bajo). En cualquier caso, deberías probar esa
situación simulando una carga que realice inserciones, actualizaciones y
borrados sobre una tabla similar en un entorno de pruebas. No es complicado
crearte una pequeña aplicación .NET que abra varios hilos que haga esas
operaciones y mientras crees los índices.

En cuanto al orden de la columna, eso no es posible hacerlo, a menos que
crees la tabla desde cero. En cualquier caso, no debería importarte el orden
de las columnas, ya que una tabla no es más que una agrupación de registros
que puedes ordenar como quieras. ¿Por qué quieres hacer eso?

"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

"Ivan Rico" escribió en el mensaje
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







Respuesta Responder a este mensaje
#4 Jose Mariano Alvarez
16/04/2009 - 02:57 | Informe spam
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







Respuesta Responder a este mensaje
#5 Carlos Sacristan
16/04/2009 - 10:56 | Informe spam
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







Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida