« powrót

T-SQL skrypt biblioteka [SQL]

Opublikowano: 2009-07-29 , wyświetlono: 9357

Skrypt T-SQLa tworzący obiekty w bazie danych i wykonujący kilka operacji testowych.


/*
Biblioteka
*/
CREATE DATABASE Biblioteka
GO
USE Biblioteka
GO

/*
tworzenie tabel
*/
CREATE TABLE Ksiazka
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  idAutor  INT,
  idkategoria INT,
  tytul VARCHAR(200)
)

CREATE TABLE Autor
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  imie  VARCHAR(30),
  nazwisko VARCHAR(30)
)

CREATE TABLE Kategoria
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  nazwa VARCHAR(50)
)

CREATE TABLE Czytelnik
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  imie  VARCHAR(30),
  nazwisko VARCHAR(30)
)

/*
  pole typ okresla rodzaj wypozyczenia
  0 - wypozyczenie
  1 - zwrot
  2 - likwidacja pozycji (np. z powodu zniszczenia)
*/
CREATE TABLE Wypozyczenia
(
  dataWyp DATETIME DEFAULT getdate(),
  idKsiazka INT,
  idCzytelnik INT,
  typ INT
)

CREATE TABLE Stan
(
  idKsiazka INT,
  ilosc INT DEFAULT 0,
  stanBiezacy INT DEFAULT 0
)
GO

/*
Funkcja zwracajaca imie i nazwisko autora dla podanego id autora
*/
CREATE FUNCTION autorImieNazwisko(@idAutor INT)
RETURNS VARCHAR(65)
AS
BEGIN
  DECLARE @imieNazwisko  VARCHAR(65)
  DECLARE @imie  VARCHAR(30)
  DECLARE @nazwisko  VARCHAR(30)

  SELECT @imie = imie, @nazwisko = nazwisko FROM Autor WHERE id = @idAutor
  
  SET @imieNazwisko = @imie + ' ' + @nazwisko
  RETURN (@imieNazwisko)  
END
GO

/*
Funkcja zwracajaca nazwe kategorii dla podanego id
*/
CREATE FUNCTION kategoriaNazwa(@idKategoria INT)
RETURNS VARCHAR(50)
AS
BEGIN
  DECLARE @nazwa  VARCHAR(50)

  SELECT @nazwa = nazwa FROM Kategoria WHERE id = @idKategoria
  
  RETURN (@nazwa)  
END
GO

/*
Funkcja zwracajaca wyp wypozyczenia
  0 - wypozyczenie
  1 - zwrot
  2 - likwidacja pozycji (np. z powodu zniszczenia)

*/
CREATE FUNCTION typWypozyczenia(@typ INT)
RETURNS VARCHAR(20)
AS
BEGIN
  DECLARE @nazwa  VARCHAR(20)
  
  SET @nazwa =
  CASE @typ
    WHEN 0 THEN 'wypozyczenia'
    WHEN 1 THEN 'zwrot'
    WHEN 2 THEN 'likwidacja'
  END
  
  RETURN (@nazwa)  
END
GO

/*
procedura dodania nowej ksiazki
*/
CREATE PROCEDURE ksiazkaDodaj
  @idAutor INT,
  @idKategoria INT,
  @tytul VARCHAR(200),
  @ilosc INT
AS
BEGIN
  DECLARE @idKsiazka INT
  
  /* dodanie do tabeli Ksiazka */
  INSERT INTO Ksiazka (idAutor, idKategoria, tytul)
    VALUES (@idAutor, @idKategoria, @tytul)

  IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
  BEGIN
    SET @idKsiazka = @@IDENTITY
    INSERT INTO Stan VALUES(@idKsiazka, @ilosc, @ilosc)
  END
END
GO

/*
procedura wypozyczenia ksiazki (transakcja)
*/
CREATE PROCEDURE ksiazkaWypozycz
  @idKsiazka INT,
  @idCzytelnik INT
AS
BEGIN

  BEGIN TRANSACTION
  
    INSERT INTO Wypozyczenia (idKsiazka, idCzytelnik, typ)
      VALUES (@idKsiazka, @idCzytelnik, 0)

    IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
    BEGIN
      UPDATE Stan SET stanBiezacy = stanBiezacy - 1 WHERE idKsiazka = @idKsiazka

      IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
      BEGIN
        COMMIT TRANSACTION
      END
      ELSE
      BEGIN
        ROLLBACK TRANSACTION
      END
    END
    ELSE
    BEGIN
      ROLLBACK TRANSACTION
    END
END
GO

/*
procedura zwrotu ksiazki (transakcja)
*/
CREATE PROCEDURE ksiazkaZwroc
  @idKsiazka INT,
  @idCzytelnik INT
AS
BEGIN

  BEGIN TRANSACTION
  
    INSERT INTO Wypozyczenia (idKsiazka, idCzytelnik, typ)
      VALUES (@idKsiazka, @idCzytelnik, 1)

    IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
    BEGIN
      UPDATE Stan SET stanBiezacy = stanBiezacy + 1 WHERE idKsiazka = @idKsiazka

      IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
      BEGIN
        COMMIT TRANSACTION
      END
      ELSE
      BEGIN
        ROLLBACK TRANSACTION
      END
    END
    ELSE
    BEGIN
      ROLLBACK TRANSACTION
    END
END
GO

/*
  trigger sprawdzajacy czy stanBiezacy nie spadl ponizej zera, ani nie
  przekroczyl ilosci
*/
CREATE TRIGGER sprawdzStan
ON Stan
AFTER UPDATE
AS
  -- czy ilosc nie spadla ponizej zera
  SELECT stanBiezacy FROM Stan WHERE stanBiezacy < 0
  IF (@@ROWCOUNT > 0)
  BEGIN
    RAISERROR('Proba wypozyczenia ksiazki, ktorej nie ma na stanie', 16, 1)
    ROLLBACK TRANSACTION
  END

  -- czy czasami nie zwrocono wicej niz jest ksiazek
  SELECT idKsiazka FROM Stan WHERE (stanBiezacy > ilosc)
  IF (@@ROWCOUNT > 0)
  BEGIN
    RAISERROR('Proba zwrotu ksiazki, ktorej stan jest juz maksymalny', 16, 1)
    ROLLBACK TRANSACTION
  END
GO

/*
  widok z lista ksiazek i ich stanem
*/
CREATE VIEW ksiazkaLista
AS  
  SELECT
    Ksiazka.tytul,
    dbo.autorImieNazwisko(Ksiazka.idAutor) AS autor,
    dbo.kategoriaNazwa(Ksiazka.idkategoria) AS kategoria,
    Stan.ilosc,
    Stan.stanBiezacy
  FROM
    Ksiazka, Stan
  WHERE
    Ksiazka.id = Stan.idKsiazka
GO

/*
  widok z lista wypozyczen
*/
CREATE VIEW wypozyczeniaLista
AS  
  SELECT
    Wypozyczenia.dataWyp,
    Ksiazka.tytul,
    Czytelnik.imie + ' ' + Czytelnik.nazwisko AS czytelnikIN,
    dbo.typWypozyczenia(typ) AS typ
  FROM
    Wypozyczenia, Ksiazka, Czytelnik
  WHERE
    Wypozyczenia.idKsiazka = Ksiazka.id AND
    WYpozyczenia.idCzytelnik = Czytelnik.id
GO

/*
  dodanie kilku kategorii
*/
INSERT INTO Kategoria (nazwa) VALUES ('historia')
INSERT INTO Kategoria (nazwa) VALUES ('ekonomia')
INSERT INTO Kategoria (nazwa) VALUES ('fantasy')
INSERT INTO Kategoria (nazwa) VALUES ('informatyka')
GO

/*
  dodanie kilku autorow
*/
INSERT INTO Autor (imie, nazwisko) VALUES ('JRR', 'Tolkien')
INSERT INTO Autor (imie, nazwisko) VALUES ('Steve', 'McConnell')
INSERT INTO Autor (imie, nazwisko) VALUES ('Paweł', 'Jasienica')
GO

/*
dodanie czytelnikow
*/
INSERT INTO Czytelnik (imie, nazwisko) VALUES ('Jaś', 'Nowak')
INSERT INTO Czytelnik (imie, nazwisko) VALUES ('Ola', 'Malinowska')
GO

/*
dodanie ksiazek
*/
EXECUTE ksiazkaDodaj 1, 3, 'Władca pierścieni', 3
EXECUTE ksiazkaDodaj 2, 4, 'Code complete', 1
EXECUTE ksiazkaDodaj 3, 1, 'Historia Polski', 2
GO

/* wypozyczenia */
EXECUTE ksiazkaWypozycz 1, 1
GO
EXECUTE ksiazkaWypozycz 2, 2
GO
/* wypozyczeni 2x ksiazki o stanie 1 spowoduje blad */
EXECUTE ksiazkaWypozycz 2, 2
GO

/* zwrot */
EXECUTE ksiazkaZwroc 2, 2
GO

/* przejrzenie wynikow */
SELECT * FROM ksiazkaLista
GO
SELECT * FROM wypozyczeniaLista
GO



Komentarze: