From f294d01ed42846279fef0e6181ea7477f0c96184 Mon Sep 17 00:00:00 2001 From: Admir Trakic Date: Sun, 15 Dec 2024 00:09:05 +0100 Subject: [PATCH 1/3] Add indexes --- DbProject/dbo/Tables/DimCustomer.sql | 23 ++++++++++++++++------- DbProject/dbo/Tables/DimDate.sql | 10 ++++++---- DbProject/dbo/Tables/DimProduct.sql | 19 ++++++++++++++----- DbProject/dbo/Tables/FactSalesOrder.sql | 13 +++++++++---- compose.yml | 5 +++-- 5 files changed, 48 insertions(+), 22 deletions(-) diff --git a/DbProject/dbo/Tables/DimCustomer.sql b/DbProject/dbo/Tables/DimCustomer.sql index fc7bbe3..26f5f81 100644 --- a/DbProject/dbo/Tables/DimCustomer.sql +++ b/DbProject/dbo/Tables/DimCustomer.sql @@ -1,11 +1,20 @@ -CREATE TABLE [dbo].[DimCustomer] ( - [CustomerKey] INT NOT NULL PRIMARY KEY, - [FirstName] VARCHAR (50) NOT NULL, - [LastName] VARCHAR (50) NULL, - [AddressLine1] VARCHAR (200) NULL, - [City] VARCHAR (50) NULL, - [PostalCode] VARCHAR (20) NULL +CREATE TABLE [dbo].[DimCustomer] +( + [CustomerKey] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [FirstName] VARCHAR (50) NOT NULL, + [LastName] VARCHAR (50) NOT NULL, + [AddressLine1] VARCHAR (200) NOT NULL, + [City] VARCHAR (50) NOT NULL, + [PostalCode] VARCHAR (20) NOT NULL, + [SurrogateKey] INT NOT NULL ); +GO +CREATE INDEX IX_DimCustomer_Name ON [dbo].[DimCustomer] ([FirstName], [LastName]); +GO +CREATE INDEX IX_DimCustomer_Address ON [dbo].[DimCustomer] ([AddressLine1], [City], [PostalCode]); +GO +ALTER TABLE [dbo].[DimCustomer] +ADD CONSTRAINT AK_DimCustomer UNIQUE ([FirstName], [LastName], [AddressLine1], [City], [PostalCode]); GO diff --git a/DbProject/dbo/Tables/DimDate.sql b/DbProject/dbo/Tables/DimDate.sql index e877efa..77af68d 100644 --- a/DbProject/dbo/Tables/DimDate.sql +++ b/DbProject/dbo/Tables/DimDate.sql @@ -1,7 +1,9 @@ -CREATE TABLE [dbo].[DimDate] ( - [DateKey] INT NOT NULL PRIMARY KEY, - [Date] DATE NOT NULL +CREATE TABLE [dbo].[DimDate] +( + [DateKey] INT NOT NULL PRIMARY KEY, + [Date] DATE NOT NULL ); +GO - +CREATE INDEX IX_DimDate_DateKey ON [dbo].[DimDate] ([DateKey]); GO diff --git a/DbProject/dbo/Tables/DimProduct.sql b/DbProject/dbo/Tables/DimProduct.sql index a190420..654bea6 100644 --- a/DbProject/dbo/Tables/DimProduct.sql +++ b/DbProject/dbo/Tables/DimProduct.sql @@ -1,9 +1,18 @@ -CREATE TABLE [dbo].[DimProduct] ( - [ProductKey] INT NOT NULL PRIMARY KEY, - [ProductName] VARCHAR (50) NOT NULL, - [Category] VARCHAR (50) NULL, - [ListPrice] DECIMAL (18) NULL +CREATE TABLE [dbo].[DimProduct] +( + [ProductKey] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [ProductName] VARCHAR (50) NOT NULL, + [Category] VARCHAR (50) NOT NULL, + [ListPrice] DECIMAL (18, 2) NOT NULL ); +GO + +CREATE INDEX IX_DimProduct_Name ON [dbo].[DimProduct] ([ProductName]); +GO +CREATE INDEX IX_DimProduct_Category ON [dbo].[DimProduct] ([Category]); +GO +ALTER TABLE [dbo].[DimProduct] +ADD CONSTRAINT AK_DimProduct UNIQUE ([ProductName], [Category]); GO diff --git a/DbProject/dbo/Tables/FactSalesOrder.sql b/DbProject/dbo/Tables/FactSalesOrder.sql index 39d6bad..58fff99 100644 --- a/DbProject/dbo/Tables/FactSalesOrder.sql +++ b/DbProject/dbo/Tables/FactSalesOrder.sql @@ -1,16 +1,21 @@ CREATE TABLE [dbo].[FactSalesOrder] ( - [SalesOrderKey] INT NOT NULL, + [SalesOrderKey] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, [SalesOrderDateKey] INT NOT NULL, [ProductKey] INT NOT NULL, [CustomerKey] INT NOT NULL, - [Quantity] INT NULL, - [SalesTotal] DECIMAL (18) NULL + [Quantity] INT NOT NULL DEFAULT 0, + [SalesTotal] DECIMAL (18, 2) NOT NULL DEFAULT 0.00, - CONSTRAINT [PK_FactSalesOrder] PRIMARY KEY CLUSTERED ([SalesOrderKey] ASC), CONSTRAINT [FK_FactSalesOrder_DimDate] FOREIGN KEY ([SalesOrderDateKey]) REFERENCES [dbo].[DimDate] ([DateKey]), CONSTRAINT [FK_FactSalesOrder_DimProduct] FOREIGN KEY ([ProductKey]) REFERENCES [dbo].[DimProduct] ([ProductKey]), CONSTRAINT [FK_FactSalesOrder_DimCustomer] FOREIGN KEY ([CustomerKey]) REFERENCES [dbo].[DimCustomer] ([CustomerKey]) ); +GO +CREATE INDEX IX_FactSalesOrder_DateKey ON [dbo].[FactSalesOrder] ([SalesOrderDateKey]); +GO +CREATE INDEX IX_FactSalesOrder_ProductKey ON [dbo].[FactSalesOrder] ([ProductKey]); +GO +CREATE INDEX IX_FactSalesOrder_CustomerKey ON [dbo].[FactSalesOrder] ([CustomerKey]); GO diff --git a/compose.yml b/compose.yml index 92f90e1..fbe6b7e 100644 --- a/compose.yml +++ b/compose.yml @@ -9,6 +9,8 @@ services: - .env environment: ConnectionString: "Server=tcp:db,1433;Initial Catalog=demo;UID=sa;Password=${MSSQL_SA_PASSWORD};TrustServerCertificate=true;Connection Timeout=3;" + # keep the container alive for debugging + DEBUG: "${DEBUG:-}" volumes: - $PWD/SQL/dw-seed.sql:/seed.sql entrypoint: @@ -16,8 +18,7 @@ services: - -c - | ./SqlClient.ConsoleApp /seed.sql - # keep the container running (for debugging) - #tail -f /dev/null + if [ -n "$DEBUG" ];then tail -f /dev/null; fi depends_on: sqlpackage: condition: service_completed_successfully From f112fde7dbc932d52646e9ea8591736fe065b2d2 Mon Sep 17 00:00:00 2001 From: Admir Trakic Date: Sun, 15 Dec 2024 00:35:54 +0100 Subject: [PATCH 2/3] WIP: remove identity --- DbProject/dbo/Tables/DimCustomer.sql | 2 +- DbProject/dbo/Tables/DimProduct.sql | 2 +- DbProject/dbo/Tables/FactSalesOrder.sql | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DbProject/dbo/Tables/DimCustomer.sql b/DbProject/dbo/Tables/DimCustomer.sql index 26f5f81..3641b97 100644 --- a/DbProject/dbo/Tables/DimCustomer.sql +++ b/DbProject/dbo/Tables/DimCustomer.sql @@ -1,6 +1,6 @@ CREATE TABLE [dbo].[DimCustomer] ( - [CustomerKey] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [CustomerKey] INT NOT NULL PRIMARY KEY, [FirstName] VARCHAR (50) NOT NULL, [LastName] VARCHAR (50) NOT NULL, [AddressLine1] VARCHAR (200) NOT NULL, diff --git a/DbProject/dbo/Tables/DimProduct.sql b/DbProject/dbo/Tables/DimProduct.sql index 654bea6..89e22a9 100644 --- a/DbProject/dbo/Tables/DimProduct.sql +++ b/DbProject/dbo/Tables/DimProduct.sql @@ -1,6 +1,6 @@ CREATE TABLE [dbo].[DimProduct] ( - [ProductKey] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [ProductKey] INT NOT NULL PRIMARY KEY, [ProductName] VARCHAR (50) NOT NULL, [Category] VARCHAR (50) NOT NULL, [ListPrice] DECIMAL (18, 2) NOT NULL diff --git a/DbProject/dbo/Tables/FactSalesOrder.sql b/DbProject/dbo/Tables/FactSalesOrder.sql index 58fff99..da651c2 100644 --- a/DbProject/dbo/Tables/FactSalesOrder.sql +++ b/DbProject/dbo/Tables/FactSalesOrder.sql @@ -1,6 +1,6 @@ CREATE TABLE [dbo].[FactSalesOrder] ( - [SalesOrderKey] INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + [SalesOrderKey] INT NOT NULL PRIMARY KEY, [SalesOrderDateKey] INT NOT NULL, [ProductKey] INT NOT NULL, [CustomerKey] INT NOT NULL, From 99bd7e3b41a3f007e0a81d3962eb26c4b2842b10 Mon Sep 17 00:00:00 2001 From: Admir Trakic Date: Sun, 15 Dec 2024 00:42:20 +0100 Subject: [PATCH 3/3] Fixed --- .config/dotnet-tools.json | 2 +- DbProject/dbo/Tables/DimCustomer.sql | 3 +-- Makefile | 4 ++++ SQL/dw-seed.sql | 4 ++-- tests/test.sh | 11 ++++++----- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index c59884a..47156b1 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -9,4 +9,4 @@ ] } } -} \ No newline at end of file +} diff --git a/DbProject/dbo/Tables/DimCustomer.sql b/DbProject/dbo/Tables/DimCustomer.sql index 3641b97..baf4ac7 100644 --- a/DbProject/dbo/Tables/DimCustomer.sql +++ b/DbProject/dbo/Tables/DimCustomer.sql @@ -5,8 +5,7 @@ CREATE TABLE [dbo].[DimCustomer] [LastName] VARCHAR (50) NOT NULL, [AddressLine1] VARCHAR (200) NOT NULL, [City] VARCHAR (50) NOT NULL, - [PostalCode] VARCHAR (20) NOT NULL, - [SurrogateKey] INT NOT NULL + [PostalCode] VARCHAR (20) NOT NULL ); GO diff --git a/Makefile b/Makefile index fa546f4..49c00f8 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,10 @@ build: dotnet outdated --upgrade dotnet build +test: + #dotnet test + ./tests/test.sh + clean: dotnet clean docker compose down --remove-orphans --volumes diff --git a/SQL/dw-seed.sql b/SQL/dw-seed.sql index 4eb119d..bff4d65 100644 --- a/SQL/dw-seed.sql +++ b/SQL/dw-seed.sql @@ -2,8 +2,8 @@ MERGE INTO DimCustomer AS target USING (VALUES (1, 'John', 'Doe', '123 Main St', 'Springfield', '12345'), - (2, 'Jane', 'Smith', '456 Elm St', 'Springfield', '12345'), - (3, 'Bob', 'Jones', '789 Oak St', 'Springfield', '12345') + (2, 'Jane', 'Doe', '456 Elm St', 'Springfield', '12345'), + (3, 'Alice', 'Smith', '789 Oak St', 'Springfield', '12345') ) AS source (CustomerKey, FirstName, LastName, AddressLine1, City, PostalCode) ON target.CustomerKey = source.CustomerKey WHEN NOT MATCHED BY TARGET THEN diff --git a/tests/test.sh b/tests/test.sh index 4d62ce1..4664031 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -1,8 +1,9 @@ +#!/bin/bash -# select all tables and views from sql server: +set -e -QUERY=" -SELECT * FROM INFORMATION_SCHEMA.TABLES -" +DB="demo" +QUERY="SELECT * FROM vSalesByCityAndCategory" -docker exec -it --env-file .env db /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -Q "$QUERY" -b +docker exec -it --env-file .env db /opt/mssql-tools/bin/sqlcmd \ + -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -d "$DB" -Q "$QUERY" -b