jueves, 7 de noviembre de 2013

Modificar campos de una tabla ya creada en SQL Server

Crear una tabla en SQL SERVER es sencillo, ya se explicó en Crear una tabla en SQL Server Si la tabla ya está creada y sólo queremos modificar la longitud de un campo, su nombre o eliminarlo tenemos que hacerlo mediante scripts de texto, pero es muy sencillo basta escribir estas líneas en el analizador de consultas y pulsar el botón ejecutar.

Para modificar la longitud del campo: (le ponemos 50 Por ejemplo)

ALTER TABLE PROPIETARIO.Nombre_Tabla ALTER COLUMN Nombre_Columna char(50) NULL

Al final se especifica si el campo permite nulos NULL o no NOT NULL. 

Si el campo a modificar es clave (Primary Key) o tiene una referencia (Foreing Key) no dejará hacerlo En este caso hacemos para la Primary Key.

ALTER TABLE PROPIETARIO.Nombre_Tabla DROP CONSTRAINT PK_NombreClave

ALTER TABLE PROPIETARIO.Nombre_Tabla ALTER COLUMN Nombre_Campo char(50) NOT NULL

ALTER TABLE PROPIETARIO.Nombre_Tabla ADD CONSTRAINT [PK_NombreClave] PRIMARY KEY CLUSTERED ([Nombre_Campo] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 


Modificar campos de una tabla ya creada en SQL Server




No deja por que hay una tabla dependiente


Si hay otra tabla que depende de este campo al ejecutar estas líneas, no nos dejará hacerlo pues saldrá un mensaje del tipo:

Mens. 3725, Nivel 16, Estado 0, Línea 1
The constraint 'PK_NombreClave' is being referenced by table 'tbTablaDependiente', foreign key constraint 'fk_Nombre_Tabla'.
Mens. 3727, Nivel 16, Estado 0, Línea 1
Could not drop constraint. See previous errors.

El la ventana del explorador de objetos, al deplegar sus campos, sobre el apartado Claves, nos aparecerá  'fk_Nombre_Tabla' Que es la que nos impide modificar la tabla original, primero habrá que modificar este campo con la misma instrucción inicial pero para la tabla dependiente. 

modificar campos de una tabla SQL server




En el apartado de los campos de la tabla nos aparecerá marcado el campo dependiente de la fk con el mismo símbolo del la llave que aparece en la foreing key.

Una vez identificado el campo se procede como en el primer caso, ahora la secuencia a seguir es la siguiente:

Primero borramos la Foreing Key (fk) de la tabla secundaria (la que depende de la  tabla que queremos modificar. 

Luego borramos la Primary Key (Pk) de la tabla en la que deseamos modificar la longitud del campo.

 Luego alteramos la longitud del campo en ambas tablas, primero en la tabla dependiente o secundaria y luego en la tabla primaria. Finalmente generamos de nuevo la Pk de la tabla primaria (y ojo por que aquí el orden es inverso) y finalmente creamos al fk de la tabla secundaria.

ALTER TABLE Propietario.Nombre_Tabla_Secundaria DROP CONSTRAINT FK_strUT
ALTER TABLE Propietario.Nombre_Tabla DROP CONSTRAINT PK_Nombre_Tabla
ALTER TABLE Propietario.Nombre_Tabla_Secundaria ALTER COLUMN strUT char(10) NULL
ALTER TABLE Propietario.Nombre_Tabla ALTER COLUMN strCodigo char(10) NOT NULL
ALTER TABLE Propietario.Nombre_Tabla ADD CONSTRAINT PK_Nombre_Tabla PRIMARY KEY CLUSTERED (strCodigo ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
ALTER TABLE Propietario.Nombre_Tabla_Secundaria WITH CHECK ADD  CONSTRAINT fk_strUT FOREIGN KEY (strUT)
REFERENCES Propietario.Nombre_Tabla (strCodigo) 

Si queremos añadir campos nuevos a la tabla es algo más complejo, pero también es muy sencillo basta con ejecutar un script de este tipo.

IF NOT EXISTS  (SELECT *  from syscolumns where id = object_id('PROPIETARIO.Nombre_Tabla')
          AND syscolumns.name = 'Nombre_Campo' )
BEGIN
ALTER TABLE PROPIETARIO.Nombre_Tabla ADD 
      Nombre_Campo CHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL   
END
GO

Si queremos que el campo no permita valores nulos en vez de NULL ponemos poner NOT NULL, en este caso tal vez nos interese indicar el tipo de valor que tendrá por defecto, para ello usamos DEFAULT con el valor deseado.

IF NOT EXISTS  (SELECT *  from syscolumns where id = object_id
('PROPIETARIO.Nombre_Tabla')AND syscolumns.name = 'Nombre_Campo' )
BEGIN
ALTER TABLE PROPIETARIO.Nombre_Tabla ADD
      Nombre_Campo CHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
DEFAULT 'Valor_defecto'
END
GO

Para modificar el nombre del campo


ALTER TABLE PROPIETARIO.Nombre_Tabla
CHANGE 'Nombre_Campo_Antiguo' 'Nombre_Campo_Nuevo'

Para eliminar un campo. No debe tener integridad referencial con otros campos de otras tablas de la base de datos, si la tiene aún se puede eliminar pero debe cumplir la condición de que todas las filas tengan el campo a eliminar vacio o a NULL.

ALTER TABLE PROPIETARIO.Nombre_Tabla DROP COLUMN Nombre_Campo



No hay comentarios:

Publicar un comentario