Advertisement
Guest User

DB2 Finals Session 2 Ex1 Solution

a guest
Nov 15th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.96 KB | None | 0 0
  1. /* Part 1 */
  2. CREATE INDEX boat_reservation_index ON Reservation(
  3.     bid     ASC
  4. )
  5.  
  6. --------------------------------------------------------------------
  7.  
  8. /* Part 2 */ /* Trigger */
  9. CREATE TRIGGER reservations_trigger ON Reservation FOR INSERT
  10. AS
  11. BEGIN
  12.     DECLARE @boatID INT;
  13.  
  14.     SELECT @boatID = i.bid FROM inserted i;
  15.  
  16.     UPDATE Boats
  17.     SET nbreserves = (nbreserves + 1)
  18.     WHERE bid = @boatID;
  19.  
  20. END
  21.  
  22. --------------------------------------------------------------------
  23.  
  24. /* Part 3 */
  25. CREATE FUNCTION nbEmployeeReservation
  26.     (@empID INT)
  27. RETURNS
  28.     INT
  29. AS
  30. BEGIN
  31.     DECLARE @COUNT INT;
  32.  
  33.     SELECT @COUNT = COUNT(eid)
  34.     FROM Reservation r
  35.     WHERE r.eid = @empID;
  36.  
  37.     RETURN @COUNT;
  38. END
  39.  
  40. -------------------------------------------------------------------
  41.  
  42. /* Part 4 */
  43. CREATE TRIGGER checkBoatVacancy ON Reservation INSTEAD OF INSERT
  44. AS
  45. BEGIN
  46.     DECLARE @boatID INT;
  47.     DECLARE @reservationDate DATE;
  48.     DECLARE @COUNT INT;
  49.  
  50.     SELECT @boatID = i.bid FROM inserted i;
  51.     SELECT @reservationDate = i.DAY FROM inserted i;
  52.  
  53.     IF EXISTS (
  54.         SELECT *
  55.         FROM Reservation r
  56.         WHERE r.bid = @boatID AND r.DAY = @reservationDate
  57.         )
  58.     BEGIN
  59.         print 'Boat taken at this date, reservation failed';
  60.         ROLLBACK TRANSACTION;
  61.     END
  62. END
  63.  
  64. -------------------------------------------------------------------
  65.  
  66. /* Part 5 */
  67. CREATE VIEW ViewBookDays AS
  68.     SELECT ename, bname, day_rate
  69.     FROM Boats AS b
  70.     INNER JOIN Reservation AS r
  71.     ON b.bid = r.bid
  72.     INNER JOIN Employees AS e
  73.     ON e.eid = r.eid;
  74.  
  75. -------------------------------------------------------------------
  76.  
  77. /* Part 6 */
  78. DECLARE @boat INT = 1; /* or 2800 in exam */
  79.  
  80. BEGIN TRY
  81.     BEGIN TRANSACTION
  82.         DELETE FROM Reservation
  83.         WHERE bid = @boat;
  84.  
  85.         DELETE FROM Boats
  86.         WHERE bid = @boat;
  87.     COMMIT TRANSACTION
  88. END TRY
  89. BEGIN CATCH
  90.     print 'Error deleting boat';
  91.     ROLLBACK TRANSACTION
  92. END CATCH
  93.  
  94. -------------------------------------------------------------------
  95.  
  96. /* Part 7 */
  97. CREATE PROC createEmpAccount
  98.     @EmpID INT
  99. AS
  100. BEGIN
  101.     DECLARE @EmpUsername VARCHAR(256) = 'Emp' + CONVERT(VARCHAR(256),@EmpID);
  102.     DECLARE @createUser VARCHAR(MAX);
  103.     DECLARE @createView VARCHAR(MAX);
  104.     DECLARE @grantQuery VARCHAR(MAX);
  105.  
  106.     SET @createUser = 'CREATE USER ' + @EmpUsername + ' WITH PASSWORD = ''' + CONVERT(VARCHAR(256),@EmpID) + '''';
  107.     EXEC(@createUser);
  108.  
  109.     SET @createView = 'CREATE VIEW ' + @EmpUsername + 'Bookings AS
  110.                         SELECT * FROM Reservation WHERE eid = ' + CONVERT(VARCHAR(256),@EmpID);
  111.     EXEC(@createView);
  112.  
  113.     SET @grantQuery = 'GRANT UPDATE ON ' + @EmpUsername + 'Bookings TO ' + @EmpUsername;
  114.     EXEC(@grantQuery);
  115.  
  116.     SET @grantQuery = 'GRANT INSERT ON Reservation TO ' + @EmpUsername;
  117.     EXEC(@grantQuery);
  118.  
  119. END
  120.  
  121. SET NOCOUNT ON
  122. DECLARE @ID INT;
  123. DECLARE cur CURSOR FOR
  124. SELECT eid FROM Employees
  125. OPEN cur
  126.     IF(@@CURSOR_ROWS < 0)
  127.     BEGIN
  128.         FETCH NEXT FROM cur INTO @ID
  129.  
  130.         WHILE @@FETCH_STATUS = 0
  131.         BEGIN
  132.             EXEC createEmpAccount @ID;
  133.  
  134.             FETCH NEXT FROM cur INTO @ID
  135.         END
  136.     END
  137. CLOSE cur
  138. DEALLOCATE cur
  139. SET NOCOUNT OFF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement