Advertisement
Ladies_Man

#DB Lab14 (vertical distr) COMPLETE

Dec 31st, 2015
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 5.77 KB | None | 0 0
  1. --Задание 14. Создание вертикально фрагментированных таблиц средствами СУБД SQL Server 2012
  2.  
  3.  
  4. --1.Создать в базах данных пункта 1 задания 13 таблицы, содержащие вертикально фрагментированные данные.
  5. --2.Создать необходимые элементы базы данных (представления, триггеры),
  6.     --обеспечивающие работу с данными вертикально фрагментированных таблиц (выборку, вставку, изменение, удаление).
  7.  
  8.  
  9.  
  10. use master;
  11. go
  12. if DB_ID (N'lab13_1') is not null
  13.     drop database lab13_1;
  14. go
  15. create database lab13_1
  16. go
  17.  
  18.  
  19. use master;
  20. go
  21. if DB_ID (N'lab13_2') is not null
  22.     drop database lab13_2;
  23. go
  24. create database lab13_2
  25. go
  26.  
  27.  
  28. --1.Создать в базах данных пункта 1 задания 13 таблицы, содержащие вертикально фрагментированные данные.
  29. use lab13_1;
  30. go
  31. if OBJECT_ID(N'dbo.books', N'U') is not null
  32.     drop table dbo.books;
  33. go
  34. create table dbo.books (
  35.     id              int,    --здесь не должно быть identity
  36.                             --т.к. в триггере (ins) происходит вставка значения identity в 2 отдельные таблицы.
  37.                             --если во время вставки связь с одной таблицей потеряется, то в таблицу не будет занесена запись с верным identity.
  38.                             --в следующий раз будет выбрано неверное значение identity для этой таблицы
  39.                             --в итоге i-я запись в одной таблице будет соответствовать j-й записи в другой
  40.     title           varchar(254),
  41.  
  42.     PRIMARY KEY (id)
  43.     );
  44. go
  45.  
  46.  
  47. use lab13_2;
  48. go
  49. if OBJECT_ID(N'dbo.books', N'U') is not null
  50.     drop table dbo.books;
  51. go
  52. create table dbo.books (
  53.     id              int,
  54.     writer          varchar(35),
  55.  
  56.     PRIMARY KEY (id),
  57.     );
  58. go
  59.  
  60.  
  61. --2.Создать необходимые элементы базы данных (представления, триггеры),
  62.     --обеспечивающие работу с данными вертикально фрагментированных таблиц (выборку, вставку, изменение, удаление).
  63. use lab13_1;
  64. go
  65. if OBJECT_ID(N'vertical_dist_v', N'V') is not null
  66.     drop view vertical_dist_v;
  67. go
  68. create view vertical_dist_v as
  69.     select one.id, one.title, two.writer
  70.         from lab13_1.dbo.books as one,
  71.             lab13_2.dbo.books as two
  72.         where one.id = two.id
  73. go
  74.  
  75.  
  76. --==============================================================
  77. -------------------------INSERT-ON-VIEW-------------------------
  78. --==============================================================
  79. if OBJECT_ID(N'dbo.dist_ins', N'TR') is not null
  80.     drop trigger dbo.dist_ins
  81. go
  82. create trigger dbo.dist_ins
  83.     on dbo.vertical_dist_v
  84.     instead of insert
  85.     as
  86.     begin
  87.  
  88.         insert into lab13_1.dbo.books(id, title)
  89.             select id, title
  90.                 from inserted
  91.  
  92.         insert into lab13_2.dbo.books(id, writer)
  93.             select id, writer
  94.                 from inserted
  95.     end
  96. go
  97.  
  98. insert into dbo.vertical_dist_v values
  99.     (1, 'the lord of the rings', 'john tolkien'),
  100.     (2, 'the hobbit, or there and back again', 'john tolkien'),
  101.     (3, 'a dream of spring', 'martin scorsese'),
  102.     (4, 'a game of thrones', 'george martin'),
  103.     (5, 'random book', 'unknown');
  104.  
  105. select * from dbo.vertical_dist_v
  106. select * from lab13_1.dbo.books
  107. select * from lab13_2.dbo.books
  108.  
  109.  
  110. --==============================================================
  111. -------------------------DELETE-ON-VIEW-------------------------
  112. --==============================================================
  113. if OBJECT_ID(N'dbo.dist_del', N'TR') is not null
  114.     drop trigger dbo.dist_del
  115. go
  116. create trigger dbo.dist_del
  117.     on dbo.vertical_dist_v
  118.     instead of delete
  119.     as
  120.     begin
  121.        
  122.         delete lab13_1.dbo.books
  123.             where id in (select d.id
  124.                 from deleted as d)
  125.  
  126.         delete lab13_2.dbo.books
  127.             where id in (select d.id
  128.                 from deleted as d)
  129.     end
  130. go
  131.  
  132. delete dbo.vertical_dist_v
  133.     where writer = 'unknown'
  134.  
  135. select * from dbo.vertical_dist_v
  136. select * from lab13_1.dbo.books
  137. select * from lab13_2.dbo.books
  138.  
  139.  
  140. --==============================================================
  141. -------------------------UPDATE-ON-VIEW-------------------------
  142. --==============================================================
  143. if OBJECT_ID(N'dbo.dist_upd', N'TR') is not null
  144.     drop trigger dbo.dist_upd
  145. go
  146. create trigger dbo.dist_upd
  147.     on dbo.vertical_dist_v
  148.     instead of update
  149.     as
  150.     begin
  151.  
  152.         if UPDATE(id)
  153.             raiserror('[UPD TRIGGER]: "id" cant be modidfied', 16, 1)
  154.         else
  155.         begin
  156.  
  157.             update lab13_1.dbo.books
  158.                 set books.title = (select title from inserted where inserted.id = books.id)
  159.                     where books.id = (select id from inserted where inserted.id = books.id)
  160.  
  161.             update lab13_2.dbo.books
  162.                 set books.writer = (select writer from inserted where inserted.id = books.id)
  163.                     where books.id = (select id from inserted where inserted.id = books.id)
  164.         end
  165.     end
  166. go
  167.  
  168. update dbo.vertical_dist_v
  169.     set writer = 'george martin'
  170.     where writer like '%martin%'
  171.  
  172. select * from dbo.vertical_dist_v
  173. select * from lab13_1.dbo.books
  174. select * from lab13_2.dbo.books
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement