Archived
Project to GitHub
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
IF DB_ID(N'BsevitaLibrary') IS NULL
|
||||
BEGIN
|
||||
EXEC(N'CREATE DATABASE [BsevitaLibrary]');
|
||||
END;
|
||||
GO
|
||||
|
||||
USE [BsevitaLibrary];
|
||||
GO
|
||||
|
||||
SET ANSI_NULLS ON;
|
||||
SET QUOTED_IDENTIFIER ON;
|
||||
SET XACT_ABORT ON;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.Students', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.Students
|
||||
(
|
||||
StudentId UNIQUEIDENTIFIER NOT NULL CONSTRAINT DF_Students_StudentId DEFAULT NEWSEQUENTIALID(),
|
||||
CardNumber NVARCHAR(32) NOT NULL,
|
||||
FirstName NVARCHAR(100) NOT NULL,
|
||||
LastName NVARCHAR(100) NOT NULL,
|
||||
ClassName NVARCHAR(32) NOT NULL,
|
||||
Email NVARCHAR(254) NULL,
|
||||
IsActive BIT NOT NULL CONSTRAINT DF_Students_IsActive DEFAULT (1),
|
||||
CreatedAt DATETIMEOFFSET(0) NOT NULL CONSTRAINT DF_Students_CreatedAt DEFAULT SYSUTCDATETIME(),
|
||||
UpdatedAt DATETIMEOFFSET(0) NOT NULL CONSTRAINT DF_Students_UpdatedAt DEFAULT SYSUTCDATETIME(),
|
||||
RowVersion ROWVERSION NOT NULL,
|
||||
CONSTRAINT PK_Students PRIMARY KEY CLUSTERED (StudentId),
|
||||
CONSTRAINT CK_Students_CardNumber_NotBlank CHECK (LEN(LTRIM(RTRIM(CardNumber))) > 0),
|
||||
CONSTRAINT CK_Students_FirstName_NotBlank CHECK (LEN(LTRIM(RTRIM(FirstName))) > 0),
|
||||
CONSTRAINT CK_Students_LastName_NotBlank CHECK (LEN(LTRIM(RTRIM(LastName))) > 0),
|
||||
CONSTRAINT CK_Students_ClassName_NotBlank CHECK (LEN(LTRIM(RTRIM(ClassName))) > 0)
|
||||
);
|
||||
CREATE UNIQUE INDEX UX_Students_CardNumber ON dbo.Students(CardNumber);
|
||||
CREATE INDEX IX_Students_IsActive_Name ON dbo.Students(IsActive, LastName, FirstName);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.Books', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.Books
|
||||
(
|
||||
BookId UNIQUEIDENTIFIER NOT NULL CONSTRAINT DF_Books_BookId DEFAULT NEWSEQUENTIALID(),
|
||||
BookNumber NVARCHAR(32) NOT NULL,
|
||||
Isbn NVARCHAR(20) NULL,
|
||||
Title NVARCHAR(240) NOT NULL,
|
||||
Author NVARCHAR(160) NOT NULL,
|
||||
Subject NVARCHAR(120) NOT NULL,
|
||||
Publisher NVARCHAR(160) NULL,
|
||||
PublicationYear SMALLINT NULL,
|
||||
IsActive BIT NOT NULL CONSTRAINT DF_Books_IsActive DEFAULT (1),
|
||||
CreatedAt DATETIMEOFFSET(0) NOT NULL CONSTRAINT DF_Books_CreatedAt DEFAULT SYSUTCDATETIME(),
|
||||
UpdatedAt DATETIMEOFFSET(0) NOT NULL CONSTRAINT DF_Books_UpdatedAt DEFAULT SYSUTCDATETIME(),
|
||||
RowVersion ROWVERSION NOT NULL,
|
||||
CONSTRAINT PK_Books PRIMARY KEY CLUSTERED (BookId),
|
||||
CONSTRAINT CK_Books_BookNumber_NotBlank CHECK (LEN(LTRIM(RTRIM(BookNumber))) > 0),
|
||||
CONSTRAINT CK_Books_Title_NotBlank CHECK (LEN(LTRIM(RTRIM(Title))) > 0),
|
||||
CONSTRAINT CK_Books_Author_NotBlank CHECK (LEN(LTRIM(RTRIM(Author))) > 0),
|
||||
CONSTRAINT CK_Books_Subject_NotBlank CHECK (LEN(LTRIM(RTRIM(Subject))) > 0),
|
||||
CONSTRAINT CK_Books_PublicationYear CHECK (PublicationYear IS NULL OR PublicationYear BETWEEN 1000 AND 2200)
|
||||
);
|
||||
CREATE UNIQUE INDEX UX_Books_BookNumber ON dbo.Books(BookNumber);
|
||||
CREATE UNIQUE INDEX UX_Books_Isbn ON dbo.Books(Isbn) WHERE Isbn IS NOT NULL;
|
||||
CREATE INDEX IX_Books_IsActive_Title ON dbo.Books(IsActive, Title);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'dbo.Loans', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE dbo.Loans
|
||||
(
|
||||
LoanId UNIQUEIDENTIFIER NOT NULL CONSTRAINT DF_Loans_LoanId DEFAULT NEWSEQUENTIALID(),
|
||||
StudentId UNIQUEIDENTIFIER NOT NULL,
|
||||
BookId UNIQUEIDENTIFIER NOT NULL,
|
||||
LoanedAt DATETIMEOFFSET(0) NOT NULL CONSTRAINT DF_Loans_LoanedAt DEFAULT SYSUTCDATETIME(),
|
||||
DueAt DATETIMEOFFSET(0) NOT NULL,
|
||||
ReturnedAt DATETIMEOFFSET(0) NULL,
|
||||
RowVersion ROWVERSION NOT NULL,
|
||||
CONSTRAINT PK_Loans PRIMARY KEY CLUSTERED (LoanId),
|
||||
CONSTRAINT FK_Loans_Students FOREIGN KEY (StudentId) REFERENCES dbo.Students(StudentId),
|
||||
CONSTRAINT FK_Loans_Books FOREIGN KEY (BookId) REFERENCES dbo.Books(BookId),
|
||||
CONSTRAINT CK_Loans_DueAfterLoan CHECK (DueAt > LoanedAt),
|
||||
CONSTRAINT CK_Loans_ReturnAfterLoan CHECK (ReturnedAt IS NULL OR ReturnedAt >= LoanedAt)
|
||||
);
|
||||
CREATE INDEX IX_Loans_StudentId ON dbo.Loans(StudentId);
|
||||
CREATE INDEX IX_Loans_Active_DueAt ON dbo.Loans(DueAt) WHERE ReturnedAt IS NULL;
|
||||
CREATE UNIQUE INDEX UX_Loans_ActiveBook ON dbo.Loans(BookId) WHERE ReturnedAt IS NULL;
|
||||
END;
|
||||
GO
|
||||
|
||||
-- Idempotent sample data for immediate manual testing.
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Students WHERE CardNumber = N'S-1001')
|
||||
BEGIN
|
||||
INSERT dbo.Students (StudentId, CardNumber, FirstName, LastName, ClassName, Email)
|
||||
VALUES
|
||||
('11111111-1111-1111-1111-111111111111', N'S-1001', N'Max', N'Mustermann', N'3AHIT', N'max.mustermann@schule.local'),
|
||||
('22222222-2222-2222-2222-222222222222', N'S-1002', N'Anna', N'Berger', N'2BHIF', N'anna.berger@schule.local'),
|
||||
('33333333-3333-3333-3333-333333333333', N'S-1003', N'Leon', N'Fischer', N'1AHIT', NULL);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Books WHERE BookNumber = N'B-1001')
|
||||
BEGIN
|
||||
INSERT dbo.Books (BookId, BookNumber, Isbn, Title, Author, Subject, Publisher, PublicationYear)
|
||||
VALUES
|
||||
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1', N'B-1001', N'978-3-8362-9500-1', N'C# Grundlagen', N'Ralph Steyer', N'Informatik', N'Rheinwerk', 2024),
|
||||
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa2', N'B-1002', N'978-0-13-235088-4', N'Clean Code', N'Robert C. Martin', N'Softwareentwicklung', N'Prentice Hall', 2008),
|
||||
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa3', N'B-1003', N'978-3-86680-192-0', N'Die Welt der Physik', N'Andrea Lenz', N'Physik', N'Verita', 2022),
|
||||
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa4', N'B-1004', NULL, N'Mathematik kompakt', N'Sabine Kern', N'Mathematik', N'Schulbuchverlag', 2023),
|
||||
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa5', N'B-1005', NULL, N'Geschichte Europas', N'Paul Winter', N'Geschichte', N'Verita', 2021);
|
||||
END;
|
||||
GO
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM dbo.Loans WHERE LoanId = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbb1')
|
||||
BEGIN
|
||||
INSERT dbo.Loans (LoanId, StudentId, BookId, LoanedAt, DueAt, ReturnedAt)
|
||||
VALUES
|
||||
('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbb1', '11111111-1111-1111-1111-111111111111', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa2', DATEADD(DAY, -20, SYSUTCDATETIME()), DATEADD(DAY, -6, SYSUTCDATETIME()), NULL),
|
||||
('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbb2', '22222222-2222-2222-2222-222222222222', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa3', DATEADD(DAY, -4, SYSUTCDATETIME()), DATEADD(DAY, 10, SYSUTCDATETIME()), NULL),
|
||||
('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbb3', '33333333-3333-3333-3333-333333333333', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa4', DATEADD(DAY, -30, SYSUTCDATETIME()), DATEADD(DAY, -16, SYSUTCDATETIME()), DATEADD(DAY, -15, SYSUTCDATETIME()));
|
||||
END;
|
||||
GO
|
||||
|
||||
PRINT N'BsevitaLibrary database is ready.';
|
||||
GO
|
||||
@@ -0,0 +1,16 @@
|
||||
USE [BsevitaLibrary];
|
||||
GO
|
||||
SET NOCOUNT ON;
|
||||
|
||||
SELECT 'Students' AS Entity, COUNT(*) AS Total FROM dbo.Students WHERE IsActive = 1
|
||||
UNION ALL SELECT 'Books', COUNT(*) FROM dbo.Books WHERE IsActive = 1
|
||||
UNION ALL SELECT 'ActiveLoans', COUNT(*) FROM dbo.Loans WHERE ReturnedAt IS NULL
|
||||
UNION ALL SELECT 'OverdueLoans', COUNT(*) FROM dbo.Loans WHERE ReturnedAt IS NULL AND DueAt < SYSUTCDATETIME();
|
||||
|
||||
SELECT l.LoanId, s.CardNumber, CONCAT(s.FirstName, ' ', s.LastName) AS StudentName,
|
||||
b.BookNumber, b.Title, l.LoanedAt, l.DueAt, l.ReturnedAt
|
||||
FROM dbo.Loans l
|
||||
JOIN dbo.Students s ON s.StudentId = l.StudentId
|
||||
JOIN dbo.Books b ON b.BookId = l.BookId
|
||||
ORDER BY l.LoanedAt DESC;
|
||||
GO
|
||||
Reference in New Issue
Block a user