Advertisement
Ladies_Man

#DB Lab15 (linked distr) COMPLETE

Jan 16th, 2016
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 6.73 KB | None | 0 0
  1. --Задание 15. Создание распределенных баз данных со связанными таблицами средствами СУБД SQL Server 2012
  2.  
  3.  
  4. --1.Создать в базах данных пункта 1 задания 13 связанные таблицы.
  5. --2.Создать необходимые элементы базы данных (представления, триггеры),
  6.     --обеспечивающие работу с данными связанных таблиц (выборку, вставку, изменение, удаление).
  7.  
  8.  
  9. use master;
  10. go
  11. if DB_ID (N'lab15_1') is not null
  12.     drop database lab15_1;
  13. go
  14. create database lab15_1
  15. go
  16.  
  17.  
  18. use master;
  19. go
  20. if DB_ID (N'lab15_2') is not null
  21.     drop database lab15_2;
  22. go
  23. create database lab15_2
  24. go
  25.  
  26.  
  27. --1.Создать в базах данных пункта 1 задания 13 связанные таблицы.
  28. --================================================
  29. -----------------DATABASE-1-PARENT----------------
  30. --================================================
  31. use lab15_1;
  32. go
  33.  
  34. if OBJECT_ID(N'writers', N'U') is not null
  35.     drop table writers
  36. go
  37. create table writers
  38. (
  39.     id              int             identity(1,1),
  40.     name            varchar(35),
  41.  
  42.     PRIMARY KEY (id)
  43. );
  44. go
  45.  
  46.  
  47. --================================================
  48. -----------------DATABASE-2-CHILD-----------------
  49. --================================================
  50. use lab15_2;
  51. go
  52.  
  53. if OBJECT_ID(N'books', N'U') is not null
  54.     drop table books;
  55. go
  56. create table books
  57. (
  58.     title           varchar(254),
  59.     wid             int,
  60.     rating          int,
  61.     instock         varchar(35),
  62.  
  63.     PRIMARY KEY (title)
  64.     --foreign key references не работает между 2мя бд,
  65.     --т.ч. таблицы "связаны" только условно, через триггеры
  66. );
  67. go
  68.  
  69.  
  70. --2.Создать необходимые элементы базы данных (представления, триггеры),
  71.     --обеспечивающие работу с данными связанных таблиц (выборку, вставку, изменение, удаление).
  72. --==============================================================
  73. --========================P-A-R-E-N-T===========================
  74. --==============================================================
  75.  
  76. --==============================================================
  77. -----------------------INSERT-ON-PARENT-------------------------
  78. --==============================================================
  79.  
  80. --normal insert on parent (writers). trigger is not necessary
  81.  
  82. use lab15_1;
  83. go
  84. insert into writers values
  85.     ('john tolkien'),
  86.     ('george r.r. martin'),
  87.     ('andy weir');
  88.  
  89. select * from writers
  90.  
  91. --==============================================================
  92. -----------------------DELETE-ON-PARENT-------------------------
  93. --==============================================================
  94.  
  95. --let there be cascade delete on child table
  96.  
  97. use lab15_1;
  98. go
  99. if OBJECT_ID(N'writers_del', N'TR') is not null
  100.     drop trigger writers_del
  101. go
  102. create trigger writers_del
  103.     on lab15_1.dbo.writers
  104.     instead of delete
  105.     --after
  106.     as
  107.     begin
  108.        
  109.         delete from lab15_1.dbo.writers
  110.             where id in (select id from deleted)
  111.  
  112.         delete from lab15_2.dbo.books
  113.             where wid in (select id from deleted)
  114.     end
  115. go
  116.  
  117. delete from writers
  118.     where writers.name like '%andy%';
  119.  
  120. select * from writers
  121.  
  122. --==============================================================
  123. -----------------------UPDATE-ON-PARENT-------------------------
  124. --==============================================================
  125.  
  126. --let the "id" be unupdatable
  127. --and the "name" be updatable so we dont care wht happens to child's 'foreign key' (wid)
  128.  
  129. use lab15_1;
  130. go
  131. if OBJECT_ID(N'writers_upd', N'TR') is not null
  132.     drop trigger writers_upd
  133. go
  134. create trigger writers_upd
  135.     on lab15_1.dbo.writers
  136.     instead of update
  137.     as
  138.     begin
  139.  
  140.         if UPDATE(id)
  141.             RAISERROR('[PARENT-UPD TRIGGER]: "id" cant be modified', 16, 1);
  142.  
  143.         if UPDATE(name)
  144.         begin
  145.             update writers
  146.                 set name = (select name from inserted)
  147.                 where writers.id = (select id from inserted)
  148.         end
  149.  
  150.     end
  151. go
  152.  
  153. update writers
  154.     set name = 'george martin'
  155.     where name like '%martin%'
  156.  
  157. select * from writers
  158.  
  159.  
  160.  
  161. --==============================================================
  162. --=========================C-H-I-L-D============================
  163. --==============================================================
  164.  
  165. --==============================================================
  166. ------------------------INSERT-ON-CHILD-------------------------
  167. --==============================================================
  168.  
  169. --check if child's foreign key (wid) references to the existing entry in parent (writers)
  170.  
  171. use lab15_2;
  172. go
  173. if OBJECT_ID(N'books_ins', N'TR') is not null
  174.     drop trigger books_ins
  175. go
  176. create trigger books_ins
  177.     on lab15_2.dbo.books
  178.     instead of insert
  179.     as
  180.     begin
  181.  
  182.         if exists (select wid from inserted where wid not in (select id from lab15_1.dbo.writers))
  183.             begin
  184.                 RAISERROR('[CHILD-INS TRIGGER]: reference to parental entry was not found!', 16, 1);
  185.             end
  186.  
  187.         else
  188.             begin
  189.                 insert into books
  190.                     select * from inserted
  191.             end
  192.  
  193.     end
  194. go
  195.  
  196. insert into books values
  197.     ('a dance with dragons', 2, 9, 'available'),
  198.     ('a dream of spring', 2, -1, 'n/a'),
  199.     ('the hobbit, or blablabla', 1, 7, 'available');
  200.  
  201. select * from books
  202.  
  203. --==============================================================
  204. -----------------------DELETE-ON-CHILD--------------------------
  205. --==============================================================
  206.  
  207. --just regular delete
  208.  
  209. delete from books
  210.     where title like '%dream%';
  211.  
  212. select * from books
  213.  
  214. --==============================================================
  215. -----------------------UPDATE-ON-CHILD--------------------------
  216. --==============================================================
  217.  
  218. --let the "wid" and "title" be unupdatable
  219.  
  220. use lab15_2;
  221. go
  222. if OBJECT_ID(N'books_upd', N'TR') is not null
  223.     drop trigger books_upd
  224. go
  225. create trigger books_upd
  226.     on lab15_2.dbo.books
  227.     instead of update
  228.     as
  229.     begin
  230.  
  231.         if UPDATE(wid) or UPDATE(title)
  232.             begin
  233.                 RAISERROR('[CHILD-UPD TRIGGER]: "wid" and "title" are unupdatable', 16, 1);
  234.             end
  235.  
  236.         if UPDATE(rating) or UPDATE(instock)
  237.             begin
  238.                 update books
  239.                     set
  240.                         rating = (select rating from inserted where inserted.title = books.title),
  241.                         instock = (select instock from inserted where inserted.title = books.title)
  242.                     where title = (select title from inserted where inserted.title = books.title)
  243.             end
  244.     end
  245. go
  246.  
  247. update books
  248.     set rating = 10
  249.     where title like '%dragons%'
  250.  
  251. update books
  252.     set instock = 'n/a'
  253.     where title like '%hobbit%'
  254.  
  255. select * from books
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement