Project to GitHub

This commit is contained in:
2026-06-24 08:33:23 +02:00
commit ecd89a68f8
121 changed files with 6481 additions and 0 deletions
+126
View File
@@ -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
+16
View File
@@ -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