Создание базы данных, таблиц и связей используя графическую оболочку




Таблица с данными

Foreign key person_id

Таблица с данными

Foreign key person_in_movie_id
Таблица с данными
Таблица с данными

Foreign key person_id
Foreign key movie_id
Foreign key position_id

Таблица с данными
Таблица с данными
Foreign key movie_id
Foreign key genre_id
Таблица с данными

Таблица с данными

Таблица с данными
Foreign key movie_id
Foreign key production_company_id
Таблица с данными

Диаграмма базы данных movies


Koosta 3 protseduuri, mis on loodud seotud (JOIN) tabelite põhjal. Iseseisvalt määra mida protseduurid teevad. Käivita neid.

CREATE PROCEDURE otsingNaitlejaFilm
@nimi varchar(100),
@perekonnanimi varchar(100)
AS 
BEGIN
SELECT
p.first_name + ' ' + p.last_name AS actor,
m.title,
m.production_year,
m.duration
FROM person p
INNER JOIN person_in_movie pm ON p.id=pm.person_id
INNER JOIN movie m ON pm.movie_id = m.id
WHERE  p.first_name=@nimi AND p.last_name=@perekonnanimi;
END;

-- kutse
EXEC otsingNaitlejaFilm @nimi='Johnny', @perekonnanimi='Depp';

CREATE PROCEDURE zanrideArv
AS
BEGIN
SELECT
g.genre_name AS Zanr,
COUNT(mg.movie_id) AS FilmideArv
FROM genre g
INNER JOIN movie_genre mg ON g.id=mg.genre_id
GROUP BY g.genre_name
ORDER BY FilmideArv DESC;
END;

-- kutse
EXEC zanrideArv;

CREATE PROCEDURE uuendaFilmiZanr
@filmNimi varchar(100),
@uusZanr varchar(50)
AS
BEGIN
UPDATE mg SET mg.genre_id=g.id
FROM movie_genre mg
INNER JOIN movie m ON mg.movie_id=m.id
INNER JOIN genre g ON g.genre_name=@uusZanr
WHERE m.title=@filmNimi;

SELECT m.title, g.genre_name
FROM movie_genre mg
INNER JOIN movie m ON mg.movie_id = m.id
INNER JOIN genre g ON mg.genre_id = g.id;

END;

-- kutse
EXEC uuendaFilmiZanr 
@filmNimi='Harry Potter and the Philosophers Stone',
@uusZanr='Adventure';

Loo 2 kasutajat (admin, kes saab teha kõike kõikidega tabelitega / kasutajaNimi, kes saab lisada ja kontrollida andmed tabelites: person, pictures.





INSERT INTO quote(quote_text, person_in_movie_id)
VALUES ('I make a point of avoiding familiarity with pirates.', 7);
 
SELECT * FROM quote;
SELECT * FROM logi;






Loo 2-3 trigerid, mis jälgivad ainult põhitabelite täitmine/muutmine (näiteks, need tabelid kus on olemas FK).

Create table logi(
id int PRIMARY KEY IDENTITY (1,1),
toiming  varchar(100),
aeg DATETIME,
kasutajanimi varchar(25),
andmed TEXT
)

CREATE TRIGGER tsitaadiLisamineJaKustutamine
ON quote 
AFTER INSERT, DELETE
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO logi(toiming, aeg, kasutajanimi, andmed)
    SELECT
	'On tehtud INSERT käsk',
	GETDATE(),
    SUSER_NAME(),
    CONCAT('Tabel: "quote" / Tsitaat: "', inserted.quote_text, '", Roll: ', pm.role, ', Näitleja: ', p.first_name ,' ', p.last_name)  
    FROM inserted
	INNER JOIN person_in_movie pm ON pm.id=inserted.person_in_movie_id
	INNER JOIN person p ON p.id=pm.person_id
 
    UNION ALL
 
    SELECT
	'On tehtud DELETE käsk', 
	GETDATE(),
    SUSER_NAME(),
    CONCAT('Tabel: "quote" / Tsitaat: "', deleted.quote_text, '", Roll: ', pm.role, ', Näitleja: ', p.first_name ,' ', p.last_name)    
    FROM deleted
	INNER JOIN person_in_movie pm ON pm.id=deleted.person_in_movie_id
	INNER JOIN person p ON p.id=pm.person_id;
END
--Läbivaatus
INSERT INTO quote(quote_text, person_in_movie_id)
VALUES ('Not all treasure’s silver and gold, mate', 2);

SELECT * FROM quote;
SELECT * FROM logi;
--Läbivaatus
DELETE FROM
    quote
WHERE
    id=2;

SELECT * FROM quote;
SELECT * FROM logi;

CREATE TRIGGER naitlejaPildiUuendamine
ON picture
FOR UPDATE
AS
INSERT INTO logi(toiming, aeg, kasutajanimi, andmed)
SELECT
'On tehtud UPDATE',
GETDATE(),
SUSER_NAME(), 
CONCAT('Tabel: "picture" / Vanad andmed - Näitleja: ', p1.first_name, ' ', p1.last_name,
', Sünniaeg: ', p1.birth_date, ', Pildifaili nimi: ', deleted.picture_file_name,
' / Uued andmed - Näitleja: ', p2.first_name, ' ', p2.last_name,
', Sünniaeg: ', p2.birth_date, ', Pildifaili nimi: ', inserted.picture_file_name)
FROM deleted
INNER JOIN inserted ON deleted.id=inserted.id
INNER JOIN person p1 ON p1.id=deleted.person_id
INNER JOIN person p2 ON p2.id=inserted.person_id;
UPDATE picture SET picture_file_name='tom_hanks_profile.png'
WHERE id=4;

SELECT * FROM picture;
SELECT * from logi;

CREATE TRIGGER naitlejaFilmisLisamine
ON person_in_movie
FOR INSERT
AS INSERT INTO logi(toiming, aeg, kasutajanimi, andmed)
SELECT
'On tehtud INSERT',
GETDATE(),
SUSER_NAME(),
CONCAT('Tabel: "person_in_movie" / Nimi: ', p.first_name, ' ', p.last_name, ', Film: ', m.title, ', Amet: ', pos.position_name, ', Roll: ', inserted.role)
FROM inserted
INNER JOIN person p ON p.id=inserted.person_id
INNER JOIN movie m ON m.id=inserted.movie_id
INNER JOIN position pos ON pos.id=inserted.position_id;
INSERT INTO person_in_movie(person_id, movie_id, position_id, role)
VALUES (6, 2, 1, 'Will Turner');

SELECT * FROM person_in_movie;
SELECT * FROM logi;

kasutajaNimi ei pea näha logi tabeli, kuhu triger salvestab oma andmed.

-- DENY logi tabeli lugemise õigus
DENY SELECT, INSERT, UPDATE, DELETE ON logi TO kasutajaNimi