48 - Restricción check |
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados". 1- Elimine la tabla si existe: if object_id('empleados') is not null drop table empleados; 2- Créela con la siguiente estructura: create table empleados ( documento varchar(8), nombre varchar(30), fechanacimiento datetime, cantidadhijos tinyint, seccion varchar(20), sueldo decimal(6,2) ); 3- Agregue una restricción "check" para asegurarse que no se ingresen valores negativos para el sueldo: alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>0); 4- Ingrese algunos registros válidos: insert into empleados values ('22222222','Alberto Lopez','1965/10/05',1,'Sistemas',1000); insert into empleados values ('33333333','Beatriz Garcia','1972/08/15',2,'Administracion',3000); insert into empleados values ('34444444','Carlos Caseres','1980/10/05',0,'Contaduría',6000); 5- Intente agregar otra restricción "check" al campo sueldo para asegurar que ninguno supere el valor 5000: alter table empleados add constraint CK_empleados_sueldo_maximo check (sueldo<=5000); La sentencia no se ejecuta porque hay un sueldo que no cumple la restricción. 6- Elimine el registro infractor y vuelva a crear la restricción: delete from empleados where sueldo=6000; alter table empleados add constraint CK_empleados_sueldo_maximo check (sueldo<=5000); 7- Establezca una restricción para controlar que la fecha de nacimiento que se ingresa no supere la fecha actual: alter table empleados add constraint CK_fechanacimiento_actual check (fechanacimiento<getdate()); 8- Establezca una restricción "check" para "seccion" que permita solamente los valores "Sistemas", "Administracion" y "Contaduría": alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')); 9- Establezca una restricción "check" para "cantidadhijos" que permita solamente valores entre 0 y 15. 10- Vea todas las restricciones de la tabla (5 filas): exec sp_helpconstraint empleados; 11- Intente agregar un registro que vaya contra alguna de las restricciones al campo "sueldo". Mensaje de error porque se infringe la restricción "CK_empleados_sueldo_positivo". 12- Intente agregar un registro con fecha de nacimiento futura. Mensaje de error. 13- Intente modificar un registro colocando en "cantidadhijos" el valor "21". Mensaje de error. 14- Intente modificar el valor de algún registro en el campo "seccion" cambiándolo por uno que no esté incluido en la lista de permitidos. Mensaje de error. 15- Intente agregar una restricción al campo sección para aceptar solamente valores que comiencen con la letra "B": alter table empleados add constraint CK_seccion_letrainicial check (seccion like '%B'); Note que NO se puede establecer esta restricción porque va en contra de la establecida anteriormente para el mismo campo, si lo permitiera, no podríamos ingresar ningún valor para "seccion".Ver solución
if object_id('empleados') is not null drop table empleados; create table empleados ( documento varchar(8), nombre varchar(30), fechanacimiento datetime, cantidadhijos tinyint, seccion varchar(20), sueldo decimal(6,2) ); alter table empleados add constraint CK_empleados_sueldo_positivo check (sueldo>0); insert into empleados values ('22222222','Alberto Lopez','1965/10/05',1,'Sistemas',1000); insert into empleados values ('33333333','Beatriz Garcia','1972/08/15',2,'Administracion',3000); insert into empleados values ('34444444','Carlos Caseres','1980/10/05',0,'Contaduría',6000); alter table empleados add constraint CK_empleados_sueldo_maximo check (sueldo<=5000); delete from empleados where sueldo=6000; alter table empleados add constraint CK_empleados_sueldo_maximo check (sueldo<=5000); alter table empleados add constraint CK_fechanacimiento_actual check (fechanacimiento<getdate()); alter table empleados add constraint CK_empleados_seccion_lista check (seccion in ('Sistemas','Administracion','Contaduria')); alter table empleados add constraint CK_cantidadhijos_valores check (cantidadhijos between 0 and 15); exec sp_helpconstraint empleados; insert into empleados values ('24444444','Carlos Fuentes','1980/02/05',2,'Administracion',-1500); insert into empleados values ('25555555','Daniel Garcia','2007/05/05',2,'Sistemas',1550); update empleados set cantidadhijos=21 where documento='22222222'; update empleados set seccion='Recursos' where documento='22222222'; alter table empleados add constraint CK_seccion_letrainicial check (seccion like '%B');
Una playa de estacionamiento almacena los datos de los vehículos que ingresan en la tabla llamada "vehiculos". 1- Elimine la tabla, si existe: if object_id('vehiculos') is not null drop table vehiculos; 2- Cree la tabla: create table vehiculos( numero int identity, patente char(6), tipo char(4), fechahoraentrada datetime, fechahorasalida datetime ); 3- Ingresamos algunos registros: insert into vehiculos values('AIC124','auto','2007/01/17 8:05','2007/01/17 12:30'); insert into vehiculos values('CAA258','auto','2007/01/17 8:10',null); insert into vehiculos values('DSE367','moto','2007/01/17 8:30','2007/01/17 18:00'); 4- Agregue una restricción "check" que especifique un patrón de 3 letras y 3 dígitos para "patente": alter table vehiculos add constraint CK_vehiculos_patente_patron check (patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'); 5- Intente ingresar un registro con un valor inapropiado para "patente": insert into vehiculos values('AB1234','auto',getdate(),null); No lo permite. 6- Agregue una restricción "check" que especifique que el campo "tipo" acepte solamente los valores "auto" y "moto": alter table vehiculos add constraint CK_vehiculos_tipo_valores check (tipo in ('auto','moto')); 7- Intente modificar el valor del campo "tipo" ingresando un valor inexistente en la lista de valores permitidos por la restricción establecida a dicho campo: update vehiculos set tipo='bici' where patente='AIC124'; No lo permite. 8- Agregue una restricción "default" para el campo "tipo" que almacene el valor "bici": alter table vehiculos add constraint DF_vehiculos_tipo default 'bici' for tipo; Lo acepta. Pero, note que va en contra de la restricción "check" impuesta en el punto 6. 9- Intente ingresar un registro sin valor para "tipo": insert into vehiculos values('SDF134',default,null,null); No lo permite porque va contra la restricción "check" del campo. 10- Agregue una restricción "check" para asegurarse que la fecha de entrada a la playa no sea posterior a la fecha y hora actual: alter table vehiculos add constraint CK_vehiculos_fechahoraentrada_actual check (fechahoraentrada<=getdate()); 11- Agregue otra restricción "check" al campo "fechahoraentrada" que establezca que sus valores no sean posteriores a "fechahorasalida": alter table vehiculos add constraint CK_vehiculos_fechahoraentradasalida check (fechahoraentrada<=fechahorasalida); 12- Intente ingresar un valor que no cumpla con la primera restricción establecida en el campo "fechahoraentrada": insert into vehiculos values('ABC123','auto','2007/05/05 10:10',null); La inserción no se realiza. 13- Intente modificar un registro para que la salida sea anterior a la entrada: update vehiculos set fechahorasalida='2007/01/17 7:30' where patente='CAA258'; Mensaje de error. 14- Vea todas las restricciones para la tabla "vehiculos": exec sp_helpconstraint vehiculos; aparecen 5 filas, 4 correspondientes a restricciones "check" y 1 a "default". 15- Establezca una restricción "default" para el campo "fechahoraentrada" para que almacene la fecha actual del sistema: alter table vehiculos add constraint DF_vehiculos_fechahoraentrada default getdate() for fechahoraentrada; 16- Ingrese un registro sin valor para "fechahoraentrada": insert into vehiculos values('DFR156','moto',default,default); 17- Vea todos los registros: select * from vehiculos; 18- Vea las restricciones: exec sp_helpconstraint vehiculos; 4 restricciones "check" y 2 "default".
if object_id('vehiculos') is not null drop table vehiculos; create table vehiculos( numero int identity, patente char(6), tipo char(4), fechahoraentrada datetime, fechahorasalida datetime ); insert into vehiculos values('AIC124','auto','2007/01/17 8:05','2007/01/17 12:30'); insert into vehiculos values('CAA258','auto','2007/01/17 8:10',null); insert into vehiculos values('DSE367','moto','2007/01/17 8:30','2007/01/17 18:00'); alter table vehiculos add constraint CK_vehiculos_patente_patron check (patente like '[A-Z][A-Z][A-Z][0-9][0-9][0-9]'); insert into vehiculos values('AB1234','auto',getdate(),null); alter table vehiculos add constraint CK_vehiculos_tipo_valores check (tipo in ('auto','moto')); update vehiculos set tipo='bici' where patente='AIC124'; alter table vehiculos add constraint DF_vehiculos_tipo default 'bici' for tipo; insert into vehiculos values('SDF134',default,null,null); alter table vehiculos add constraint CK_vehiculos_fechahoraentrada_actual check (fechahoraentrada<=getdate()); alter table vehiculos add constraint CK_vehiculos_fechahoraentradasalida check (fechahoraentrada<=fechahorasalida); insert into vehiculos values('ABC123','auto','2007/05/05 10:10',null); update vehiculos set fechahorasalida='2007/01/17 7:30' where patente='CAA258'; exec sp_helpconstraint vehiculos; alter table vehiculos add constraint DF_vehiculos_fechahoraentrada default getdate() for fechahoraentrada; insert into vehiculos values('DFR156','moto',default,default); select * from vehiculos; exec sp_helpconstraint vehiculos;