Mostrando las entradas con la etiqueta sql server. Mostrar todas las entradas
Mostrando las entradas con la etiqueta sql server. Mostrar todas las entradas

EXAMEN DE BASE DE DATOS


BASE DE DATOS AVANZADAS
EXAMEN DE UNIDAD I
DOCENTE: DR. LUIS BOY CHAVIL
CONSIDERACIONES GENERALES
- El alumno está autorizado a utilizar su material de consulta.
- No se permite intercambiar el material del curso entre los alumnos.

CONTENIDO

Elabore el diagrama de la base de datos considerando las tablas necesarias para el registro de la matrícula
de los estudiantes de la UNT. Ud. es libre de utilizar funciones, cursores, triggers, vistas y/o procedimientos
almacenados; para atender las siguientes preguntas:

a) El registro de la matrícula solamente se puede efectuar en las fechas establecidas en el cronograma;
asimismo se debe verificar el pago de matrícula registrando el número de recibo respectivo; en los
demás casos se rechazará el registro de matrícula ….. 4 puntos.
b) Al efectuar el registro de una matrícula se deberá llevar a cabo los siguientes controles: …… 10 puntos
o La nota del alumno, en el curso pre requisito del Plan de estudios actual, debe estar aprobado
o El total de créditos no debe ser menor de 12, ni mayor a 22 créditos.
o El alumno no puede tener una asignatura con más de 3 notas desaprobadas
o Debe haber vacante en la sección donde desea matricularse
o En los casos en que el alumno haya solicitado reserva de matrícula, debe acreditar el registro de su
matrícula, con la Resolución de reingreso respectiva.
o Opcionalmente, se verificará que el horario de un curso no esté cruzado con el horario de otro
curso.
c) Programe el caso de una matrícula en un curso, en forma co curricular .……  4 puntos
d) Considerar que al confirmarse el registro de la matricula del alumno; se actualizará la vacante del curso
y de su correspondiente Laboratorio (si hubiera)…2 puntos


PRACTICA (EJEMPLO) DE BASE DE DATOS

BASE DE DATOS AVANZADAS
PRÁCTICA CALIFICADA I
DOCENTE: DR. LUIS BOY CHAVIL
CONSIDERACIONES GENERALES
-          El alumno está autorizado a utilizar su material de consulta.
-          No se permite intercambiar el material del curso entre los alumnos.

CONTENIDO

                Una Universidad privada requiere desarrollar el Módulo de pago de pensiones de sus estudiantes, para ello se solicita elaborar la base de datos normalizada, con las siguientes consideraciones:
-          Los estudiantes programan el pago de sus pensiones en 1, 2, 3, 4, o hasta en 5 cuotas.
-          Para tener derecho a la matrícula, el alumno debe haber cancelado el monto de la matrícula y la primera cuota.
-          Hay un cronograma de pagos; para cada caso: Si es en dos cuotas, en tres, o cuatro, o cinco cuotas.
-          Si el alumno se retraza en la fecha de vencimiento de la cuota, deberá pagar los intereses respectivos.
-          Los alumnos becados con beca cero, solo pagan el monto de la matrícula.
-          Hay cuatro categorías de pago: 1. Beca cero (solo paga matrícula), 2. Beca 100 (paga 5 cuotas de 100 soles), 3. Media beca (paga el 50% del monto total de la categoría Normal; en 1, 2, 3, 4, o 5 cuotas), y 4. Categoría Normal
-          Los alumnos que se encuentran en alguna categoría, reciben una Resolución, cuyo número deberá ingresarse al sistema para saber el monto a pagar en el semestre. Las resoluciones solamente tienen vigencia durante un semestre.
-          No se acepta pagos parciales de una cuota; es decir, si la cuota es de S/ 450.00; no se aceptará el pago de un monto menor.
-          Si un alumno está al día en sus pagos, se habilitará el acceso a su campus virtual.
-          Programe los dominios y valores por defecto que el sistema requiera.
-          Implementar un Trigger para que al ingresar los datos de un nuevo estudiante se pueda crear el Login y la Contraseña, cuya característica es:
o   Login à 1° letra del ApellidoPaterno + ApellidoMaterno al reves + 1° letra del Nombre + Correlativo autogenerado (si el dato Existe) + @upk.edu.pe
o   Contraseña à # vocales ApPaterno (de 02 dígitos) + ‘0’ + Vocales ApMaterno (máx 6 letras, sino completar con z, por la izquierda) + 4 dígitos extremos del DNI
Ejemplo:
Estudiante(IdEstudiante, Nombre, ApPaterno, ApMaterno, DNI, FchIngreso, Otros (completar), Login, Contraseña) 
Datos:
(‘1023’, ‘Juan Pedro’, ‘Peralta’, ‘Fernandez’, ‘71065149’, ‘10/07/2015’, ‘. . . .’, Null, Null)
Contraseña à ‘030zzzeae7149’
-          Elabore la base de datos.

-          Archivo de entrega: <<ApellidoNombre.sql>>




PROBLEMA DESARROLLADO EN SQL SERVER


UNIVERSIDAD NACIONAL DE TRUJILLO
ESCUELA DE INGENIERÍA DE SISTEMAS

PRÁCTICA CALIFICADA N° 01

BASE DE DATOS AVANZADAS
DOCENTE: Dr. Luis Boy ChavilEN UN SISTEMA DE VENTAS DE PRODUCTOS FARMACÉUTICOS SE
REQUIERE:
AL REGISTRAR UNA VENTA DE PRODUCTOS FARMACÉUTICOS; SE ACTUALIZARÁ EL STOCK DEL PRODUCTO; ASI COMO SU RESPECTIVO KÁRDEX DONDE SE REGISTRARÁ EL TIPO DE DOCUMENTO DE LA VENTA (FACTURA O BOLETA), EL N° DE DICHO DOCUMENTO, EL TIPO DE OPERACIÓN (EN ESTE CASO ES DE SALIDA), EL STOCK ANTERIOR,
LA CANTIDAD VENDIDA Y EL STOCK ACTUAL. TAMBIEN SE
ACTUALIZARÁ LA COMISIÓN DEL VENDEDOR QUE SERÁ ACUMULADO EN BASE AL 1% DEL IMPORTE DE LA VENTA TOTAL; ASIMISMO, SE HARÁ LAS SIGUIENTES VERIFICACIONES: EL ESTADO DEL CLIENTE DEBE ESTAR ACTIVO Y SU SALDO DE CRÉDITO DEBE SER MAYOR AL IMPORTE TOTAL DE VENTA, EN CASO CONTRARIO SE RECHAZA LA OPERACIÓN; SI NO HAY STOCK SUFICIENTE, SE MOSTRARÁ UN MENSAJE DE RECHAZO Y SE ANULA LA OPERACIÓN. IMPLEMENTE EL SCRIPT EN T-SQL PARA RESOLVER EL PROBLEMA PLANTEADO.

NOTA: PUEDE UTILIZAR: TRIGGER’S, FUNCIONES, CURSORES,
PROCEDIMIENTOS ALMACENADOS, ETC.
  


SOLUCIÓN:

1. MODELADO


2. CREAR TABLAS

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
create database BDVentas
use BDVentas;
go
create table CLIENTE(
CLI_codigo int primary key identity(1,1),
CLI_nombres varchar(50),
CLI_apellidos varchar(50),
ClI_saldo money,
ClI_estado char(1) not null
)


create table VENDEDOR(
VEN_codigo int primary key identity(1,1),
VEN_nombres varchar(50) not null,
VEN_apellidos varchar(50) not null,
VEN_comision money 
)

create table PEDIDO(
PED_codigo int primary key identity(1,1),
VEN_codigo int references VENDEDOR(VEN_codigo),
CLI_codigo int references CLIENTE(CLI_codigo),
PED_fecha date 
)
create table FACTURA(
FAC_codigo int primary key identity(1,1),
PED_codigo int references PEDIDO(PED_codigo),
FAC_fecha date,
FAC_total money not null
)
create table PRODUCTO(
PRO_codigo int primary key identity(1,1),
PRO_precio money )
create table STOCK(
STO_codigo int primary key identity(1,1),
PRO_codigo int  references PRODUCTO(PRO_codigo),
STO_actual int not null,
STO_anterior int not null
)
create table DETALLE_FACTURA(
FAC_codigo int references FACTURA(FAC_codigo),
PRO_codigo int references PRODUCTO(PRO_codigo),
cantidad int not null
)
3. CREAR TRIGGER


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
create trigger tgdetalleFactura on DETALLE_FACTURA 
for insert
as
begin
 declare 
 @CLI_estado char(1),
 @CLI_codigo int,
 @CLI_saldo money,
 @VEN_codigo int,
 @FAC_codigo int,
 @PRO_codigo int,
 @cantidadProducto int,
 @STO_actual int, 
 @PRO_precio money
 select
  @FAC_codigo=i.FAC_codigo,
  @PRO_codigo=i.PRO_codigo,
  @cantidadProducto=i.cantidad,
  @STO_actual=s.STO_actual,
  @PRO_precio=p.PRO_precio,
  @CLI_codigo=c.ClI_codigo,
  @CLI_estado=c.ClI_estado,
  @CLI_saldo=c.ClI_saldo,
  @VEN_codigo=v.VEN_codigo
 from inserted i
 inner join FACTURA f on f.FAC_codigo=i.FAC_codigo
 inner join PEDIDO pe on pe.PED_codigo=f.PED_codigo
 inner join VENDEDOR v on v.VEN_codigo=pe.VEN_codigo
 inner join CLIENTE c on c.CLI_codigo=pe.CLI_codigo
 inner join PRODUCTO p on p.PRO_codigo=i.PRO_codigo
 inner join STOCK s on s.PRO_codigo=p.PRO_codigo

 if @CLI_estado='v' and @CLI_saldo>=(@PRO_precio*@cantidadProducto)
 begin 
  -- el stock del producto tiene que ser mayor a la cantidad del pedido
  if @cantidadProducto<=@STO_actual 
  begin
   --insertar un nuevo stock
   insert into STOCK 
   values(@PRO_codigo,(@STO_actual-@cantidadProducto),@STO_actual)
   -- actualizar el total de la factura
   update factura 
   set FAC_total=FAC_total+(@PRO_precio*@cantidadProducto)
   where FAC_codigo=@FAC_codigo
   -- actualizar el saldo del cliente
   update CLIENTE
   set ClI_saldo=ClI_saldo-(@PRO_precio*@cantidadProducto)
   where CLI_codigo=@CLI_codigo
   -- actualizar la comision de vendedor
   update VENDEDOR 
   set VEN_comision=VEN_comision+0.01*(@PRO_precio*@cantidadProducto)
   where VEN_codigo=@VEN_codigo
  end
  else
  begin
   raiserror ('stock insuficiente', 16, 2)
   rollback transaction 
  end

 

 end
 else
 begin
  raiserror ('el cliente no tiene saldo o su estado es f', 16, 2)
  rollback transaction 
 end



end

4. PRUEBA


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use BDVentas
go
insert into  CLIENTE
values ('Elson Roque','Caldas Dominguez',5000,'v'),
('Hector','Caldas Dominguez',0,'v'),
('Emerson','Caldas Lozano',2000,'f')

insert into VENDEDOR 
values('Emerita','Caldas Pinedo',0)

insert into PRODUCTO values(5),(10)

insert into STOCK values(1,15,0),(2,0,0)

insert into pedido values
(1,1,GETDATE()),-- primer pedido
(1,2,GETDATE()),-- segundo pedido
(1,3,GETDATE())-- tercer pedido

insert into factura values(1,GETDATE(),0),
(2,GETDATE(),0),
(3,GETDATE(),0)

insert into detalle_factura values
(2,1,1)

EJERCICIO RESUELTO EN SQL SERVER


  1. modelado
2. crear tablas


create database planillas
use planillas
go
-- tabla TRABAJADORES
create table TRABAJADORES(
TRA_codigo int primary key identity(1,1),
TRA_nombres varchar(50) not null,
TRA_apellidoPaterno varchar(50) not null,
TRA_apellidoMaterno varchar(50) not null,
TRA_dni char(8) not null,
TRA_fechaContrato date default(getdate()),
TRA_cargo varchar(50) not null check(TRA_cargo='Obrero' or TRA_cargo='Operador' or TRA_cargo='Ejecutivo') default('Operador'),
TRA_sueldoMensual money not null,
TRA_descuentoAFP float check(TRA_descuentoAFP<1 and TRA_descuentoAFP>0 )
)



--tabla USUARIOS
create table USUARIOS(
USU_codigo varchar(200) primary key,
TRA_codigo int references TRABAJADORES(TRA_codigo),
TRA_contraseña varchar(200) not null
)
-- tabla REGISTROS
create table REGISTROS(
REG_codigo int primary key identity(1,1),
TRA_codigo int references TRABAJADORES(TRA_codigo),
REG_horaEntrada tinyint not null check(REG_horaEntrada<24),
REG_horaSalida tinyint not null check(REG_horaSalida<24),
REG_fecha date not null default(getdate())
)
-- tabla HORARIO
create table HORARIOS(
HOR_codigo int primary key identity(1,1),
TRA_codigo int references TRABAJADORES(TRA_codigo)
)
-- tabla TURNOS
create table TURNOS(
TUR_codigo int primary key identity(1,1),
TUR_turno varchar(50) not null check(TUR_turno='Mañana' or TUR_turno='Tarde' or TUR_turno='Noche') default('Mañana'),
TUR_horaInicio tinyint not null check(TUR_horaInicio<=24 and(TUR_horaInicio=8 or TUR_horaInicio=16 or TUR_horaInicio=24)),
TUR_horaFinal tinyint not null check(TUR_horaFinal<=24 and(TUR_horaFinal=16 or TUR_horaFinal=24 or TUR_horaFinal=8))

)

-- tabla DETALLE_HORARIOS
create table DETALLE_HORARIOS(
HOR_codigo int references HORARIOS(HOR_codigo),
TUR_codigo int references TURNOS(TUR_codigo),
DHO_dia varchar(50) not null
)
--tabla HORAS_EXTRAS
create table HORAS_EXTRAS(
HEX_codigo int primary key identity(1,1),
TRA_codigo int references TRABAJADORES(TRA_codigo),
HEX_fecha date not null default(getdate()),
HEX_horaEntrada tinyint not null,
HEX_horaSalida tinyint not null,
HEX_totalHoras tinyint not null
)
--tabla TAREAS
create table TAREAS(
TAR_codigo int primary key identity(1,1),
TAR_nombre varchar(200) not null,
TAR_descripcion text
)

-- tabla RESOLUCIONES
create table RESOLUCIONES(
RES_codigo int primary key identity(1,1),
HEX_codigo int references HORAS_EXTRAS(HEX_codigo),
TAR_codigo int references TAREAS(TAR_codigo)
)

3. trigger


use planillas
go
create trigger tgUsuarios on TRABAJADORES 
for  insert
as
begin
 declare @apellidoPaterno varchar(50),
 @apellidoMaterno varchar(50),
 @nombres varchar(50),
 @dni char(8),
 @codigoTrabajador int 
select
 @codigoTrabajador=i.TRA_codigo,
 @apellidoPaterno=i.TRA_apellidoPaterno,
 @apellidoMaterno=i.TRA_apellidoMaterno,
 @nombres=i.TRA_nombres,
 @dni=i.TRA_dni

from inserted i

 -- establecer codigo
  declare @codigoUsuario varchar(200)
  --apellido al revez
   declare @apellidoMaternoRevez varchar(200)
   set @apellidoMaternoRevez=reverse(@apellidoMaterno)


  --correlativo autogenerado
   declare @apMaterno varchar(200)
   declare @correlativo int
   set @correlativo=0
   declare recorrerTrabajadore cursor read_only for
   select
    t.TRA_apellidoMaterno
   from TRABAJADORES t
   open recorrerTrabajadore
   FETCH NEXT FROM recorrerTrabajadore  INTO  @apMaterno
   WHILE @@fetch_status = 0 
   begin
    if @apMaterno=@apellidoMaterno
     set @correlativo=@correlativo+1
    FETCH NEXT FROM recorrerTrabajadore  INTO @apMaterno
   end
   
   close recorrerTrabajadore
   deallocate recorrerTrabajadore
   if @correlativo<10
    set @codigoUsuario=@apellidoMaternoRevez+'0'+cast(@correlativo as varchar(10))+'@unitru.edu.pe'
   else
    set @codigoUsuario=@apellidoMaternoRevez+cast(@correlativo as varchar(10))+'@unitru.edu.pe'
 -- establecer contraseña
 declare @contraseñaUsuario varchar(200)
  -- # letras ApMaterno Excepto Vocales (de 2 dígitos)
  declare @cantidadLetras int
  declare @tamañoApellidoMaterno int
  declare @letra char(1)
  set @tamañoApellidoMaterno=len(@apellidoMaterno)
  set @cantidadLetras=0
  while @tamañoApellidoMaterno>0
  begin
   set @letra=LOWER(SUBSTRING(@apellidoMaterno,@tamañoApellidoMaterno,1))
   if @letra!='a' and @letra!='e' and @letra!='i' and @letra!='o' and @letra!='u'
       set @cantidadLetras=@cantidadLetras+1
   set @tamañoApellidoMaterno=@tamañoApellidoMaterno-1
  end
  -- # Vocales ApPaterno
  declare @tamañoApellidoPaterno int
  declare @cantidadVocales int
  set @cantidadVocales=0
  declare @vocal char(1)
  set @tamañoApellidoPaterno=len(@apellidoPaterno)
  while @tamañoApellidoPaterno>0
  begin
   set @vocal=LOWER(SUBSTRING(@apellidoPaterno,@tamañoApellidoPaterno,1))
   if @vocal='a' or @vocal='e' or @vocal='i' or @vocal='o' or @vocal='u' 
    set @cantidadVocales=@cantidadVocales+1
   set @tamañoApellidoPaterno=@tamañoApellidoPaterno-1
  end
 if @cantidadLetras<10
  set @contraseñaUsuario='0'+cast(@cantidadLetras as varchar(20))+'&'+cast(@cantidadVocales as varchar(20))+SUBSTRING(@dni,1,2)+SUBSTRING(@dni,7,2)
 else
  set @contraseñaUsuario=cast(@cantidadLetras as varchar(20))+'&'+cast(@cantidadVocales as varchar(20))+SUBSTRING(@dni,1,2)+SUBSTRING(@dni,7,2)

 insert into USUARIOS VALUES(@codigoUsuario,@codigoTrabajador,@contraseñaUsuario)
 

end

4. prueba


insert into TRABAJADORES values('Juan','Santos','Fernandez','27965149',getdate(),'Ejecutivo',3000,0.5)
select * from USUARIOS



CREAR UN TIPO DE DATO EN SQL SERVER


En vista que SQL Server nos proporciona una serie de tipos de dato a veces necesitaremos algún tipo especial. Como el caso del DNI que cuenta con 8 caracteres de tipo CHAR o el número telefónico de 15 caracteres.

CURSORES EN SQL SERVER

Los cursores permiten tener el control fila por fila de un conjunto de registros.
¿en que caso usamos cursores?, puesto que si ya tenemos acceso alas filas de una tabla uno a uno entonces podremos obtener dichos valores y controlarlos desde variables locales y así poder acumular valores, contarlos, aplicar quiebres, etc.

ejemplo en sql server(triggers, cursores)







 1) modelado de base de datos




2) script: crear las tablas

create database BDMatricula;
use BDMatricula;
go

create table alumno(
idAlumno int primary key identity(1,1),
nombres varchar(50) not null,
apellidos varchar(50) not null
)

create table curso(
idCurso int primary key identity(1,1),
nombre varchar(50) not null,
creditos smallint not null default(3),
)

create table preRequisito(
idCurso int references curso(idCurso),
curso int references curso(idCurso)
)
create table seccion(
idSeccion int primary key identity(1,1),
nombre varchar(50) not null,
)
create table horario(
idSeccion int references seccion(idSeccion),
idCurso int references curso(idCurso),
vacantes int not null default(0),
dia varchar(10) not null,
horaInico int not null,
horaFinal int not null
)
create table nota(
idCurso int references curso(idCurso),
idAlumno int references alumno(idAlumno),
nota1 int  default(0),
nota2 int  default(0),
nota3 int  default(0),
nota4 int  default(0)
)

create table cronograma(
idCronograma int primary key identity(1,1),
inicioMatricula date not null default getdate(),
finMatricula date not null
)

create table matricula(
idMatricula int primary key identity(1,1),
idAlumno int references alumno(idAlumno),
fecha date default getdate()
)
create table detalleMatricula(
idMatricula int references matricula(idMatricula),
idCurso int references curso(idCurso),
idSeccion int references seccion(idSeccion)
)
create table registrarMatricula(
idMatricula int references matricula(idMatricula),
idCronograma int references cronograma(idCronograma),
recibo varchar(50) not null,
totalCreditos int not null
constraint creditos check( totalCreditos>=12 and totalCreditos<=22)
)

3)trigger para detalle matrícula
create trigger tgDetalleMatricula on detalleMatricula for insert, update
as
begin
 declare @idAlumno int
 declare @idSeccion int
 declare @idMatricula int
 declare @idCurso int
 select
  @idMatricula=i.idMatricula,
  @idCurso=i.idCurso,
  @idSeccion=i.idSeccion,
  @idAlumno=m.idAlumno
 from inserted i
 inner join matricula m on i.idMatricula=m.idMatricula
 -- b.4 Debe haber vacante en la sección donde desea matricularse
 declare @vacantes int
 select
  @vacantes=vacantes
 from horario
 where idSeccion=@idSeccion and idCurso=@idCurso
 if @vacantes=0
 begin
  raiserror ('no hay vacantes disponibles', 16, 2)
     rollback transaction 
 end
end
go

4) trigger para registrar matrícula

create trigger tgRegistraMatricula on registrarMatricula
for insert, update
as
begin
 declare @idMatricula int
 declare @idAlumno int
 declare @idCronograma int

 select
  @idMatricula=idMatricula,
  @idCronograma=idCronograma
 from inserted
 select @idAlumno=idAlumno
 from matricula
 -- a.1El registro de la matrícula solamente se puede efectuar
 -- en las fechas establecidas en el cronograma;
 declare @inicioMatricula date
 declare @finMatricula date
 declare @fechaMatricula date
 select
  @inicioMatricula=inicioMatricula,
  @finMatricula=finMatricula
 from cronograma
 where idCronograma=@idCronograma;
 select
  @fechaMatricula=fecha
 from matricula
 where idMatricula=@idMatricula;
 
 if @fechaMatricula<@inicioMatricula or @fechaMatricula>@finMatricula
 begin
  raiserror ('las matrícula se realizó fuera de fecha', 16, 2)
     rollback transaction
 end
 -- a.2 se debe verificar el pago de matrícula registrando
 -- el número de recibo respectivo
 -- solución: registrarMatricula.recibo es not null por lo tanto
 -- si o si tiene que ingresarse el campo recibo

 -- b.1 La nota del alumno, en el curso pre requisito
 --  del Plan de estudios actual, debe estar aprobado
 declare @nota1 int,@nota2 int,@nota3 int, @nota4 int
 declare @desaprobado int
 set @desaprobado=0
 declare infoNotasPreRequisitos cursor read_only for
 select
  n.nota1,
  n.nota2,
  n.nota3,
  n.nota4
 from matricula m
 join alumno a on m.idAlumno=m.idAlumno
 join detalleMatricula dm on dm.idMatricula=m.idMatricula
 join curso c on dm.idCurso=c.idCurso
 join preRequisito pr on pr.idCurso=c.idCurso
 join nota n on n.idCurso=pr.curso
 where m.idMatricula=@idMatricula;
 open infoNotas
 FETCH NEXT FROM infoNotasPreRequisitos INTO @nota1,@nota2,@nota3,@nota4
 WHILE @@fetch_status = 0
 begin
  if @nota1<=10 and @nota2<=10 and @nota3<=10 and @nota4<=10
   set @desaprobado=1
  FETCH NEXT FROM infoNotasPreRequisitos INTO @nota1,@nota2,@nota3,@nota4
 end
 close infoNotasPreRequisitos
 if @desaprobado=1
 begin
  raiserror ('cursos pre requisitos no aprobados', 16, 2)
     rollback transaction  
 end

 --  El total de créditos no debe ser menor de 12, ni mayor a 22 créditos.
 declare @totalCreditos int
 declare @creditos int
 set @totalCreditos=0
 declare cTotalCreditos cursor read_only for
 select c.creditos
 from matricula m
 inner join detalleMatricula dm on dm.idMatricula=m.idMatricula
 inner join curso c on dm.idCurso=c.idCurso
 where m.idMatricula=1
 open cTotalCreditos
 FETCH NEXT FROM cTotalCreditos  INTO @creditos
 WHILE @@fetch_status = 0
 BEGIN
  set @totalCreditos=@totalCreditos+@creditos
  FETCH NEXT FROM cTotalCreditos  INTO @creditos
 END
 close cTotalCreditos
 if @totalCreditos<12 or @totalCreditos>22
 begin
  raiserror ('total de créditos no válidos', 16, 2)
     rollback transaction 
 end
-- b.3 El alumno no puede tener una asignatura con más de 3 notas desaprobadas
 set @desaprobado=0
 declare notasAlumno cursor read_only for
 select
 nota1,nota2,nota3,nota4
 from nota
 where idAlumno=@idAlumno
 open notasAlumno
 FETCH NEXT FROM notasAlumno  INTO @nota1,@nota2,@nota3,@nota4
 WHILE @@fetch_status = 0
 BEGIN
  if @nota1<=10 and @nota2<=10 and @nota3<=10 and @nota4<=10
   set @desaprobado=1
  FETCH NEXT FROM notasAlumno  INTO @nota1,@nota2,@nota3,@nota4
 END
 close notasAlumno
 if @desaprobado=1
 begin
  raiserror ('Más de tres notas desaprobatorias', 16, 2)
     rollback transaction 
 end 

 --c1. Considerar que al confirmarse el registro de la matricula del alumno;
 --se actualizará la vacante del curso
 
 
 declare cambiarVacantes cursor read_only for
 select
  idCurso,
  idSeccion
 from detalleMatricula dm
 where dm.idMatricula=@idMatricula
 open cambairVacantes
  FETCH NEXT FROM cambairVacantes  INTO @idCurso,@idSeccion
 WHILE @@fetch_status = 0
 BEGIN
  update horario
  set vacantes=vacantes-1
  where idCurso=@idCurso and idSeccion=@idSeccion
  FETCH NEXT FROM cambairVacantes  INTO @idCurso,@idSeccion
 END
 close cambairVacantes

end


MANEJO DE ESQUEMAS EN SQL SERVER

El esquema de una base de dato describe la estructura de la misma ya que todos los objetos que se puede crear o administra en SQL server se encuentra dentro de un esquema estándar .
El manejo de esquemas responde a temas como agrupación de objetos y seguridad de las mismas. Cuando se crea un objeto de base de datos o se especifica una entidad de seguridad de dominio válida(usuario o grupo) como la propietaria del objeto, o la entidad de seguridad de dominio se agregará a la base de datos como esquema. Esa entidad  de seguridad  de dominio será la propietaria del nuevo esquema

sintaxis de creación:

CREATE SCHEMA nombreEsquema AUTHORIZATION nombrePropietario

sintaxis de eliminación de esquemas:
para eliminar un esquema debe tener en cuenta que no tenga objetos asociado a él. Por lo tanto, la sitaxis reflejará los pasos a seguir:
DROP TABLE
GO
DROP nombreEsquema SCHEMA AUTHORIZATION nombrePropietario
GO

ejemplo:

-- implemente los esquemas PAGO dentro de la base de datos BDMatricula

use BDMatricula
go
create schema pago authorization dbo
go

select * from sys.schemas where principal_id=1

Tomar en cuenta que hay varios esquemas dentro de una base de datos, pero la identificación asociada al propietario DBO es uno por ese motivo la consulta se condiciona a ese valor por la columna PRINCIPAL_ID.