Advertisement
Ladies_Man

#DB Lab9 (Triggers) COMPLETE

Dec 16th, 2015
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 8.67 KB | None | 0 0
  1. --Лабораторная работа №9. Триггеры DML.
  2.  
  3.  
  4. --1.Для одной из таблиц пункта 2 задания 7 создать триггеры на вставку, удаление и добавление,
  5.     --при выполнении заданных условий один из триггеров должен инициировать возникновение ошибки (RAISERROR / THROW).
  6. --2.Для представления пункта 2 задания 7 создать триггеры на вставку, удаление и добавление,
  7.     --обеспечивающие возможность выполнения операций с данными непосредственно через представление.
  8.  
  9.  
  10.  
  11. use master;
  12. go
  13. if DB_ID (N'lab9') is null
  14.     create database lab9
  15.         on (
  16.             NAME = lab9dat,
  17.             FILENAME = 'C:\Users\me\Documents\DB_Labs\lab9\lab9dat.mdf',
  18.             SIZE = 5, MAXSIZE = UNLIMITED, FILEGROWTH = 5 )
  19.         log on (
  20.             NAME = lab8log,
  21.             FILENAME = 'C:\Users\me\Documents\DB_Labs\lab9\lab9log.ldf',
  22.             SIZE = 5, MAXSIZE = 20, FILEGROWTH = 5 );
  23. go
  24.  
  25. use lab9;
  26. go
  27.  
  28.  
  29. if (OBJECT_ID(N'FK_books_wid', N'F') is not null)
  30.     alter table dbo.books
  31.         drop CONSTRAINT FK_books_wid
  32. go
  33. if OBJECT_ID(N'dbo.writers', N'U') is not null
  34.     drop table dbo.writers
  35. go
  36. --parental table
  37. create table dbo.writers (
  38.     id              int identity(1,1),
  39.     name            varchar(35),
  40.  
  41.     PRIMARY KEY (id)
  42.     );
  43. go
  44.  
  45.  
  46. if OBJECT_ID(N'dbo.books', N'U') is not null
  47.     drop table dbo.books;
  48. go
  49. --child table
  50. create table dbo.books (
  51.     title           varchar(254),
  52.     wid             int
  53.         CONSTRAINT DF_books_wid DEFAULT(0),
  54.     year            int,
  55.     rating          int
  56.         CONSTRAINT DF_books_rating DEFAULT(0),
  57.  
  58.     PRIMARY KEY (title),
  59.     CONSTRAINT FK_books_wid
  60.         FOREIGN KEY (wid)
  61.         REFERENCES dbo.writers(id)
  62.     );
  63. go
  64.  
  65.  
  66. if OBJECT_ID(N'dbo.joined_view', N'V') is not null
  67.     drop view dbo.joined_view;
  68. go
  69. create view dbo.joined_view as
  70.     select
  71.         b.title         as title,
  72.         w.name          as author,
  73.         b.year          as year,
  74.         b.rating        as rating
  75.     from dbo.books b
  76.     inner join dbo.writers w
  77.         on b.wid = w.id;
  78. go
  79.  
  80. insert dbo.writers values
  81.     ('john tolkien'),
  82.     ('george martin'),
  83.     ('george orwell'),
  84.     ('andy weir'),
  85.     ('raymond bradbury'),
  86.     ('herbert wells'),
  87.     ('daniel brown');
  88. go
  89.  
  90. insert dbo.books values
  91.     ('the lord of the rings', 1, 1954, 10),
  92.     ('the hobbit, or there and back again', 1, 1937, 8),
  93.     ('a game of thrones', 2, 1996, 7),
  94.     ('a dance with dragons', 2, 2011, 9),
  95.     ('1984', 3, 1949, 6),
  96.     ('the martian', 4, 2011, 8),
  97.     ('fahrenheit 451', 5, 1953, 6),
  98.     ('the war of the worlds', 6, 1897, 7),
  99.     ('the da vinci code', 7, 2003, 6);
  100. go
  101. --this query ^ is used to get tables back to their normal states
  102.  
  103.  
  104.  
  105.  
  106.  
  107. //ANOTHER QUERY:
  108.  
  109.  
  110.  
  111. use lab9;
  112. go
  113.  
  114. if OBJECT_ID(N'dbo.rand_insert', N'P') is not null
  115.     drop procedure dbo.rand_insert
  116. go
  117. CREATE PROCEDURE dbo.rand_insert
  118. AS
  119.     SET NOCOUNT ON;
  120.     declare @rand_ptr int = ABS(Checksum(NewID()) % 3);
  121.  
  122.     if (@rand_ptr = 0)
  123.         INSERT INTO dbo.writers values ('ivan ivanov');
  124.     if (@rand_ptr = 1)
  125.         INSERT INTO dbo.writers values ('petr petrov');
  126.     if (@rand_ptr = 2)
  127.         INSERT INTO dbo.writers values ('sergey sergeev');
  128. go
  129.  
  130.  
  131. --==============================================================
  132. ------------------------SIMPLE-TRIGGERS-------------------------
  133. --==============================================================
  134. --1.Для одной из таблиц пункта 2 задания 7 создать триггеры на вставку, удаление и добавление,
  135.     --при выполнении заданных условий один из триггеров должен инициировать возникновение ошибки (RAISERROR / THROW).
  136.  
  137. --trigger on INSERT with RAISERROR
  138. if OBJECT_ID(N'dbo.writers_trigger_insert', N'TR') is not null
  139.     drop trigger dbo.writers_trigger_insert
  140. go
  141. create trigger dbo.writers_trigger_insert
  142.     on dbo.writers
  143.     for insert
  144.     as
  145.         declare @min_val int = 10;
  146.  
  147.         if exists (select *
  148.             from inserted
  149.             where inserted.id >= @min_val)
  150.             RAISERROR('[INS/UPD TRIGGER]: Entry with "writer.id" > 10 were added', 10, 1);
  151. go
  152.  
  153.  
  154. --trigger on UPDATE
  155. if OBJECT_ID(N'dbo.writers_trigger_update', N'TR') is not null
  156.     drop trigger dbo.writers_trigger_update
  157. go
  158. create trigger dbo.writers_trigger_update
  159.     on dbo.writers
  160.     for update
  161.     as
  162.         print 'table dbo.writers has been updated'
  163. go
  164.  
  165.  
  166. --trigger on DELETE
  167. if OBJECT_ID(N'dbo.writers_trigger_delete', N'TR') is not null
  168.     drop trigger dbo.writers_trigger_delete
  169. go
  170. create trigger dbo.writers_trigger_delete
  171.     on dbo.writers
  172.     instead of delete
  173.     as
  174.         declare @comparator int = 8;
  175.         --delete only if there are more than 10 entries
  176.         if (select count(*) from dbo.writers) > 10
  177.         begin
  178.             print '[DEL TRIGGER]: Entries with "w_id" >= ' + CAST(@comparator as varchar) + ' are deleted'
  179.             delete from dbo.writers
  180.                 where writers.id >= @comparator
  181.         end
  182. go
  183. --EXEC dbo.rand_insert;
  184. --delete from dbo.writers where id > 1;
  185. --select * from dbo.writers;
  186.  
  187.  
  188.  
  189. --==============================================================
  190. -------------------------INSERT-ON-VIEW-------------------------
  191. --==============================================================
  192. --2.Для представления пункта 2 задания 7 создать триггеры на вставку, удаление и добавление,
  193.     --обеспечивающие возможность выполнения операций с данными непосредственно через представление.
  194.  
  195. --simple triggers modified base table so
  196.     --rerun first query (create tables and view)
  197.     --and disable triggers above
  198. disable trigger dbo.writers_trigger_delete on dbo.writers;
  199. go
  200. disable trigger dbo.writers_trigger_update on dbo.writers;
  201. go
  202. disable trigger dbo.writers_trigger_insert on dbo.writers;
  203. go
  204.  
  205. if OBJECT_ID(N'dbo.joined_trigger_insert', N'TR') is not null
  206.     drop trigger dbo.joined_trigger_insert
  207. go
  208. create trigger dbo.joined_trigger_insert
  209.     on dbo.joined_view
  210.     instead of insert
  211.     as
  212.     begin
  213.  
  214.         insert into dbo.writers
  215.             select distinct i.author
  216.                 from inserted as i
  217.                 where i.author not in (select name
  218.                     from dbo.writers)
  219.  
  220.         insert into dbo.books
  221.             select
  222.                     i.title,
  223.                     (select id from dbo.writers as w where i.author = w.name),
  224.                     i.year,
  225.                     i.rating
  226.                 from inserted as i
  227.     end
  228. go
  229.  
  230.  
  231. insert into dbo.joined_view values
  232.     ('the invisible man', 'herbert wells', 1897, 6)
  233. insert into dbo.joined_view values
  234.     ('a dream of spring', 'george martin', 2016, 9)
  235. insert into dbo.joined_view values
  236.     ('RANDOM BOOK', 'NEW AUTHOR', 111, 10)
  237. select * from dbo.joined_view
  238. select * from dbo.books
  239. select * from dbo.writers
  240.  
  241.  
  242.  
  243. --==============================================================
  244. -------------------------DELETE-ON-VIEW-------------------------
  245. --==============================================================
  246. if OBJECT_ID(N'dbo.joined_trigger_delete', N'TR') is not null
  247.     drop trigger dbo.joined_trigger_delete
  248. go
  249. create trigger dbo.joined_trigger_delete
  250.     on dbo.joined_view
  251.     instead of delete
  252.     as
  253.     begin
  254.         delete from dbo.books
  255.             where books.title in (select d.title
  256.                 from deleted as d)
  257.     end
  258. go
  259.  
  260.  
  261. delete from dbo.joined_view
  262.     where joined_view.author in ('daniel brown', 'andy weir')
  263. delete from dbo.joined_view
  264.     where joined_view.title = 'the invisible man'
  265. delete from dbo.joined_view
  266.     where joined_view.rating = 10
  267. select * from dbo.joined_view
  268. select * from dbo.books
  269.  
  270.  
  271.  
  272. --==============================================================
  273. -------------------------UPDATE-ON-VIEW-------------------------
  274. --==============================================================
  275. if OBJECT_ID(N'dbo.joined_trigger_update', N'TR') is not null
  276.     drop trigger dbo.joined_trigger_update
  277. go
  278. create trigger dbo.joined_trigger_update
  279.     on dbo.joined_view
  280.     instead of update
  281.     as
  282.     begin
  283.  
  284.         if UPDATE(title) or UPDATE(author)
  285.             RAISERROR('[UPD TRIGGER]: "title" and "author" cant be modified', 16, 1)
  286.  
  287.         if UPDATE(year) or UPDATE(rating)
  288.             update dbo.books
  289.                 set
  290.                     books.year = (select year from inserted where inserted.title = books.title),
  291.                     books.rating = (select rating from inserted where inserted.title = books.title)
  292.                 where books.title = (select title from inserted where inserted.title = books.title)
  293.  
  294.     end
  295. go
  296.  
  297. update dbo.joined_view
  298.     set rating = 451,
  299.         year = 451
  300.     where joined_view.author = 'raymond bradbury';
  301. update dbo.joined_view
  302.     set rating = 10
  303.     where joined_view.author = 'george martin';
  304. update dbo.joined_view
  305.     set year = 2045
  306.     where joined_view.title = 'a dream of spring';
  307. select * from dbo.joined_view
  308. select * from dbo.books
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement