Primer problema:
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');
Segundo problema:
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".
Ver solución
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;