Initial commit

This commit is contained in:
git
2026-01-03 22:05:49 +07:00
commit 2f8859dbe8
63 changed files with 6708 additions and 0 deletions

117
test_data/init_baseline.sql Executable file
View File

@@ -0,0 +1,117 @@
-- Baseline Database Initialization Script
-- This creates a sample database structure for testing
USE master;
GO
-- Create test database
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'TestDB_Baseline')
BEGIN
CREATE DATABASE TestDB_Baseline;
END
GO
USE TestDB_Baseline;
GO
-- Create sample tables
-- Dimension: Customers
CREATE TABLE dbo.DimCustomer (
CustomerID INT PRIMARY KEY IDENTITY(1,1),
CustomerName NVARCHAR(100) NOT NULL,
Email NVARCHAR(100),
City NVARCHAR(50),
Country NVARCHAR(50),
CreatedDate DATETIME DEFAULT GETDATE()
);
-- Dimension: Products
CREATE TABLE dbo.DimProduct (
ProductID INT PRIMARY KEY IDENTITY(1,1),
ProductName NVARCHAR(100) NOT NULL,
Category NVARCHAR(50),
UnitPrice DECIMAL(10,2),
IsActive BIT DEFAULT 1
);
-- Fact: Sales
CREATE TABLE dbo.FactSales (
SaleID INT PRIMARY KEY IDENTITY(1,1),
CustomerID INT,
ProductID INT,
SaleDate DATE,
Quantity INT,
UnitPrice DECIMAL(10,2),
TotalAmount DECIMAL(10,2),
TaxAmount DECIMAL(10,2),
FOREIGN KEY (CustomerID) REFERENCES dbo.DimCustomer(CustomerID),
FOREIGN KEY (ProductID) REFERENCES dbo.DimProduct(ProductID)
);
-- Insert sample data (TEST DATA ONLY - NOT REAL CUSTOMERS)
-- Customers
INSERT INTO dbo.DimCustomer (CustomerName, Email, City, Country) VALUES
('TestCustomer1', 'test1@test.local', 'City1', 'Country1'),
('TestCustomer2', 'test2@test.local', 'City2', 'Country2'),
('TestCustomer3', 'test3@test.local', 'City3', 'Country3'),
('TestCustomer4', 'test4@test.local', 'City4', 'Country4'),
('TestCustomer5', 'test5@test.local', 'City5', 'Country5');
-- Products
INSERT INTO dbo.DimProduct (ProductName, Category, UnitPrice, IsActive) VALUES
('Laptop', 'Electronics', 999.99, 1),
('Mouse', 'Electronics', 29.99, 1),
('Keyboard', 'Electronics', 79.99, 1),
('Monitor', 'Electronics', 299.99, 1),
('Desk Chair', 'Furniture', 199.99, 1),
('Desk', 'Furniture', 399.99, 1),
('Notebook', 'Stationery', 4.99, 1),
('Pen Set', 'Stationery', 12.99, 1);
-- Sales (100 records)
DECLARE @i INT = 1;
WHILE @i <= 100
BEGIN
INSERT INTO dbo.FactSales (CustomerID, ProductID, SaleDate, Quantity, UnitPrice, TotalAmount, TaxAmount)
VALUES (
(ABS(CHECKSUM(NEWID())) % 5) + 1, -- Random CustomerID 1-5
(ABS(CHECKSUM(NEWID())) % 8) + 1, -- Random ProductID 1-8
DATEADD(DAY, -ABS(CHECKSUM(NEWID())) % 365, GETDATE()), -- Random date in last year
(ABS(CHECKSUM(NEWID())) % 10) + 1, -- Random Quantity 1-10
(ABS(CHECKSUM(NEWID())) % 900) + 100.00, -- Random price 100-1000
0, -- Will be calculated
0 -- Will be calculated
);
-- Calculate amounts
UPDATE dbo.FactSales
SET TotalAmount = Quantity * UnitPrice,
TaxAmount = Quantity * UnitPrice * 0.1
WHERE SaleID = @i;
SET @i = @i + 1;
END
GO
-- Create some views for testing
CREATE VIEW dbo.vw_SalesSummary AS
SELECT
c.CustomerName,
p.ProductName,
s.SaleDate,
s.Quantity,
s.TotalAmount
FROM dbo.FactSales s
JOIN dbo.DimCustomer c ON s.CustomerID = c.CustomerID
JOIN dbo.DimProduct p ON s.ProductID = p.ProductID;
GO
-- Create statistics
CREATE STATISTICS stat_sales_date ON dbo.FactSales(SaleDate);
CREATE STATISTICS stat_customer_country ON dbo.DimCustomer(Country);
GO
PRINT 'Baseline database initialized successfully';
GO

131
test_data/init_target.sql Executable file
View File

@@ -0,0 +1,131 @@
-- Target Database Initialization Script
-- This creates a similar structure with some intentional differences for testing
USE master;
GO
-- Create test database
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'TestDB_Target')
BEGIN
CREATE DATABASE TestDB_Target;
END
GO
USE TestDB_Target;
GO
-- Create sample tables (similar to baseline with some differences)
-- Dimension: Customers (same structure)
CREATE TABLE dbo.DimCustomer (
CustomerID INT PRIMARY KEY IDENTITY(1,1),
CustomerName NVARCHAR(100) NOT NULL,
Email NVARCHAR(100),
City NVARCHAR(50),
Country NVARCHAR(50),
CreatedDate DATETIME DEFAULT GETDATE()
);
-- Dimension: Products (slightly different - added column)
CREATE TABLE dbo.DimProduct (
ProductID INT PRIMARY KEY IDENTITY(1,1),
ProductName NVARCHAR(100) NOT NULL,
Category NVARCHAR(50),
UnitPrice DECIMAL(10,2),
IsActive BIT DEFAULT 1,
LastModified DATETIME DEFAULT GETDATE() -- Extra column for testing
);
-- Fact: Sales (same structure)
CREATE TABLE dbo.FactSales (
SaleID INT PRIMARY KEY IDENTITY(1,1),
CustomerID INT,
ProductID INT,
SaleDate DATE,
Quantity INT,
UnitPrice DECIMAL(10,2),
TotalAmount DECIMAL(10,2),
TaxAmount DECIMAL(10,2),
FOREIGN KEY (CustomerID) REFERENCES dbo.DimCustomer(CustomerID),
FOREIGN KEY (ProductID) REFERENCES dbo.DimProduct(ProductID)
);
-- Insert sample data (TEST DATA ONLY - NOT REAL CUSTOMERS)
-- Customers
INSERT INTO dbo.DimCustomer (CustomerName, Email, City, Country) VALUES
('TestCustomer1', 'test1@test.local', 'City1', 'Country1'),
('TestCustomer2', 'test2@test.local', 'City2', 'Country2'),
('TestCustomer3', 'test3@test.local', 'City3', 'Country3'),
('TestCustomer4', 'test4@test.local', 'City4', 'Country4'),
('TestCustomer5', 'test5@test.local', 'City5', 'Country5');
-- Products (with LastModified)
INSERT INTO dbo.DimProduct (ProductName, Category, UnitPrice, IsActive, LastModified) VALUES
('Laptop', 'Electronics', 999.99, 1, GETDATE()),
('Mouse', 'Electronics', 29.99, 1, GETDATE()),
('Keyboard', 'Electronics', 79.99, 1, GETDATE()),
('Monitor', 'Electronics', 299.99, 1, GETDATE()),
('Desk Chair', 'Furniture', 199.99, 1, GETDATE()),
('Desk', 'Furniture', 399.99, 1, GETDATE()),
('Notebook', 'Stationery', 4.99, 1, GETDATE()),
('Pen Set', 'Stationery', 12.99, 1, GETDATE());
-- Sales (95 records - 5 fewer than baseline for testing)
DECLARE @i INT = 1;
WHILE @i <= 95
BEGIN
INSERT INTO dbo.FactSales (CustomerID, ProductID, SaleDate, Quantity, UnitPrice, TotalAmount, TaxAmount)
VALUES (
(ABS(CHECKSUM(NEWID())) % 5) + 1,
(ABS(CHECKSUM(NEWID())) % 8) + 1,
DATEADD(DAY, -ABS(CHECKSUM(NEWID())) % 365, GETDATE()),
(ABS(CHECKSUM(NEWID())) % 10) + 1,
(ABS(CHECKSUM(NEWID())) % 900) + 100.00,
0,
0
);
-- Calculate amounts
UPDATE dbo.FactSales
SET TotalAmount = Quantity * UnitPrice,
TaxAmount = Quantity * UnitPrice * 0.1
WHERE SaleID = @i;
SET @i = @i + 1;
END
GO
-- Create the same view
CREATE VIEW dbo.vw_SalesSummary AS
SELECT
c.CustomerName,
p.ProductName,
s.SaleDate,
s.Quantity,
s.TotalAmount
FROM dbo.FactSales s
JOIN dbo.DimCustomer c ON s.CustomerID = c.CustomerID
JOIN dbo.DimProduct p ON s.ProductID = p.ProductID;
GO
-- Create an extra table that doesn't exist in baseline
CREATE TABLE dbo.TempProcessing (
ProcessID INT PRIMARY KEY IDENTITY(1,1),
ProcessName NVARCHAR(100),
Status NVARCHAR(20),
CreatedDate DATETIME DEFAULT GETDATE()
);
INSERT INTO dbo.TempProcessing (ProcessName, Status) VALUES
('DataLoad', 'Completed'),
('Validation', 'In Progress');
GO
-- Create statistics
CREATE STATISTICS stat_sales_date ON dbo.FactSales(SaleDate);
CREATE STATISTICS stat_customer_country ON dbo.DimCustomer(Country);
GO
PRINT 'Target database initialized successfully';
GO

View File

@@ -0,0 +1,97 @@
#!/bin/bash
# Setup script for test SQL Server environment
set -e
echo "=========================================="
echo "SQL Server Test Environment Setup"
echo "=========================================="
echo ""
# Check if Docker is installed
if ! command -v docker &> /dev/null; then
echo "Error: Docker is not installed"
echo "Please install Docker first: https://docs.docker.com/get-docker/"
exit 1
fi
# Check if Docker Compose is available (either standalone or plugin)
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
echo "Error: Docker Compose is not installed"
echo "Please install Docker Compose first"
exit 1
fi
# Determine which compose command to use
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
echo "Step 1: Starting SQL Server containers..."
$COMPOSE_CMD -f docker-compose.test.yml up -d
echo ""
echo "Step 2: Waiting for SQL Server to be ready..."
echo "This may take 30-60 seconds..."
# Set default password if not provided
SA_PASSWORD=${SA_PASSWORD:-YourStrong!Passw0rd}
# Wait for baseline server
echo -n "Waiting for baseline server"
for i in {1..30}; do
if docker exec drt-sqlserver-baseline /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -C -Q "SELECT 1" &> /dev/null; then
echo " ✓"
break
fi
echo -n "."
sleep 2
done
# Wait for target server
echo -n "Waiting for target server"
for i in {1..30}; do
if docker exec drt-sqlserver-target /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -C -Q "SELECT 1" &> /dev/null; then
echo " ✓"
break
fi
echo -n "."
sleep 2
done
echo ""
echo "Step 3: Initializing baseline database..."
docker exec -i drt-sqlserver-baseline /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -C < test_data/init_baseline.sql
echo ""
echo "Step 4: Initializing target database..."
docker exec -i drt-sqlserver-target /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$SA_PASSWORD" -C < test_data/init_target.sql
echo ""
echo "=========================================="
echo "Setup completed successfully!"
echo "=========================================="
echo ""
echo "SQL Server instances are running:"
echo " Baseline: localhost:1433"
echo " Target: localhost:1434"
echo ""
echo "Credentials:"
echo " Username: sa"
echo " Password: (set via SA_PASSWORD environment variable)"
echo ""
echo "Test databases:"
echo " Baseline: TestDB_Baseline"
echo " Target: TestDB_Target"
echo ""
echo "To test the connection:"
echo " drt discover --server localhost --database TestDB_Baseline --output config_test.yaml"
echo ""
echo "To stop the servers:"
echo " $COMPOSE_CMD -f docker-compose.test.yml down"
echo ""
echo "To stop and remove all data:"
echo " $COMPOSE_CMD -f docker-compose.test.yml down -v"
echo ""