« powrót

T-SQL baza bank [SQL]

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

Ostatni musiałem napisać kilka skryptów SQL'a, w których to miały wystąpić określone konstrukcje (funkcje, trigger, itp.) w bazie.
Poniżej skrypt dla bazy BANK


/*
Baza danych: bank
*/
CREATE DATABASE Bank
GO
USE Bank
GO

/*
Tworzenie tabel w bazie danych
*/
CREATE TABLE Konto
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  idOsoba  INT,
  numer VARCHAR(30),
  saldo MONEY DEFAULT 0
)

CREATE TABLE Osoba
(
  id    INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
  imie  VARCHAR(30),
  nazwisko  VARCHAR(30),
  pesel  VARCHAR(15),
  adres  VARCHAR(80),
)

CREATE TABLE Karta
(
  idKonto INT,
  numer VARCHAR(30),
  waznaDo DATETIME,
  limit MONEY DEFAULT 0
)

CREATE TABLE Transakcja
(
  dataTr  DATETIME DEFAULT getdate(),
  idKonto INT,
  idTyp INT,
  opis  VARCHAR(80),
  kwota  MONEY DEFAULT 0
)

/*
rodzaj transakcji
0 - wplata
1 - wyplata
*/
CREATE TABLE TypTransakcji
(
  id    INT,
  nazwa VARCHAR(40),
  rodzaj INT DEFAULT 0
)
GO

/*
Funkcja skladajaca zwracajaca imie i nazwisko osoby na podstawie id
*/
CREATE FUNCTION podajImieNazwisko(@idOsoba INT)
RETURNS VARCHAR(65)
AS
BEGIN
  DECLARE @imieNazwisko  VARCHAR(65)
  DECLARE @imie  VARCHAR(30)
  DECLARE @nazwisko  VARCHAR(30)

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

/*
  widok z lista transakcji
*/
CREATE VIEW ListaTransakcji
AS  
  SELECT
    Transakcja.dataTr,
    Konto.numer AS numerKonta,
    Transakcja.opis,
    Transakcja.kwota
  FROM
    Transakcja, Konto
  WHERE
    Transakcja.idKonto = Konto.id
GO

/*
  widok z lista kont
*/
CREATE VIEW ListaKont
AS  
  SELECT
    Konto.numer,
    dbo.podajImieNazwisko(idOsoba) AS imieInazwisko,
    Konto.saldo
  FROM
    Konto
GO

/*
Uzupelnienie tabel danymi
*/

INSERT INTO Osoba (imie, nazwisko, pesel, adres) VALUES ('Anna', 'Jawor', '123456789', 'Kozienice');
INSERT INTO Osoba (imie, nazwisko, pesel, adres) VALUES ('Jerzy', 'Buk', '987654321', 'Pionki');
GO

INSERT INTO Konto (idOsoba, numer) VALUES (1, '112341234-1111000022224444')
INSERT INTO Konto (idOsoba, numer) VALUES (2, '112341234-1111000022225555')
GO

INSERT INTO TypTransakcji VALUES (1, 'wplata gotowki', 0)
INSERT INTO TypTransakcji VALUES (2, 'przelew', 0)
INSERT INTO TypTransakcji VALUES (3, 'wyplata z bankomatu', 1)
INSERT INTO TypTransakcji VALUES (4, 'przelew', 1)
INSERT INTO TypTransakcji VALUES (5, 'zakup karta', 1)
GO

/*
Procedura dodawania karty do konta
*/
CREATE PROCEDURE DodajKarte
  @numerKonta VARCHAR(30),
  @numerKarty VARCHAR(30),
  @waznaDo DATETIME,
  @limit MONEY
AS
BEGIN
  DECLARE @idKonto INT
  
  SELECT @idKonto = id FROM Konto WHERE numer = @numerKonta
  IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
  BEGIN
    INSERT INTO Karta (idKonto, numer, waznaDo, limit)
      VALUES (@idKonto, @numerKarty, @waznaDo, @limit)
  END
  ELSE
  BEGIN
    RETURN(0)
  END
END
GO

/*
Procedura zmiany statusu projektu o podanym kodzie
*/
CREATE PROCEDURE DodajTransakcje
  @numerKonta VARCHAR(30),
  @idTyp INT,
  @kwota MONEY
AS
BEGIN
  DECLARE @idKonto INT
  DECLARE @opis VARCHAR(200)
  DECLARE @nazwaTr VARCHAR(40)
  DECLARE @rodzaj INT
  
  SELECT @nazwaTr = nazwa, @rodzaj = rodzaj FROM TypTransakcji WHERE id = @idTyp
  SET @opis = 'Transakcja: ' + @nazwaTr
  
  SELECT @idKonto = id FROM Konto WHERE numer = @numerKonta
  IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
  BEGIN
    -- transakcja dopisujaca zapis w Transakcjach i zmieniajaca saldo konta
    BEGIN TRANSACTION

      INSERT INTO Transakcja (idKonto, idTyp, opis, kwota)
        VALUES (@idKonto, @idTyp, @opis, @kwota)
      IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
      BEGIN
        IF (@rodzaj = 0)
        BEGIN
          -- wplata
          UPDATE Konto SET saldo = saldo + @kwota WHERE id = @idKonto
          IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
          BEGIN
            COMMIT TRANSACTION
          END
          ELSE
          BEGIN
            ROLLBACK TRANSACTION
          END
        END
        ELSE
        BEGIN
          -- wyplata
          UPDATE Konto SET saldo = saldo - @kwota WHERE id = @idKonto
          IF ((@@ERROR = 0) AND ( @@ROWCOUNT > 0))
          BEGIN
            COMMIT TRANSACTION
          END
          ELSE
          BEGIN
            ROLLBACK TRANSACTION
          END
        END
      END
      ELSE
      BEGIN
        ROLLBACK TRANSACTION
      END

  END
  ELSE
  BEGIN
    RETURN(0)
  END
END
GO

/*
trigger sprawdzajacy czy przy dodaniu transakcji nie przekroczono jakiegos salda,
saldo musi byc zawsze >= 0
*/
CREATE TRIGGER SprawdzSaldo
ON Konto
AFTER UPDATE
AS
  -- wszystkie saldo ponizej 0
  SELECT saldo FROM Konto WHERE saldo < 0
  IF (@@ROWCOUNT > 0)
  BEGIN
    RAISERROR('Saldo ponizej zera', 16, 1)
    ROLLBACK TRANSACTION
  END
GO

-- wplata
EXECUTE DodajTransakcje '112341234-1111000022224444', 1, 1000
GO
-- wyplata z bankomatu
EXECUTE DodajTransakcje '112341234-1111000022224444', 3, 120
GO
-- zakup karta
EXECUTE DodajTransakcje '112341234-1111000022224444', 5, 49.99
GO

-- przekroczenie salda
EXECUTE DodajTransakcje '112341234-1111000022224444', 3, 900
GO

SELECT * FROM ListaKont
SELECT * FROM ListaTransakcji
GO


Komentarze:

błędy

Pokazywane są błędy przez mysql a także nie ma w kodzie średników które są wymagane po każdej wykonanej operacji naszej

2016-10-02 niki
To jest kod dla MSSql Server

To jest kod t-sql, czyli dla Microsoft Sql Server. Tutaj średnikiem jest instrukcja GO. W czasach kiedy to pisałem to chyba MySql nawet nie obsługiwał tranakcji,

2019-08-30 JacekM