Adatbázisok szerver oldali programozása Labor, 2006.05.09.

A VIK Wikiből
(AdatbServerProgJegyzet20060509 szócikkből átirányítva)

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


<style> code.pre { white-space: pre; display: block; margin-top: 2px; margin-bottom: 2px; } li { line-height: 18px; } </style>


<< Labor, 2006.05.09. >>

T-SQL Triggerek, Kivételek

  1. Írj triggert, ami csak akkor enged felvenni egy kurzust egy hallgatónak, ha a limitnél kevesebben jelentkeztek eddig rá! Tegyük fel, hogy csak kliens oldalról engedélyezünk kurzus felvételt, így egyszerre biztosan egy sort szeretnénk beszúrni. CREATE TRIGGER courselimit ON student_course INSTEAD OF INSERT AS DECLARE @limit INT, @studentcount INT SELECT @limit=cou_limit FROM course, inserted WHERE cou_id=inserted.sc_courseid SELECT @studentcount=COUNT(*) FROM student_course, inserted WHERE student_course.sc_courseid=inserted.sc_courseid IF (@studentcount<@limit) INSERT INTO student_course SELECT * FROM inserted ELSE RAISERROR('kurzus betelt', 10, 1) GO Tesztelés: UPDATE course SET cou_limit=10 WHERE cou_id=6 INSERT INTO student_course (sc_studentid, sc_courseid, sc_date) VALUES ('SDFQWE', 6, getdate())
  2. Oldd meg az előző feladatot úgy, hogy feltesszük, hogy egyszerre több sort is be tudunk szúrni a táblába! CREATE TRIGGER courselimit ON student_course INSTEAD OF INSERT AS SET NOCOUNT ON DECLARE @limit INT, @studentcount INT DECLARE @studentid CHAR(6), @courseid INT, @date DATETIME DECLARE cc CURSOR FOR SELECT * FROM inserted OPEN cc FETCH cc INTO @studentid, @courseid, @date WHILE @@FETCH_STATUS=0 BEGIN SELECT @limit=cou_limit FROM course WHERE cou_id=@courseid SELECT @studentcount=COUNT(*) FROM student_course WHERE sc_courseid=@courseid IF @studentcount<@limit BEGIN INSERT INTO student_course VALUES (@studentid, @courseid, @date) print @studentid + ' jelentkezett a ' + convert(VARCHAR, @courseid) + ' kurzusra' END ELSE print @studentid + ' nem fért bele a ' + convert(VARCHAR, @courseid) + ' kurzusba' FETCH cc INTO @studentid, @courseid, @date END CLOSE cp DEALLOCATE cp GO Tesztelés: UPDATE course SET cou_limit=10 WHERE cou_id=6 DELETE FROM student_course WHERE sc_courseid=6 INSERT INTO student_course SELECT stud_id, 6, getdate() FROM student
  3. Írj tárolt eljárást, amivel egy diák egy kurzusra tud jelentkezni. Az eljárás bemenő paramétere a diák neptun kódja, a szemeszter kód és a tárgy kódja legyen. Az eljáráson belül kapd el a hibákat, és írasd ki, hogy mi volt a hiba! Próbáld ki az eljárást különböző hibákat generálva! CREATE PROCEDURE targyjelentkezes @student CHAR(6), @subject CHAR(8), @semester CHAR(5), @coursenumber INT AS SET NOCOUNT ON BEGIN TRY INSERT INTO student_course SELECT @student, cou_id, getdate() FROM course WHERE @subject=cou_subjectid AND @semester=cou_semestername AND @coursenumber=cou_coursenumber IF @@rowcount=0 RAISERROR('nincs ilyen kurzus', 10, 1) END TRY BEGIN CATCH IF @@ERROR=0 print 'ok' ELSE IF ERROR_NUMBER()=2627 print 'többszörös jelentkezés' ELSE BEGIN print 'egyéb hiba' print ERROR_NUMBER() print ERROR_MESSAGE() END END CATCH GO Tesztelés: EXEC targyjelentkezes 'XSFXCF', 'VIFO1016', '20012', 5
  4. Készíts egy nézetet, ami a következ- nev2 oszlopokat tartalmazza: név, mennyiseg, egység, ár! Az egység a nézetben ne kóddal jelenjen meg, hanem megnevezéssel! Az ár származtatott értékként kerüljön kiszámításra a nézeten belül. Írj triggert, aminek segítségével új félkész terméket lehet felvenni az adatbázisba a létrehozott nézeten keresztül! Amennyiben a beadott egység még nem szerepel az egység táblában, úgy az kerüljön felvételre. A beadott ár értéket ignoráld, mivel az ár egy származtatott érték!
  5. A VIAU9159 nev2 C# project MainClien.exe futtatható kódja egy korlátozott funkcionalitásokkal bíró kliens felületet nyújt a tanár-diák adatbázishoz. A feladat a kliens által meghívott tárolt eljárások megírása, aminek következtében a programot lehet használni. A program m2ködése: A program segítségével a különböz- diákokhoz tárgyakat lehet felvenni, illetve leadni. A belépéskor a felhasználói név és a jelszó megadása után megjelenik egy felület, ami különböz- listákat tartalmaz. A bal oldali lista a diákok listája. Ennek feltöltésére a program a getStudents tárolt eljárást hívja meg. A tárolt eljárás visszatérése egy adathalmaz, aminek az els- oszlopában a diák azonosítója áll, a másodikban pedig az, amit meg szeretnénk jeleníteni a listában. A félév kódja legördül- menü feltöltéséhez a getSemesters tárolt eljárást kell meghívni. Ennek is a visszatér- adathalmazának els- oszlopa tartalmazza a szemeszter kódját, a második oszlop pedig a megjelenítend- szöveget. Itt érdemes használni az el-z- gyakorlatok egyikén megírt szemeszter név konvertáló függvényt. Ha kiválasztunk egy szemesztert, az adott szemeszterhez az alsó listában felsorolásra kerülnek az adott szemeszter kurzusai. Ezt a getCoursesOfSemester @semester char(5) tárolt eljárás hívásával lehet megtenni. Az eljárás, mint az eddigiek két oszloppal tér vissza. Az els-ben a kurzus azonosítója áll, a másodikban a megjelenítend- szöveg. Itt érdemes a tárgy kódját, a tárgy nevét, a kurzus típusát (el-adás, gyakorlat vagy labor a CASE függvény használatával), tárgyért felel-s tanár nevét kiíratni. A legfels- listában a kiválasztott diák által az adott félévben felvett kurzusok szerepelnek. Ezt a getStudentsCourses @studid char(6), @semester char(5) tárolt eljárás hívásával lehet megoldani. Az eljárás azonos módon kell, hogy visszaadja az adatokat, mint a kurzust listázó eljárás. A jelentkezik gomb megnyomásakor a kiválasztott hallgatóhoz felvételre kerül a kiválasztott kurzus. Ezt az addCourseToStudent @studid char(6), @couid int eljárás hívásával lehet megtenni. Az eljárásnak le kell ellen-riznie, hogy még befér-e a hallgató az adott kurzusra. Ha igen, fel kell venni, ha nem, akkor egy hibát kell generálni a kliens felé. Ügyelj a tranzakció kezelésre is! A lead gombbal a kiválasztott hallgató kiválasztott kurzusát lehet törölni a listából. Ezt a deleteCourseFromStudent @studid char(6), @couid int tárolt eljárással lehet megtenni. Írd meg a szövegben megjelölt tárolt eljárásokat! Ügyelj a tranzakció kezelésre és a hiba kezelésre! Hibát a RAISERROR függvénnyel lehet dobni a kliens felé (a részleteket nézd meg a helpben!)
  6. Módosítsd úgy a szemeszter kurzusainak listáját listázó tárolt eljárást, hogy tartalmazza a kurzus létszámkorlátját, és a jelentkezettek számát is!

-- Peti - 2006.05.09.