use EmpclgDB;
go;
-------1 le 2 se déduit
create or ALTER   trigger ctrlInsertionPermanent on EmpPermanent after insert as
begin
declare 
@empno int;
select @empno = empno from inserted
	if (@empno in(select empno from EmpTemporaire))
		begin
		rollback
		RAISERROR (15600,-1,-1, 'Ce numéro est un emp temporaire.');
		end
end;
go;



--------3--
create or alter trigger CTRLSalaire on empPermanent after insert, update as
begin
declare 
@maxSalAchat money, 
@MinSalInfo money, 
@salaire money, 
@deptno char(3), 
@empno int;

select @deptno = deptno from inserted;
select @empno = empno from inserted;
select @salaire = salaire  from inserted where empno =@empno;
select @maxSalAchat= MAX(salaire) from EmpPermanent where deptno =3;
select @MinSalInfo = MIN(salaire) from EmpPermanent where deptno =1;

------si on insère ou on update un employé dans le département informatique
	if(@deptno=1)
		begin
			if(@salaire <= @maxSalAchat)
				begin 
					Rollback;
					RAISERROR (15600,-1,-1, 'Salaire trop bas.'); 
			    end;
	   end;
	--- si on insère on ou update dans le departement Achat
	if (@deptno=3)
		begin
			if(@salaire>=@MinSalInfo)
				begin
					Rollback;
					RAISERROR (15600,-1,-1, 'Salaire trop élevé.'); 
			    end;
	   end;
end;
go
--------------4
create or alter trigger cascadeDeleteEmploye on employesClg instead of delete as
begin
declare @empno int,
        @typeEmploye char(1);

	select @empno = empno from deleted;
	select @typeEmploye = typeEmploye from deleted where empno = @empno;
		if(@typeEmploye ='P') 
			begin
			delete from EmpFormations where empno =@empno;
			delete from EmpPermanent where empno =@empno;
			end;
		else if(@typeEmploye='T') 
		delete from EmpTemporaire where empno =@empno;
	delete from employesClg where empno =@empno;
end;

---5-----Le trigger Control cout reel
go
CREATE  or alter TRIGGER CTRLcoutReel on EmpFormations after INSERT, UPDATE   as
DECLARE
@coutmin money, 
@coutmax money,
@coureel money,
@idformation int;
BEGIN
	    select @idformation =idformation from inserted;
		select @coureel = coutreel from inserted;
		select @coutmin = coutMinimum from formations WHERE idformation = @idformation;            
	    select @coutmax = coutMaximum from formations WHERE idformation = @idformation;

 		if (@coureel<@coutmin or @coureel>@coutmax) 
			begin
				rollback; 
				RAISERROR (15600,-1,-1, 'le cout reel n''est pas dans la bonne fourchette.');  
			end;
end;
go;
-----6-----Le trigger, control des places dispo et du solde
create trigger CTRformations on EmpFormations  after insert, update as
begin
declare @nbplaces int,
		@solde money ,
		@idformation int,
		@empno int,
		@coutReel money;
	select @idformation = idformation from inserted;
	select @nbplaces = nbplacesDisponibles from formations where  idformation=@idformation
	select @empno =empno from inserted;
	select @solde =soldeFormation from EmpPermanent where empno=@empno;
	select @coutReel = coutreel from inserted;
	
	if (@nbplaces < 1)
		begin 
			rollback;
			RAISERROR (15600,-1,-1, 'Pas de places pour cette formation.');
		end;
	 if (@solde < @coutReel)
		begin 
			rollback;
			RAISERROR (15600,-1,-1, 'Pas assez de dollars pour cette formation');
		end;
end;
-----------------------------


---------------Rep1
--Nous avons besoin d'un trigger si l'operation d'insertion n'utilise pas la procédure stockée: 
--Si l'instruction INSERT INTO est utilisée directement
-----------------Rep2
--Par un trigger, car on ne connait pas d'avance la valeur initial du taux horaire
---------Rep 3:
--Par une contrainte CHECK, car la valeur de la contrainte est connue et fixe. 
--elle est toujours 20
--rep4
--NON, car les données ne sont pas accéssible par la commandes CREATE Table. Il  
--s'agit de faire une comparaison entre deux données déjà insérées. 

---rep5
--disable trigger nomTrigger on nomTable



