Sunteți pe pagina 1din 4

Declansatoare (Triggers)

1. Realizaţi un trigger pentru operaţia de ştergere care sa nu permită ştergerea


studentilor a caror nume incepe cu litere „B”.

CREATE TRIGGER [Stergere_cursant] ON [Cursanti] FOR DELETE AS


IF @@rowcount=0 RETURN
IF exists(SELECT NumeCursant FROM DELETED where NumeCursant Like ’B%’)

BEGIN
RAISERROR ( 'NU SE POT STERGE CURSANTII CU NUMELE INCEPAND CU LITERA
„B”, 18, 1)
ROLLBACK TRANSACTION
END

2. Realizaţi un trigger care sa nu permită modificarea numarului de ore alocate unei


discipline la o valoare mai mica decât cea pe care o are în momentul actualizării.

CREATE TRIGGER [dbo].[MODIFICARE_Discip] ON [dbo].[Discipline] FOR


UPDATE AS

IF EXISTS(SELECT *
FROM DELETED, INSERTED
WHERE DELETED.CODDISCIPLINA=INSERTED.CODDISCIPLINA
AND DELETED.NrOre>INSERTED.NrOre)
BEGIN
RAISERROR('NU SE POATE SUB MINIM', 18,2)
ROLLBACK TRANSACTION
END

View-uri

1. Să se afişeze în ordine cronologică studentii din Bucureşti inscrisi in ultimele 30


zile la modulele “Informatica” si “Contabilitate”.

2. Să se afişeze în ordine alfabetica disciplinele care au mai putin de 2 modulele în


ultimul trimestru al anului 2009.

SELECT dbo.Discipline.[Discipline name], COUNT(dbo.Module.ModuleID) AS


nr
FROM dbo.Discipline INNER JOIN
dbo.Structure ON dbo.Discipline.DisciplineID =
dbo.Structure.DisciplineID INNER JOIN
dbo.Module ON dbo.Structure.ModuleID = dbo.Module.ModuleID
WHERE (YEAR(dbo.Module.[Finish date]) = 2009) AND (DATEPART(qq,
dbo.Module.[Finish date]) = 4)
GROUP BY dbo.Discipline.[Discipline name]
HAVING (COUNT(dbo.Module.ModuleID) <= 2)
3. Realizaţi un View pentru a calcula totalul încasărilor din anul 2008 pe fiecare
student. Pentru studentii la care totalul de plata pe module depăşeşte 200 se va
calcula aplica un discount de 2% din total.

SELECT dbo.Student.[Student ID], SUM(dbo.Module.Tax - dbo.Module.Tax *


dbo.Participation.Discount / 100) AS Total, dbo.Module.[Finish date],
CASE WHEN SUM(dbo.Module.Tax - dbo.Module.Tax *
dbo.Participation.Discount / 100)
> 200 THEN SUM(dbo.Module.Tax - dbo.Module.Tax *
dbo.Participation.Discount / 100) * 0.002 END AS bonus
FROM dbo.Student INNER JOIN
dbo.Participation ON dbo.Student.[Student ID] = dbo.Participation.
[Student ID] INNER JOIN
dbo.Module ON dbo.Participation.[Module ID] =
dbo.Module.ModuleID
GROUP BY dbo.Student.[Student ID], dbo.Module.[Finish date]
HAVING (dbo.Module.[Finish date] BETWEEN CONVERT(DATETIME, '2008-
01-01 00:00:00', 102) AND CONVERT(DATETIME, '2008-12-31 00:00:00', 102))

Proceduri Stocate

1. Să se creeze o procedură stocată pentru a determina taxa maximă de plată.


Procedura va contine un parametru de tip OUTPUT care va prelua valoarea taxei
maxime din toate modulele.

CREATE PROCEDURE [dbo].[AflaTaxaMax]


@TaxMax Money OUTPUT
AS
SELECT @taxMAX=MAX(Tax)
FROM dbo.Module

Execuţia

declare @taxmax as money


exec dbo.AflaTaxaMax @taxmax output
select @taxmax

2. Se doreşte calculul unei reduceri pentru toţi cursanţii (studenţii). Suma finală de
plată va fi egală cu valoarea taxei iniţiale din care se scade 15% din taxa maximă
de plată.

DECLARE @taxmax1 AS money


EXECUTE dbo.AflaTaxaMax @TaxMax=@taxmax1 OUTPUT
SELECT dbo.Student.Surname, dbo.Module.[Module name], dbo.Module.Tax-
@taxmax1*0.15 AS ValPlata
FROM Student inner join Participation on dbo.Student.[Student
ID]=dbo.Participation.[Student ID] inner join dbo.Module on
dbo.Participation.[Module ID]=dbo.Module.[ModuleID]
Funcţii de tip tabelar

1. Realizaţi o funcţie prin intermediul căreia să se determine care sunt primele 3


module cu cele mai multe discipline alocate. Funcţia va returna codurile si
denumirile modulelor şi numărul total de discipline.

CREATE FUNCTION Module_principale()


RETURNS TABLE
AS
RETURN (SELECT top 3 ModuleID, Module.[Module
name],COUNT(DisciplineID)as Nb
FROM Structure inner join Module on Structure.ModuleID=Module.
ModuleID
GROUP BY ModuleID
ORDER BY COUNT(DisciplineID) DESC)

Executia

select * from dbo.Module_principale ()

2. Realizati o functie prin care sa se afiseze disciplinele aferente unui modul


precizat ca parametru.

create FUNCTION [dbo].[LISTADISCIPLINE](@pDenModul as nvarchar(200))


RETURNS @TabelTemp TABLE
(DisciplineID int, DisciplineName nvarchar(200))
AS
BEGIN
INSERT @TabelTemp
SELECT DM.DisciplineID, [Discipline Name]
FROM (Discipline D INNER JOIN Structure DM
ON D.DisciplineID = DM.DisciplineID) INNER JOIN
Module M ON DM.ModuleID=M.ModuleID
WHERE [Module name]=@pDenModul
Return
END

Executia

select * from dbo.[LISTADISCIPLINE]('Info')

Funcţii de tip scalar

1. Se doreşte alocarea unui cod fiecarui cursant in parte. Codurile vor fi alcatuite
din initiala prenumelui, initiala numelui de familie si anul nasterii.

Create function [dbo].[Concatenare](@id as char (13), @pNume


nvarchar(100), @pPrenume nvarchar(100) )
returns nvarchar(200)
AS
BEGIN
RETURN LEFT(@pPrenume,1) + Left(@pNume,1)+ SUBSTRING (@id, 2, 2)
END

Executia
select [dbo].Concatenare([CodStudent],Nume,Prenume) as COD
FROM dbo.Cursant

2. Sa se creeze o functie pentru a determina taxa neta totala de plata pentru fiecare
modul in parte.

create function [dbo].[TotalNetModul](@pCodModul as uniqueidentifier)


RETURNS money
AS
BEGIN
RETURN (SELECT SUM(Tax-Tax*Discount/100) FROM
Module M inner join Participation P ON
M.ModuleID=P.[Module ID] WHERE
M.ModuleID=@pCodModul)
END

Executia

select [module name],[dbo].[TotalNetModul](ModuleID)as totaltax


From dbo.Module