Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 14.43 KB | None | 0 0
  1. -- убить все соединения
  2. USE master;
  3. GO
  4. DECLARE @kill varchar(8000) = '';
  5.  
  6. SELECT @kill = @kill + 'KILL ' + CONVERT(varchar(5), c.session_id) + ';'
  7. FROM sys.dm_exec_connections AS c
  8. JOIN sys.dm_exec_sessions AS s
  9.     ON c.session_id = s.session_id
  10. WHERE c.session_id <> @@SPID
  11. ORDER BY c.connect_time ASC
  12.  
  13. EXEC(@kill)
  14. GO
  15.  
  16. USE master;
  17. GO
  18. --удаление БД
  19. IF DB_ID (N'Lab9') IS NOT NULL
  20. DROP DATABASE Lab9;
  21. GO
  22.  
  23. --создание БД
  24. CREATE DATABASE Lab9
  25. ON ( NAME = Lab9_dat,
  26. FILENAME = '/tmp/data/lab9dat.mdf',
  27. SIZE = 10, MAXSIZE = 150, FILEGROWTH = 5% )
  28. LOG ON ( NAME = Lab9_log,
  29. FILENAME = '/tmp/data/lab9dat.ldf',
  30. SIZE = 5MB, MAXSIZE = 150MB, FILEGROWTH = 5MB )
  31. GO
  32.  
  33. USE Lab9;
  34. GO
  35.  
  36. IF OBJECT_ID(N'Actor') IS NOT NULL
  37. DROP TABLE Actor;
  38. go
  39.  
  40. CREATE TABLE Actor
  41. (ActorId int IDENTITY(1,1) PRIMARY KEY with (ignore_dup_key=on) NOT NULL,
  42.     LastName VARCHAR (100) NOT NULL,
  43.     FirstName VARCHAR (100) NOT NULL,
  44.     BirthYear int NULL,
  45.     Country VARCHAR(50) NULL,
  46. )
  47. GO
  48.  
  49. INSERT Actor (LastName, FirstName, BirthYear, Country)
  50. VALUES ('Hanks', 'Thomas', 1956, 'U.S.');
  51. INSERT Actor (LastName, FirstName, BirthYear, Country)
  52. VALUES ( 'Sherwood', 'Dominic', 1990, 'England');
  53. INSERT Actor ( LastName, FirstName, BirthYear, Country)
  54. VALUES ('McNamara', 'Katherine', 1995, 'U.S.');
  55. INSERT Actor ( LastName, FirstName, BirthYear, Country)
  56. VALUES ( 'Amell', 'Stephen', 1981, 'Canada');
  57. GO
  58.  
  59. SELECT N'Table with actors', * FROM Actor
  60.  
  61. IF OBJECT_ID(N'Film') IS NOT NULL
  62. DROP TABLE Film;
  63. go
  64.  
  65. CREATE TABLE Film
  66. (FilmId int IDENTITY(1,1) PRIMARY KEY with (ignore_dup_key=on) NOT NULL,
  67.     FilmName VARCHAR (50) NOT NULL,
  68.     Year int NULL,
  69.     Genre VARCHAR (100) NULL,
  70.     Country VARCHAR(50) NULL,
  71.     Actor_Id int NULL DEFAULT (3),
  72.     CONSTRAINT FK_Actor_Film
  73.         FOREIGN KEY (Actor_Id) REFERENCES Actor (ActorId)
  74.         --ON DELETE CASCADE --Если из родительской таблицы удаляется строка, соответствующие ей строки удаляются и из ссылающейся таблицы.
  75.         --ON UPDATE CASCADE
  76.         --ON DELETE NO ACTION --Компонент Компонент SQL Server Database Engine формирует ошибку, и выполняется откат операции удаления строки из родительской таблицы.
  77.         --ON UPDATE NO ACTION
  78.         ON DELETE SET NULL --Все значения, составляющие внешний ключ, при удалении соответствующей строки родительской таблицы устанавливаются в значение NULL.
  79.         ON UPDATE SET NULL
  80.         --ON DELETE SET DEFAULT --Все значения, содержащие внешний ключ, при удалении соответствующей строки родительской таблицы устанавливаются в значения по умолчанию. Для выполнения этого ограничения все внешние ключевые столбцы должны иметь определения по умолчанию. Если столбец допускает значения NULL и значение по умолчанию явно не определено, значением столбца по умолчанию становится NULL.
  81.         --ON UPDATE SET DEFAULT,
  82.        
  83. )
  84. GO
  85.  
  86. INSERT Film (FilmName, Year, Genre, Country, Actor_Id)
  87. VALUES ('Inferno', 2016, 'Mystery action thriller film', 'United States', 1);
  88. INSERT Film (FilmName, Year, Genre, Country, Actor_Id)
  89. VALUES ('Teenage Mutant Ninja Turtles: Out of the Shadows', 2016, 'Fantasy', 'United States', 4);
  90. INSERT Film (FilmName, Year, Genre, Country, Actor_Id)
  91. VALUES ('Vampire Academy', 2014, 'Fantasy comedy horror film', 'United States, United Kingdom', 2);
  92. INSERT Film (FilmName, Year, Genre, Country, Actor_Id)
  93. VALUES ('Maze Runner: The Death Cure', 2018, ' Dystopian science fiction film', 'United States', 3);
  94. GO
  95.  
  96. SELECT N'Table with films', * FROM Film
  97. GO
  98.  
  99.  
  100. IF OBJECT_ID(N'Actor_Film') is not NULL
  101. DROP VIEW Actor_Film;
  102. GO
  103.  
  104. --Создать представление на основе полей обеих связанных таблиц задания 6
  105. CREATE VIEW Actor_Film AS
  106.     SELECT
  107.         f.FilmName, f.Country, a.LastName, a.FirstName, a.BirthYear
  108.     FROM Film f INNER JOIN Actor a
  109.         ON f.Actor_Id = a.ActorId
  110. GO
  111.  
  112. SELECT 'View Table', * FROM Actor_Film;
  113. GO
  114.  
  115. --Для одной из таблиц пункта 2 задания 7 создать триггеры на вставку, удаление и добавление, при
  116. --выполнении заданных условий один из триггеров должен инициировать возникновение ошибки
  117. --(RAISERROR / THROW).
  118.  
  119. UPDATE Actor_Film
  120. Set FilmName = FilmName + 'x'
  121. GO
  122.  
  123. --Тригер на удаление
  124. IF OBJECT_ID ('TableDeleteTrig','TR') IS NOT NULL
  125.    DROP TRIGGER TableDeleteTrig;
  126. GO
  127.  
  128. CREATE TRIGGER TableDeleteTrig ON Actor
  129.     AFTER DELETE AS
  130.     PRINT 'Film was deleted'
  131.     --UPDATE Actor
  132.     --SET IsDeleted = 1
  133.     --WHERE ActorId = (SELECT ActorId FROM deleted) --Country = 'U.S.'
  134. GO
  135.  
  136. DELETE FROM Actor
  137. WHERE FirstName='Thomas'
  138. or (FirstName = 'Katherine');
  139. GO
  140. /*
  141. DELETE FROM Actor
  142. WHERE --FirstName='Thomas'
  143.  (BirthYear > 1989);
  144. GO*/
  145.  
  146. SELECT 'Delete Trigger', * FROM Actor;
  147. GO
  148.  
  149. INSERT Actor (LastName, FirstName, BirthYear, Country)
  150. VALUES ( 'Hanks', 'Thomas', 1956, 'U.S.');
  151. INSERT Actor ( LastName, FirstName, BirthYear, Country)
  152. VALUES ( 'McNamara', 'Katherine', 1995, 'U.S.');
  153.  
  154. --Тригер на вставку
  155. IF OBJECT_ID ('NewFilm','TR') IS NOT NULL
  156.    DROP TRIGGER NewFilm;
  157. GO
  158.  
  159. CREATE TRIGGER NewFilm ON Film
  160. AFTER INSERT
  161. AS
  162. IF UPDATE(FilmId)
  163.         PRINT 'New film was inserted'
  164. IF EXISTS (SELECT *
  165.            FROM Film p
  166.            JOIN inserted AS i
  167.            ON p.FilmId = i.FilmId
  168.            JOIN Actor AS v
  169.            ON v.ActorId = p.Actor_Id
  170.            WHERE v.BirthYear != 1990
  171.           )
  172. BEGIN
  173. --RaISERROR(15600, -1, -1, N'The year isnt a BirthYear of our Actor');
  174. --print 'np'
  175. --ROLLBACK TRANSACTION;  --Откатывает явные или неявные транзакции до начала или до точки сохранения транзакции.
  176. RETURN
  177. END;
  178. GO
  179.  
  180. INSERT INTO Film (FilmName, Year, Genre, Country, Actor_Id)
  181. VALUES (
  182. 'ShadowHunters',
  183. 2016,
  184. 'Fantasy',
  185. 'United States',
  186. 2);
  187. INSERT INTO Film (FilmName, Year, Genre, Country, Actor_Id)
  188. VALUES (
  189.     'Inserted Film: Arrow',
  190.     2012,
  191.     'Crime, Mystery',
  192.     'United States',
  193. 4
  194. );
  195. GO
  196.  
  197. INSERT INTO Film (FilmName, Year, Genre, Country, Actor_Id)
  198. VALUES (
  199. 'ShadowHunters season 2',
  200. 2017,
  201. 'Fantasy',
  202. 'United States',
  203. 2);
  204. GO
  205.  
  206. SELECT 'Insert trigger', * FROM Film;
  207. GO
  208.  
  209. --Тригер на добавление
  210. IF OBJECT_ID ('TableUpdateTrig','TR') IS NOT NULL
  211.    DROP TRIGGER TableUpdateTrig;
  212. GO
  213.  
  214. --CREATE TRIGGER TableUpdateTrig ON Actor
  215. --FOR UPDATE AS
  216.  
  217.  
  218. --SELECT * FROM Actor.Inserted;
  219. --GO
  220.  
  221.  
  222. UPDATE Actor
  223. SET BirthYear = BirthYear + 5508
  224. WHERE ActorId = 4;
  225. GO
  226.  
  227. IF OBJECT_ID ('my_trig','TR') IS NOT NULL
  228.    DROP TRIGGER my_trig;
  229. GO
  230.  
  231. CREATE TRIGGER my_trig
  232. ON Actor
  233. AFTER INSERT
  234. AS
  235. IF UPDATE(BirthYear)
  236. PRINT 'Actor was inserted'
  237.  UPDATE Actor
  238. SET BirthYear = inserted.BirthYear + 5508
  239. FROM inserted
  240. WHERE inserted.ActorId = 4;
  241. GO
  242.  
  243. SELECT N'Table with trigger for strings', * FROM Actor
  244. GO
  245.  
  246. /*CREATE TRIGGER TableUpdateTrig  
  247. ON Actor  
  248. AFTER UPDATE  
  249. AS THROW 51000, 'Attempt to modify a column', 0;  
  250. GO */
  251.  
  252. --Триггер на добавление/изменение
  253.  
  254. /*CREATE TRIGGER TableUpdateTrig
  255. ON Actor
  256. AFTER UPDATE
  257. AS
  258. IF UPDATE (ActorId)
  259. BEGIN
  260.     THROW 51000, 'Attempt to modify a column', 0
  261.     ROLLBACK TRANSACTION
  262. END
  263. IF UPDATE(BirthYear)
  264. PRINT ('Column BirthYear ModifActorIdied')
  265. GO
  266. */
  267.  
  268.  
  269. CREATE TRIGGER TableUpdateTrig
  270. ON Actor
  271. AFTER UPDATE
  272. AS
  273. IF UPDATE (ActorId)
  274.  
  275. THROW 51000, 'Attempt to modify a column', 0
  276. --ROLLBACK TRANSACTION
  277.  
  278. IF UPDATE(BirthYear) OR UPDATE(Country)
  279. PRINT ('Column BirthYear or Country Modified')
  280.  
  281. INSERT INTO Film (Actor_ID, FilmName, Country)
  282. SELECT ActorId, 'Added film Deadpool', Country
  283. FROM INSERTED
  284. GO
  285.  
  286. INSERT INTO Actor(FirstName, LastName, BirthYear, Country)
  287. VALUES ('Ryan', 'Reynolds', 1976, 'United States');
  288. GO
  289.  
  290. UPDATE Actor
  291. SET BirthYear = BirthYear + 5508
  292. WHERE ActorId = 4;
  293. GO
  294.  
  295. UPDATE Film SET Country = 'UK'
  296. WHERE Country = 'United States, United Kingdom';
  297. GO
  298.  
  299. UPDATE Actor
  300. SET Country = 'America'
  301. WHERE FirstName = 'Rayn';
  302. GO
  303.  
  304. SELECT N'Table UpdateTrigger films 5', * FROM Film
  305. GO
  306.  
  307. SELECT N'Table UpdateTrigger films', * FROM Film
  308. GO
  309. SELECT N'Table UpdateTrigger actors', * FROM Actor
  310. GO
  311. SELECT N'Table UpdateTrigger actors', * FROM Film
  312. GO
  313.  
  314. -------------------------------------------------------------------------
  315. --Для представления пункта 2 задания 7 создать триггеры на вставку, удаление и добавление,
  316. --обеспечивающие возможность выполнения операций с данными непосредственно через представление.
  317.  
  318. --Триггер на удаление для представления
  319. IF OBJECT_ID ('TriggerViewDelete','TR') IS NOT NULL
  320.    DROP TRIGGER TriggerViewDelete;
  321. GO
  322. /*
  323. CREATE TRIGGER TriggerViewDelete
  324. ON Actor_Film
  325. INSTEAD OF DELETE
  326. AS
  327.     IF EXISTS(SELECT * FROM deleted)
  328.     BEGIN
  329.         SET NOCOUNT ON;
  330.         DELETE O
  331.         FROM deleted d
  332.         JOIN Actor O ON d.ActorId IN (O.ActorId, O.BirthYear);
  333.         DELETE Actor_Film
  334.         FROM deleted
  335.         --WHERE deleted.ActorId = Actor_Film.ActorId;
  336.         WHERE deleted.FirstName='Ryan';
  337.  
  338.     END;
  339. GO*/
  340.  
  341. CREATE TRIGGER trig_DELETE_task2
  342. ON Actor_Film
  343. INSTEAD OF DELETE
  344. AS
  345.     /*MERGE Actor AS Actor
  346.     USING (SELECT ActorId FROM deleted) AS ActorView (ID)
  347.     ON Actor.ActorId = ActorView.ID
  348.     WHEN MATCHED THEN DELETE;*/
  349.     delete from Actor where LastName in (select LastName from deleted)
  350. GO
  351. SELECT * FROM Actor_Film
  352. GO
  353. /*
  354. CREATE TRIGGER TriggerViewDelete ON Actor_Film
  355.     INSTEAD OF DELETE AS
  356.     UPDATE Actor
  357.     SET IsDeleted = 1
  358.     --WHERE ActorId = ActorId + (SELECT ActorId FROM deleted); --Country = 'U.S.'
  359. GO
  360. */
  361. DELETE FROM Actor
  362. WHERE BirthYear = 1995
  363. or (FirstName = 'Katherine');
  364. GO
  365. SELECT * FROM Actor_Film
  366. GO
  367.  
  368. INSERT Actor (LastName, FirstName, BirthYear, Country)
  369. VALUES ('McNamara', 'Katherine', 1995, 'U.S.');
  370.  
  371. /*
  372. DELETE FROM Actor
  373. WHERE (FirstName = 'Ryan')
  374. GO
  375. SELECT * FROM Actor_Film
  376. GO*/
  377.  
  378. /*CREATE TRIGGER [dbo].[DeletedHardware] ON  [dbo].[Hardware] INSTEAD OF DELETE
  379. AS
  380.  IF EXISTS(SELECT * FROM deleted)
  381.  BEGIN
  382.   SET NOCOUNT ON;
  383.   DELETE O
  384.   FROM deleted d
  385.   JOIN dbo.Orders O ON d.[IDHardware] IN(O.[IDHardware1],O.[IDHardware2],O.[IDHardware3]);
  386.   DELETE dbo.Hardware
  387.   FROM deleted
  388.   WHERE deleted.[IDHardware]=Hardware.[IDHardware];
  389.  END;
  390.  */
  391. /*
  392. DELETE FROM Actor
  393. FROM Film f INNER JOIN deleted
  394.         ON f.Actor_Id = deleted.ActorId
  395.         and deleted.
  396.  
  397. WHERE FirstName='Thomas';
  398. GO
  399. */
  400. SELECT 'DeleteView Trigger', * FROM Actor_Film;
  401. GO
  402. SELECT 'Delete View Trigger Actor', * FROM Actor;
  403. GO
  404.  
  405. --Триггер на вставку для представления
  406. IF OBJECT_ID ('TriggerViewInsert','TR') IS NOT NULL
  407.    DROP TRIGGER TriggerViewInsert;
  408. GO
  409.  
  410. CREATE TRIGGER TriggerViewInsert
  411.     ON Actor_Film
  412.     INSTEAD OF INSERT
  413.     AS BEGIN
  414.         INSERT INTO Film (Country, FilmName, Actor_Id)
  415.         SELECT inserted.Country, inserted.FilmName,
  416.         (SELECT ActorId FROM Actor WHERE Actor.LastName = inserted.LastName)
  417.         from inserted
  418.         INSERT INTO Actor (FirstName, LastName, BirthYear)
  419.         SELECT inserted.FirstName, inserted.LastName, inserted.BirthYear
  420.         from inserted
  421.     END
  422. GO
  423.  
  424. INSERT INTO Actor_Film(FirstName, LastName, BirthYear, Country, FilmName)
  425. VALUES('Katherine', 'McNamara', 1995, 'U. S.', 'Girl vs the monster');
  426. GO
  427. /*
  428. INSERT INTO Actor(ActorId, FirstName, LastName, BirthYear, Country)
  429. VALUES (5, 'Kristen', 'Stewart', 1990, 'United States');
  430. GO
  431.  
  432. INSERT INTO Film(FilmId, FilmName, Year, Genre, Country, Actor_Id)
  433. VALUES(8, 'Inserted Film: Twillight', 2008, 'fantasy', 'U.S.', 5)
  434. GO
  435. */
  436. SELECT N'Table with Inserttrigger for view', * FROM Actor_Film
  437. GO
  438. SELECT 'Films', * FROM Film
  439.  
  440. --Триггер на изменение/добавление для представления
  441. IF OBJECT_ID ('TriggerViewUpdate','TR') IS NOT NULL
  442.    DROP TRIGGER TriggerViewUpdate;
  443. GO
  444.  
  445. CREATE TRIGGER TriggerViewUpdate
  446.     ON Actor_Film
  447.     INSTEAD OF UPDATE
  448.     AS BEGIN
  449.  
  450.         If UPDATE(FirstName) or UPDATE (BirthYear)
  451.         PRINT 'FirstName or LastName was changed'
  452.         PRINT 'BirthYear changed'
  453.         Begin
  454.             Update Actor
  455.             Set FirstName = inserted.FirstName, BirthYear = inserted.BirthYear--,LastName = inserted.LastName
  456.             FROM inserted
  457.             Join Actor
  458.             On Actor.LastName = inserted.LastName
  459.         END
  460.         IF UPDATE(Country)
  461.         PRINT 'Country was changed'
  462.         Begin
  463.             Update Film
  464.             Set Country = inserted.Country
  465.             FROM inserted
  466.             Join Film
  467.             On Film.FilmName = inserted.FilmName
  468.         END
  469.         IF UPDATE(FilmName) --or UPDATE (ActorId)
  470.             THROW 51000, 'Cannot change Filmname and ActorId', 0
  471.        
  472.  
  473. /*
  474.         INSERT INTO Actor
  475.         SELECT *
  476.         from inserted*/
  477.     END
  478. GO
  479. GO
  480. UPDATE Actor_Film
  481. set BirthYear = BirthYear + 5008
  482. SELECT 'Actors2', * FROM Actor
  483.  
  484. SELECT 'Films2', * FROM Film
  485. /*
  486. INSERT INTO Actor(FirstName, LastName, BirthYear, Country)
  487. VALUES ('Channing', 'Tatum', 1980, 'U. S.');
  488. GO
  489.  
  490. INSERT INTO Film(FilmName, Country, Actor_Id)
  491. VALUES ('Updated film: Step Up', 'U. S.', 8);
  492. GO
  493. */
  494. INSERT INTO Actor_Film(FilmName, Country, FirstName, LastName, BirthYear)
  495. VALUES('Updated film: Step Up', 'U. S.', 'Channing', 'Tatum', 1980)
  496. --update Actor_Film set Filmname = Filmname + 'y', LastName = LastName + 'z'
  497. update Actor_Film SET Country = Country + 'c'
  498.  
  499. UPDATE Actor SET FirstName = 'Tom'
  500. WHERE FirstName = 'Thomas';
  501. GO
  502.  
  503. UPDATE Actor SET FirstName = 'Dom'
  504. WHERE FirstName = 'Dominic';
  505. GO
  506.  
  507. SELECT * FROM Actor
  508. SELECT N'Table with Updatetrigger for view', * FROM Actor_Film
  509. GO
  510.  
  511. SELECT * FROM Film
  512. GO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement