Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 7.64 KB | None | 0 0
  1. USE dbeksamen
  2. DROP TABLE IF EXISTS timeregistration
  3. DROP TABLE IF EXISTS employeeprojects
  4. DROP TABLE IF EXISTS employee
  5. DROP TABLE IF EXISTS boss
  6. DROP TABLE IF EXISTS project
  7. DROP TABLE IF EXISTS customer
  8.  
  9. CREATE TABLE customer
  10. (
  11. id INT IDENTITY PRIMARY KEY,
  12. customername VARCHAR(50)
  13. )
  14. CREATE TABLE project
  15. (
  16. id INT IDENTITY PRIMARY KEY,
  17. projectname VARCHAR(50),
  18. projectstatus CHAR(9) CHECK(projectstatus IN ('active','inactive')),
  19. customerid INT NOT NULL REFERENCES customer,
  20. fixedprice INT,
  21. estimatedhours INT,
  22. hourlyrate INT
  23. )
  24. CREATE TABLE boss
  25. (
  26. id INT IDENTITY PRIMARY KEY,
  27. name VARCHAR(50)
  28. )
  29. CREATE TABLE employee
  30. (
  31. id INT IDENTITY PRIMARY KEY,
  32. employeename VARCHAR(50),
  33. bossid INT NOT NULL REFERENCES boss,
  34. timeoff INT
  35. )
  36. CREATE TABLE employeeprojects
  37. (
  38. id INT IDENTITY PRIMARY KEY,
  39. employeeid INT NOT NULL REFERENCES employee,
  40. projectid INT NOT NULL REFERENCES project
  41. )
  42. CREATE TABLE timeregistration
  43. (
  44. id INT IDENTITY PRIMARY KEY,
  45. starttime datetime,
  46. endtime datetime,
  47. employeeid INT NOT NULL REFERENCES employee,
  48. projectid INT NOT NULL REFERENCES project,
  49. note VARCHAR(500)
  50. )
  51. GO
  52. INSERT INTO customer VALUES ('microsoft'), ('apple')
  53.  
  54. INSERT INTO project VALUES ('projectOne', 'active', 1, 5000, 10, NULL),
  55. ('projectTwo', 'inactive', 1, NULL, NULL, 500),
  56. ('projectThree', 'active', 2, 15000, 30, NULL),
  57. ('projectFour', 'active', 2, 6000, 11, NULL)
  58.  
  59. INSERT INTO boss VALUES ('jackson'), ('peterson')
  60.  
  61. INSERT INTO employee VALUES ('Ravn', 1, 2), ('Frost', 2, 5), ('Dennis', 1, 3)
  62.  
  63. INSERT INTO employeeprojects VALUES (1, 1), (1,2), (2,3), (3,4)
  64.  
  65. INSERT INTO timeregistration VALUES ((CONVERT(datetime,'19-05-19 06:00:00 PM',5)), (CONVERT(datetime,'19-05-19 08:00:00 PM',5)), 1, 1, '2 hours on projectOne'),
  66. ((CONVERT(datetime,'13-05-19 09:00:00 PM',5)), (CONVERT(datetime,'13-05-19 11:00:00 PM',5)), 1, 2, '2 hours on projectTwo'),
  67. ((CONVERT(datetime,'13-05-19 09:00:00 PM',5)), (CONVERT(datetime,'13-05-19 11:00:00 PM',5)), 2, 3, '2 hours on projectThree'),
  68. ((CONVERT(datetime,'13-05-19 09:00:00 PM',5)), (CONVERT(datetime,'13-05-19 11:00:00 PM',5)), 3, 4, '2 hours on projectFour')
  69.  
  70. -- Ex2) ---------------------------------------------------
  71. GO
  72. CREATE INDEX Employeetbl_timeoff
  73. ON employee (timeoff ASC)
  74.  
  75. GO
  76. SELECT * FROM employee WITH(INDEX(Employeetbl_timeoff))
  77.  
  78. CREATE INDEX Projecttbl_fixedprice
  79. ON project (fixedprice ASC)
  80.  
  81. GO
  82. SELECT * FROM project WITH(INDEX(Projecttbl_fixedprice))
  83.  
  84. -- Ex3) ---------------------------------------------------
  85. GO
  86. SELECT e.employeename
  87. FROM employee e
  88. JOIN timeregistration t ON e.id = t.employeeid
  89. JOIN project p ON t.projectid = p.id
  90. JOIN customer c ON c.id = p.customerid
  91. WHERE c.customername = 'apple'
  92.  
  93. --Ex4) -----------------------------------------------------
  94. GO
  95. CREATE OR ALTER TRIGGER timeregistrationTrigger
  96. ON timeregistration
  97. instead OF INSERT
  98. AS
  99. BEGIN
  100.      DECLARE @daysbefore INT
  101.      DECLARE @employeeonproject INT
  102.      DECLARE @projectstatus CHAR(9)
  103.      
  104.      SELECT @daysbefore = DATEDIFF(DAY, GETDATE(), (SELECT starttime FROM inserted))
  105.      IF(@daysbefore <= -7)
  106.      BEGIN
  107.      RAISERROR('Noget gik galt', 16, 1)
  108.      RETURN
  109.      END
  110.      
  111.      SELECT @employeeonproject = ep.employeeid
  112.      FROM employeeprojects ep
  113.      WHERE ep.employeeid = (SELECT employeeid FROM inserted) AND ep.projectid = (SELECT projectid FROM inserted)
  114.      IF(@employeeonproject IS NULL)
  115.      BEGIN
  116.      RAISERROR('Noget gik galt', 16, 1)
  117.      RETURN
  118.      END
  119.  
  120.      SELECT @projectstatus = p.projectstatus
  121.      FROM project p
  122.      WHERE p.id = (SELECT projectid FROM inserted)
  123.      IF(@projectstatus = 'inactive')
  124.      BEGIN
  125.      RAISERROR('Noget gik galt', 16, 1)
  126.      RETURN
  127.      END
  128.  
  129.     INSERT INTO timeregistration VALUES (
  130.         (SELECT starttime FROM inserted),
  131.         (SELECT endtime FROM inserted),
  132.         (SELECT employeeid FROM inserted),
  133.         (SELECT projectid FROM inserted),
  134.         (SELECT note FROM inserted))
  135. END
  136.  
  137. --test til krav1)
  138. INSERT INTO timeregistration VALUES ((CONVERT(datetime,'14-05-19 09:00:00 PM',5)), (CONVERT(datetime,'13-05-19 11:00:00 PM',5)), 1, 1, '2 hours on projectOne')
  139. --test til krav 2)
  140. INSERT INTO timeregistration VALUES ((CONVERT(datetime,'20-05-19 09:00:00 PM',5)), (CONVERT(datetime,'13-05-19 11:00:00 PM',5)), 2, 1, '2 hours on projectOne')
  141. --test til krav 3)
  142. INSERT INTO timeregistration VALUES ((CONVERT(datetime,'20-05-19 09:00:00 PM',5)), (CONVERT(datetime,'13-05-19 11:00:00 PM',5)), 1, 2, '2 hours on projectOne')
  143.  
  144. --Ex5) ------------------------------------------------------------------
  145. GO
  146. CREATE OR ALTER FUNCTION dbo.antalhverdageiMinutter(@aar INT ,@maaned INT)
  147. -- returnerer antal minutter i hverdage i den pågældende måned  
  148. RETURNS INT
  149. AS
  150. BEGIN
  151. DECLARE @res INT
  152. DECLARE @firstdayofmonth DATE = datefromparts(@aar,@maaned,1)
  153. DECLARE @firstdayofnextmonth DATE = dateadd(mm,1,@firstdayofmonth)
  154. DECLARE @lastdateofmonth DATE = dateadd(dd,-1,@firstdayofnextmonth)
  155. IF DAY(@lastdateofmonth) = 28
  156.   SET @res = 20
  157. ELSE
  158.   IF DAY(@lastdateofmonth) = 29
  159.     IF datename(DW,@firstdayofmonth) IN ('Saturday','Sunday')
  160.       SET @res = 20
  161.     ELSE
  162.       SET @res = 21
  163.   ELSE
  164.     IF DAY(@lastdateofmonth) = 30
  165.       IF datename(DW,@firstdayofmonth) = 'Saturday'
  166.         SET @res = 20
  167.       ELSE
  168.         IF datename(DW,@firstdayofmonth) IN ('Friday','Sunday')
  169.           SET @res = 21
  170.        ELSE SET @res = 22
  171.     ELSE
  172.       IF DAY(@lastdateofmonth) = 31
  173.         IF datename(DW,@firstdayofmonth) IN ('Friday','Saturday')
  174.          SET @res = 21
  175.       ELSE
  176.         IF datename(DW,@firstdayofmonth) IN ('Thursday','Sunday')
  177.          SET @res = 22
  178.         ELSE SET @res = 23
  179. RETURN 444*@res
  180. END
  181.  
  182. GO
  183. CREATE OR ALTER proc updatetimeoff
  184.     @monthParameter INT,
  185.     @yearParameter INT
  186. AS
  187. BEGIN
  188.     DECLARE @employeeid INT
  189.     DECLARE @timeoff INT
  190.     DECLARE @starttime datetime
  191.     DECLARE @endtime datetime
  192.     DECLARE @lastid INT = 1
  193.     DECLARE @minutes INT = 0
  194.     DECLARE @finalminutes INT = 0
  195.     DECLARE @numberOfRows INT = 0
  196.  
  197.     DECLARE MY_CURSOR cursor
  198.     LOCAL static forward_only
  199.     FOR
  200.     SELECT e.id, e.timeoff, t.starttime, t.endtime
  201.     FROM employee e
  202.     JOIN timeregistration t ON t.employeeid = e.id
  203.    
  204.     OPEN MY_CURSOR
  205.     fetch NEXT FROM MY_CURSOR INTO  @employeeid, @timeoff, @starttime, @endtime
  206.     while (@@FETCH_STATUS = 0)
  207.     BEGIN
  208.         IF MONTH(@starttime) = @monthParameter AND YEAR(@starttime) = @yearParameter
  209.         BEGIN
  210.             IF @lastid = @employeeid
  211.             BEGIN
  212.                 IF DATENAME(DW, @starttime) = 'Sunday'
  213.                 BEGIN
  214.                     SELECT @minutes += DATEDIFF(MINUTE, @starttime, @endtime)
  215.                 END
  216.                 ELSE
  217.                 BEGIN
  218.                     SELECT @minutes += (DATEDIFF(MINUTE, @starttime, @endtime)) * 2
  219.                 END
  220.             END
  221.             ELSE
  222.             BEGIN
  223.                 UPDATE employee
  224.                 SET timeoff += (@minutes - dbo.antalhverdageiMinutter(@yearParameter, @monthParameter))
  225.                 WHERE id = @lastid
  226.                 SET @lastid += 1
  227.                 SET @minutes = 0
  228.                 SET @finalminutes = 0
  229.                 IF DATENAME(DW, @starttime) = 'Sunday'
  230.                 BEGIN
  231.                     SELECT @minutes += DATEDIFF(MINUTE, @starttime, @endtime)
  232.                 END
  233.                 ELSE
  234.                 BEGIN
  235.                     SELECT @minutes += (DATEDIFF(MINUTE, @starttime, @endtime)) * 2
  236.                 END
  237.             END
  238.         END
  239.         fetch NEXT FROM MY_CURSOR INTO  @employeeid, @timeoff, @starttime, @endtime
  240.     END
  241.    
  242.     close MY_CURSOR
  243. END
  244.  
  245. EXEC updatetimeoff 5, 2019
  246.  
  247. SELECT * FROM employee
  248.  
  249. -- Ex8) ---------------------------------
  250. GO
  251. EXEC sp_addlogin 'admin','123'
  252. EXEC sp_addlogin 'employee','123'
  253.  
  254. EXEC sp_grantdbaccess 'admin'
  255. EXEC sp_grantdbaccess 'employee'
  256.  
  257. EXEC sp_addrole 'administrators'
  258. EXEC sp_addrole 'employees'
  259.  
  260. EXEC sp_addrolemember 'administrators','admin'
  261. EXEC sp_addrolemember 'employees','employee'
  262.  
  263. GRANT SELECT, INSERT, UPDATE, DELETE
  264. ON DATABASE::dbeksamen
  265. TO [admin]
  266.  
  267. GRANT SELECT, INSERT, UPDATE, DELETE
  268. ON object::dbeksamen.dbo.timeregistration
  269. TO [employee]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement