MODUL 1 - LEKCIJA 1

Moderni SQL Server Ekosistem i Alati

Postavljanje professional development environment-a i razumijevanje arhitekture SQL Server 2022

⏱️ Trajanje: ~2 časa 📚 Nivo: Početni 🎯 Praktični primjeri: 5

📖 Uvod

SQL Server 2022 predstavlja značajan korak u evoluciji Microsoft-ovog database engine-a, kombinujući mature on-premises mogućnosti sa cloud-ready arhitekturom. U ovoj lekciji ćete naučiti kako postaviti profesionalno razvojno okruženje, razumjeti arhitekturu SQL Server 2022 engine-a, i navigirati kroz moderne alate za razvoj.

💡 Važna Napomena

Ova lekcija pokriva setup koji će vam služiti tokom cijelog kursa. Nemojte preskočiti instalaciju alata - kvalitetan development environment je ključan za efikasan rad.

🚀 Šta je Novo u SQL Server 2022?

SQL Server 2022 donosi revolucionarne izmjene fokusirane na tri glavne oblasti:

1. Intelligent Query Processing (IQP) Enhancements

2. Azure Synapse Link Integration

Direktna integracija sa Azure Synapse Analytics omogućava near real-time analytical insights bez opterećenja transakcione baze.

3. Poboljšane Sigurnosne Mogućnosti

🔑 Ključna Prednost SQL Server 2022

Cloud Connected - mogućnost direktne povezanosti sa Azure servisima (Azure SQL Managed Instance, Synapse, Purview) bez potrebe za full cloud migration-om.

📚 SQL Osnove: Razumijevanje Jezika

Prije nego što uđemo u specifičnosti SQL Server-a, neophodno je razumjeti SQL (Structured Query Language), standardni jezik za interakciju sa relacijskim bazama podataka.

Šta je SQL?

SQL je deklarativni jezik koji se koristi za upravljanje i manipulaciju podacima u relacijskim bazama podataka. Za razliku od proceduralnih jezika gdje specificirate kako nešto uraditi, SQL vam omogućava da specificirate šta želite, a database engine pronalazi najbolji način da to izvrši.

💡 Deklarativni vs Proceduralni Jezik

Deklarativni jezik (SQL): Vi kažete "daj mi sve zaposlenike iz IT odjela" i database engine odlučuje kako to najbolje uraditi (koje indekse koristiti, kako join-ovati tabele, itd.).

Proceduralni jezik (C#, Python): Vi specificirate korak po korak - prođi kroz sve zaposlenike, provjeri svakog da li je u IT odjelu, ako jeste dodaj ga u listu, itd.

Osnovne SQL Operacije: CRUD

Većina operacija sa bazama podataka se svodi na četiri kategorije, često nazvane CRUD:

🔑 Važnost CRUD Operacija

Gotovo sve što radite sa bazom podataka spada u jednu od ovih četiri kategorije. Razumijevanje CRUD operacija je temelj za rad sa bilo kojom bazom podataka.

1. SELECT - Čitanje Podataka

SELECT naredba dohvaća podatke iz tabela. To je najčešće korištena SQL komanda. SELECT se koristi za čitanje podataka, ali nikada ne mijenja podatke u bazi.

Osnovna Sintaksa SELECT-a

Osnovna struktura SELECT naredbe:

📖 Osnovni SELECT Primjeri
-- 1. Selektovanje svih kolona iz tabele (koristite oprezno!)
SELECT * FROM Employees;
-- Napomena: SELECT * vraća SVE kolone. Na velikim tabelama ovo može biti sporo.

-- 2. Selektovanje specifičnih kolona (preporučeno)
SELECT FirstName, LastName, Email 
FROM Employees;
-- Vraća samo kolone koje vam trebaju - brže i efikasnije.

-- 3. Selektovanje sa filtriranjem (WHERE klauzula)
SELECT FirstName, LastName 
FROM Employees 
WHERE Department = 'Sales';
-- WHERE klauzula filtrira redove - vraća samo one koji zadovoljavaju uslov.

-- 4. Selektovanje sa sortiranjem (ORDER BY)
SELECT FirstName, LastName, Salary 
FROM Employees 
ORDER BY Salary DESC;
-- DESC = opadajuće (najveći prvo), ASC = rastuće (najmanji prvo, default)

-- 5. Ograničavanje broja rezultata (TOP)
SELECT TOP 10 FirstName, LastName 
FROM Employees 
ORDER BY HireDate DESC;
-- Vraća samo prvih 10 rezultata.

-- 6. Selektovanje sa aliasima (preimenovanje kolona)
SELECT 
    FirstName AS Ime,
    LastName AS Prezime,
    Salary AS Plata
FROM Employees;
-- AS ključna riječ daje kolonama čitljivija imena u rezultatu.

-- 7. Selektovanje sa izračunima
SELECT 
    FirstName,
    LastName,
    Salary,
    Salary * 1.1 AS NovaPlata -- 10% povećanje
FROM Employees;
-- Možete koristiti matematičke izraze u SELECT listi.

💡 Best Practice: Izbjegavajte SELECT *

Iako je SELECT * brz način da vidite sve podatke, u produkciji ga izbjegavajte jer:

  • Performanse: Dohvaća više podataka nego što vam treba
  • Mreža: Više podataka = više vremena za transfer
  • Memorija: Više memorije potrebno za obradu
  • Održivost: Ako se dodaju nove kolone, vaš kod može pucati

Preporuka: Uvijek specificirajte kolone koje vam trebaju.

2. INSERT - Kreiranje Podataka

INSERT naredba dodaje nove redove u tabelu. To je način kako dodajete nove podatke u bazu.

Osnovna Sintaksa INSERT-a

➕ INSERT Primjeri
-- 1. Umetanje jednog reda (eksplicitno navođenje kolona)
INSERT INTO Employees (FirstName, LastName, Email, Department)
VALUES ('Amar', 'Selimović', '[email protected]', 'IT');
-- Preporučeno: Uvijek navodite kolone eksplicitno za bolju čitljivost i održivost.

-- 2. Umetanje jednog reda (bez navođenja kolona - opasno!)
INSERT INTO Employees
VALUES ('Lejla', 'Hasanović', '[email protected]', 'HR');
-- Ovo radi samo ako unosite podatke za SVE kolone u tačnom redoslijedu.
-- Izbjegavajte ovaj pristup - ako se struktura tabele promijeni, kod puca!

-- 3. Umetanje više redova odjednom (SQL Server 2008+)
INSERT INTO Employees (FirstName, LastName, Email, Department)
VALUES 
    ('Emir', 'Kovačević', '[email protected]', 'Sales'),
    ('Sara', 'Malić', '[email protected]', 'Marketing'),
    ('Dino', 'Jukić', '[email protected]', 'IT');
-- Efikasnije od više pojedinačnih INSERT naredbi.

-- 4. Umetanje podataka iz druge tabele (INSERT...SELECT)
INSERT INTO EmployeesArchive (FirstName, LastName, Email)
SELECT FirstName, LastName, Email 
FROM Employees 
WHERE TerminationDate IS NOT NULL;
-- Kopira podatke iz jedne tabele u drugu na osnovu uslova.

-- 5. Umetanje sa DEFAULT vrijednostima
INSERT INTO Employees (FirstName, LastName, Email, Department, HireDate)
VALUES ('Niko', 'Nović', '[email protected]', 'IT', DEFAULT);
-- DEFAULT koristi default vrijednost definisanu u tabeli.

-- 6. Umetanje sa IDENTITY kolonom
-- Ako tabela ima IDENTITY kolonu (auto-increment), ne navodite je u INSERT
INSERT INTO Employees (FirstName, LastName, Email, Department)
VALUES ('Test', 'Korisnik', '[email protected]', 'IT');
-- EmployeeID će automatski dobiti sljedeći broj u sekvenci.

🔑 Važno za INSERT

  • NOT NULL kolone: Morate unijeti vrijednost za sve NOT NULL kolone
  • IDENTITY kolone: Ne navodite ih u INSERT - SQL Server automatski dodjeljuje vrijednosti
  • DEFAULT vrijednosti: Ako kolona ima DEFAULT, možete koristiti DEFAULT ili ostaviti prazno
  • Tipovi podataka: Vrijednosti moraju odgovarati tipovima kolona

3. UPDATE - Mijenjanje Podataka

UPDATE naredba mijenja postojeće redove u tabeli. Koristi se za ažuriranje podataka koji već postoje u bazi.

Osnovna Sintaksa UPDATE-a

✏️ UPDATE Primjeri
-- 1. Ažuriranje jednog reda (najčešće)
UPDATE Employees 
SET Email = '[email protected]'
WHERE EmployeeID = 101;
-- WHERE klauzula je KRITIČNA - bez nje se ažuriraju SVI redovi!

-- 2. Ažuriranje više kolona odjednom
UPDATE Employees 
SET Department = 'Marketing', 
    Salary = Salary * 1.1,  -- 10% povećanje plate
    LastModified = GETDATE()
WHERE Department = 'Sales';
-- Možete ažurirati više kolona odjednom, odvojene zarezom.

-- 3. Ažuriranje sa subquery (podupitom)
UPDATE Employees 
SET ManagerID = (
    SELECT EmployeeID 
    FROM Employees 
    WHERE FirstName = 'Amar' AND LastName = 'Manager'
)
WHERE Department = 'IT';
-- Subquery se izvršava prvo i vraća vrijednost koja se koristi za UPDATE.

-- 4. Ažuriranje na osnovu JOIN-a
UPDATE e
SET e.Salary = e.Salary * 1.15
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.DepartmentName = 'IT';
-- JOIN omogućava ažuriranje na osnovu podataka iz drugih tabela.

-- 5. Ažuriranje sa CASE izrazom (uslovno ažuriranje)
UPDATE Employees
SET Salary = CASE
    WHEN Department = 'IT' THEN Salary * 1.2
    WHEN Department = 'Sales' THEN Salary * 1.15
    ELSE Salary * 1.1
END
WHERE HireDate < '2020-01-01';
-- CASE omogućava različite vrijednosti na osnovu uslova.

⚠️ UVEK KORISTITE WHERE SA UPDATE!

KRITIČNO VAŽNO: Ako zaboravite WHERE klauzulu u UPDATE naredbi, ažuriraće se SVI redovi u tabeli! Ovo može biti katastrofalno.

Best Practice:

  1. Prvo testirajte WHERE klauzulu sa SELECT da vidite koje redove će ažurirati
  2. Zatim izvršite UPDATE sa istom WHERE klauzulom
  3. Koristite transakcije (BEGIN TRANSACTION) da možete rollback-ovati ako nešto pođe po zlu
🛡️ Siguran UPDATE Workflow
-- Korak 1: Test WHERE klauzule sa SELECT
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Department = 'Sales';
-- Provjerite da li su ovo redovi koje želite ažurirati!

-- Korak 2: Počnite transakciju
BEGIN TRANSACTION;

-- Korak 3: Izvršite UPDATE
UPDATE Employees 
SET Salary = Salary * 1.1
WHERE Department = 'Sales';

-- Korak 4: Provjerite rezultat
SELECT EmployeeID, FirstName, LastName, Salary
FROM Employees
WHERE Department = 'Sales';

-- Korak 5a: Ako je sve u redu, commit-ujte
COMMIT TRANSACTION;

-- Korak 5b: Ako nešto nije u redu, rollback-ujte
-- ROLLBACK TRANSACTION;

4. DELETE - Brisanje Podataka

DELETE naredba uklanja redove iz tabele. OPREZ: Ova operacija je trajna (osim ako ne koristite transakcije) i podaci se gube!

Osnovna Sintaksa DELETE-a

🗑️ DELETE Primjeri
-- 1. Brisanje specifičnih redova (najčešće)
DELETE FROM Employees 
WHERE EmployeeID = 101;
-- WHERE klauzula je KRITIČNA - bez nje se brišu SVI redovi!

-- 2. Brisanje sa uslovom
DELETE FROM Employees 
WHERE TerminationDate < DATEADD(YEAR, -5, GETDATE());
-- Briše sve zaposlenike koji su otpušteni prije više od 5 godina.

-- 3. Brisanje na osnovu JOIN-a
DELETE e
FROM Employees e
INNER JOIN Departments d ON e.DepartmentID = d.DepartmentID
WHERE d.DepartmentName = 'Obrisan Odjel';
-- Brisanje zaposlenika iz određenog odjela.

-- 4. Brisanje svih redova (EKSTREMNO OPASNO!)
-- DELETE FROM Employees;
-- Ovo briše SVE redove iz tabele! Koristite samo ako ste 100% sigurni!

-- 5. Siguran DELETE sa provjerom
-- Prvo provjerite šta će biti obrisano
SELECT * FROM Employees 
WHERE TerminationDate < DATEADD(YEAR, -5, GETDATE());
-- Ako su ovo redovi koje želite obrisati, onda:
DELETE FROM Employees 
WHERE TerminationDate < DATEADD(YEAR, -5, GETDATE());

⚠️ DELETE vs TRUNCATE

Postoje dva načina za brisanje podataka iz tabele:

Karakteristika DELETE TRUNCATE TABLE
Brisanje Red po red (sporije) Sve odjednom (brže)
WHERE klauzula ✅ Podržana ❌ Nije podržana (briše sve)
Rollback ✅ Moguć (u transakciji) ⚠️ Ograničeno (može biti problematično)
Triggers ✅ Okida se DELETE trigger ❌ Ne okida se trigger
IDENTITY reset ❌ Ne resetuje se ✅ Resetuje se na početnu vrijednost

Preporuka: Koristite DELETE za selektivno brisanje, TRUNCATE TABLE samo kada želite obrisati SVE redove i resetovati IDENTITY kolonu.

5. Filtriranje Podataka i Uslovi (WHERE Klauzula)

WHERE klauzula filtrira redove na osnovu uslova. To je jedna od najvažnijih SQL klauzula jer omogućava da dohvatite samo podatke koje vam trebaju.

Operatori u WHERE Klauzuli

🔍 WHERE Klauzula Primjeri
-- 1. Operatori poređenja (=, <>, <, >, <=, >=)
SELECT * FROM Employees WHERE Salary > 50000;
-- > (veće), < (manje), >= (veće ili jednako), <= (manje ili jednako)
-- = (jednako), <> ili != (različito)

-- 2. Logički operatori (AND, OR, NOT)
SELECT * FROM Employees 
WHERE Department = 'IT' AND Salary > 60000;
-- AND: oba uslova moraju biti tačna
-- OR: barem jedan uslov mora biti tačan
-- NOT: negira uslov

SELECT * FROM Employees 
WHERE Department = 'IT' OR Department = 'Sales';

SELECT * FROM Employees 
WHERE NOT Department = 'HR';

-- 3. IN operator (više vrijednosti)
SELECT * FROM Employees 
WHERE Department IN ('IT', 'HR', 'Sales');
-- Ekvivalentno: WHERE Department = 'IT' OR Department = 'HR' OR Department = 'Sales'
-- Ali mnogo čitljivije i efikasnije!

-- 4. LIKE operator (pretraga po uzorku/pattern)
SELECT * FROM Employees 
WHERE Email LIKE '%@example.com';
-- % = bilo koji niz karaktera (0 ili više)
-- _ = tačno jedan karakter

SELECT * FROM Employees 
WHERE FirstName LIKE 'A%';  -- Ime počinje sa 'A'
SELECT * FROM Employees 
WHERE FirstName LIKE '%a';  -- Ime završava sa 'a'
SELECT * FROM Employees 
WHERE FirstName LIKE 'A_a'; -- Ime ima 3 karaktera: A, bilo koji, a

-- 5. Provjera NULL vrijednosti
SELECT * FROM Employees 
WHERE ManagerID IS NULL;  -- Kolona je NULL
SELECT * FROM Employees 
WHERE ManagerID IS NOT NULL;  -- Kolona nije NULL

-- VAŽNO: Ne koristite = NULL ili <> NULL!
-- WHERE ManagerID = NULL  -- OVO NE RADI!
-- WHERE ManagerID IS NULL  -- OVO RADI!

-- 6. BETWEEN operator (raspon vrijednosti)
SELECT * FROM Employees 
WHERE Salary BETWEEN 40000 AND 80000;
-- Ekvivalentno: WHERE Salary >= 40000 AND Salary <= 80000
-- Uključuje granične vrijednosti (40000 i 80000)

-- 7. Kombinovanje više uslova
SELECT * FROM Employees 
WHERE (Department = 'IT' OR Department = 'Sales')
  AND Salary > 50000
  AND HireDate >= '2020-01-01';
-- Koristite zagrade () za grupisovanje logičkih izraza

💡 Best Practices za WHERE Klauzulu

  • Indeksi: WHERE klauzula na indeksiranim kolonama je mnogo brža
  • LIKE sa % na početku: LIKE '%tekst' je sporo jer ne može koristiti indekse
  • NULL provjere: Uvijek koristite IS NULL / IS NOT NULL, nikada = NULL
  • Tipovi podataka: Poredite iste tipove podataka (ne poredite string sa brojem)

6. Agregacione Funkcije

SQL pruža funkcije za izvršavanje izračuna na grupama redova. Agregacione funkcije računaju vrijednosti na osnovu više redova i vraćaju jedan rezultat.

Osnovne Agregacione Funkcije

📊 Agregacione Funkcije Primjeri
-- 1. COUNT - Brojanje redova
SELECT COUNT(*) AS UkupnoZaposlenih FROM Employees;
-- COUNT(*) broji sve redove, uključujući one sa NULL vrijednostima

SELECT COUNT(ManagerID) AS ZaposlenihSaMenadzerom FROM Employees;
-- COUNT(kolona) broji samo redove gdje kolona NIJE NULL

-- 2. SUM - Zbir vrijednosti
SELECT SUM(Salary) AS UkupnaPlata FROM Employees;
-- Sabira sve vrijednosti u koloni (radi samo sa numeričkim tipovima)

-- 3. AVG - Prosječna vrijednost
SELECT AVG(Salary) AS ProsjecnaPlata FROM Employees;
-- Računa prosjek (aritmetičku sredinu) vrijednosti

-- 4. MIN i MAX - Najmanja i najveća vrijednost
SELECT 
    MIN(Salary) AS NajmanjaPlata,
    MAX(Salary) AS NajvecaPlata
FROM Employees;
-- MIN vraća najmanju, MAX vraća najveću vrijednost

-- 5. GROUP BY - Grupisanje i agregacija po kategorijama
SELECT 
    Department AS Odjel,
    COUNT(*) AS BrojZaposlenih,
    AVG(Salary) AS ProsjecnaPlata,
    MIN(Salary) AS NajmanjaPlata,
    MAX(Salary) AS NajvecaPlata,
    SUM(Salary) AS UkupnaPlata
FROM Employees
GROUP BY Department;
-- GROUP BY grupiše redove sa istom vrijednošću u Department koloni
-- Zatim primjenjuje agregacione funkcije na svaku grupu

-- 6. HAVING - Filtriranje grupa (nakon GROUP BY)
SELECT 
    Department,
    COUNT(*) AS BrojZaposlenih,
    AVG(Salary) AS ProsjecnaPlata
FROM Employees
GROUP BY Department
HAVING COUNT(*) > 5;  -- Samo odjeli sa više od 5 zaposlenih
-- HAVING filtrira grupe, WHERE filtrira pojedinačne redove

-- 7. Više kolona u GROUP BY
SELECT 
    Department,
    City,
    COUNT(*) AS BrojZaposlenih
FROM Employees
GROUP BY Department, City;
-- Grupiše po kombinaciji Department i City

💡 Razumijevanje GROUP BY

Kada koristite agregacione funkcije kao što su COUNT, SUM, ili AVG, morate koristiti GROUP BY za sve kolone koje nisu u agregacionim funkcijama. Ovo grupiše redove sa istim vrijednostima prije primjene agregacione funkcije.

Pravilo: Sve kolone u SELECT listi moraju biti:

  • U agregacionoj funkciji (COUNT, SUM, AVG, itd.), ILI
  • U GROUP BY klauzuli
✅ Ispravno
SELECT Department, COUNT(*) 
FROM Employees 
GROUP BY Department;
-- Department je u GROUP BY, COUNT je agregaciona funkcija
❌ Neispravno
SELECT Department, FirstName, COUNT(*) 
FROM Employees 
GROUP BY Department;
-- GREŠKA! FirstName nije u GROUP BY niti u agregacionoj funkciji

🔑 WHERE vs HAVING

WHERE: Filtrira pojedinačne redove PRIJE grupisanja

HAVING: Filtrira grupe NAKON grupisanja

📝 Primjer Razlike
-- WHERE: Filtrira zaposlenike PRIJE grupisanja
SELECT Department, COUNT(*) AS BrojZaposlenih
FROM Employees
WHERE Salary > 50000  -- Samo zaposlenici sa platom > 50000
GROUP BY Department;
-- Rezultat: Broj zaposlenih sa platom > 50000 po odjelu

-- HAVING: Filtrira grupe NAKON grupisanja
SELECT Department, COUNT(*) AS BrojZaposlenih
FROM Employees
GROUP BY Department
HAVING COUNT(*) > 5;  -- Samo odjeli sa više od 5 zaposlenih
-- Rezultat: Odjeli koji imaju više od 5 zaposlenih (bez obzira na platu)

💿 Instalacija SQL Server 2022

Preuzimanje SQL Server 2022

Microsoft nudi nekoliko verzija SQL Server-a:

📥 Download Link

Preuzmite SQL Server 2022 Developer Edition sa: https://www.microsoft.com/sql-server/sql-server-downloads

Koraci Instalacije

1

Pokretanje Setup-a

Pokrenite SQLServer2022-x64-ENU-Dev.exe i izaberite "Custom" installation type.

2

Odabir Komponenti

Minimum potrebne komponente:

  • ✅ Database Engine Services (Database Engine Servisi) - osnovni SQL Server engine
  • ✅ Full-Text and Semantic Extractions for Search (Full-Text i Semantička Ekstrakcija za Pretragu) - za Full-Text Search
  • ✅ Client Tools Connectivity (Konektivnost Klijentskih Alata) - za povezivanje sa serverom
  • ✅ Integration Services (SSIS) - opciono ali korisno za ETL operacije
3

Konfiguracija Instance

Izaberite "Default instance" (podrazumijevana instanca) ili imenovani instance. Za razvoj, default instance (MSSQLSERVER) je najjednostavniji jer se može pristupiti samo sa server imenom bez navođenja instance imena.

💡 Instance vs Server

Instance je kopija SQL Server engine-a. Na jednom serveru možete imati više instanci (npr. MSSQLSERVER, SQL2019, SQL2022). Svaka instanca ima svoje baze podataka i konfiguracije. Default instance se pristupa samo sa server imenom, dok se named instance pristupa sa "ServerName\InstanceName".

4

Konfiguracija Servera

Postavite SQL Server Database Engine da se pokreće automatski ("Automatic" tip pokretanja). Ovo osigurava da se SQL Server automatski pokrene kada se server restartuje.

5

Konfiguracija Database Engine-a

Način Autentifikacije:

  • Mixed Mode (mješoviti način, preporučeno za razvoj) - omogućava Windows autentifikaciju i SQL Server autentifikaciju (korisničko ime/lozinka)
  • Postavite jaku sa lozinku (minimum 8 karaktera, velika slova, brojevi, simboli)
  • Dodajte vaš Windows nalog kao SQL Administratora

🔑 Windows vs SQL Server Autentifikacija

Windows Autentifikacija: Koristi Windows korisničke naloge. Sigurnija, ali zahtijeva Windows domene ili lokalne naloge.

SQL Server Autentifikacija: Koristi korisničko ime/lozinku pohranjene u SQL Server-u. Manje sigurna, ali fleksibilnija za razvoj i aplikacije.

Preporuka za razvoj: Mixed Mode - omogućava oba pristupa.

✅ Provjera Instalacije - PowerShell
# Provjera da li SQL Server servis radi
Get-Service -Name MSSQLSERVER

# Treba vratiti Status: Running (Pokrenuto)

# Alternativno, provjera svih SQL servisa
Get-Service -DisplayName "SQL Server*"

# Provjera verzije SQL Server-a
sqlcmd -S localhost -Q "SELECT @@VERSION"

🛠️ SQL Server Management Studio (SSMS)

SQL Server Management Studio (SSMS) je primarni grafički (GUI) alat za interakciju sa SQL Server-om. SSMS 20 donosi značajna poboljšanja u performansama i korisničkom interfejsu.

Šta je SSMS?

SSMS je besplatni alat od Microsoft-a koji omogućava:

Instalacija SSMS 20

📥 Preuzimanje SSMS

Preuzmite najnoviju verziju sa: https://aka.ms/ssmsfullsetup

Napomena: SSMS se instalira odvojeno od SQL Server-a. Instalacija je jednostavna - samo pratite instalacijski vodič (wizard).

Povezivanje sa SQL Server Instancom

1

Pokrenite SSMS i u dijalogu "Povezivanje sa Serverom" unesite:

  • Tip servera: Database Engine
  • Ime servera:
    • localhost ili . (za lokalnu podrazumijevanu instancu)
    • localhost\IMEINSTANCE (za imenovanu instancu, npr. localhost\SQL2019)
    • ServerName (za udaljeni server)
  • Autentifikacija: Windows Autentifikacija (preporučeno) ili SQL Server Autentifikacija

💡 Kratice za Server Ime

  • . = lokalni server, default instanca
  • localhost = lokalni server, default instanca
  • (local) = lokalni server, default instanca
  • 127.0.0.1 = lokalni server preko IP adrese
🔍 Test Konekcije - T-SQL
-- Provjera verzije SQL Server-a
SELECT @@VERSION AS [SQL Server Version];

-- Provjera trenutnog korisnika
SELECT SYSTEM_USER AS [Current User], 
       USER_NAME() AS [Database User];

-- Provjera imena instance
SELECT @@SERVERNAME AS [Server Name],
       SERVERPROPERTY('ServerName') AS [Server Property],
       SERVERPROPERTY('Edition') AS [Edition],
       SERVERPROPERTY('ProductLevel') AS [Product Level],
       SERVERPROPERTY('ProductVersion') AS [Version];

Navigacija kroz SSMS Interface

Object Explorer

Lijeva strana SSMS-a prikazuje hijerarhijski view svih database objekata. Glavne sekcije:

Query Editor

Glavni prostor za pisanje T-SQL koda. Korisni shortcuts:

💻 Visual Studio Code sa MSSQL Extension

Za developere koji preferiraju lightweight editor, VS Code sa mssql extension-om pruža odličnu alternativu SSMS-u.

Instalacija i Setup

1

Preuzmite i instalirajte Visual Studio Code

2

Instalirajte SQL Server (mssql) extension:

  • Pritisnite Ctrl + Shift + X
  • Pretražite "mssql"
  • Instalirajte extension od Microsoft-a
3

Kreirajte konekciju:

  • Pritisnite Ctrl + Shift + P
  • Ukucajte "MSSQL: Connect"
  • Unesite connection details (localhost, authentication)

🎯 VS Code Prednosti

  • Lightweight i brzo startovanje
  • IntelliSense za T-SQL
  • Git integration
  • Ekstenzivna customizacija
  • Multi-language support (Python, C#, etc.)

🗄️ Razumijevanje System Databases

SQL Server koristi četiri system databases za interno upravljanje. Razumijevanje njihove uloge je ključno za administraciju i troubleshooting.

master Database

Namjena: Čuva system-level informacije za cijeli SQL Server instance.

⚠️ KRITIČNO VAŽNO

NIKADA ne kreirajte korisnčke objekte (tabele, views, procedures) u master bazi! Korupcija master baze može rezultirati gubitkom cijelog SQL Server instance-a.

🔍 Pregled Master Database
USE master;
GO

-- Lista svih baza podataka
SELECT 
    name AS DatabaseName,
    database_id,
    create_date,
    state_desc AS State,
    recovery_model_desc AS RecoveryModel
FROM sys.databases
ORDER BY name;

-- Lista svih login-a
SELECT 
    name AS LoginName,
    type_desc AS LoginType,
    create_date,
    is_disabled
FROM sys.server_principals
WHERE type IN ('S', 'U', 'G')  -- S=SQL, U=Windows User, G=Windows Group
ORDER BY name;

model Database

Namjena: Template za sve nove korisnčke baze podataka.

Kada kreirate novu bazu sa CREATE DATABASE, SQL Server pravi kopiju model baze. Sve objekte i settings koje dodate u model će biti automatski uključeni u svaku novu bazu.

💡 Praktična Upotreba

Ako vaša organizacija ima standardne stored procedures ili funkcije koje trebaju biti u svakoj bazi, dodajte ih u model database.

msdb Database

Namjena: Koristi se od strane SQL Server Agent-a za upravljanje:

📊 Backup History - msdb
USE msdb;
GO

-- Pregled nedavnih backups-a
SELECT TOP 10
    bs.database_name,
    bs.backup_start_date,
    bs.backup_finish_date,
    DATEDIFF(SECOND, bs.backup_start_date, bs.backup_finish_date) AS DurationSeconds,
    bs.backup_size / 1024 / 1024 AS BackupSizeMB,
    bmf.physical_device_name AS BackupFile,
    CASE bs.type
        WHEN 'D' THEN 'Full'
        WHEN 'I' THEN 'Differential'
        WHEN 'L' THEN 'Log'
    END AS BackupType
FROM backupset bs
INNER JOIN backupmediafamily bmf ON bs.media_set_id = bmf.media_set_id
ORDER BY bs.backup_start_date DESC;

tempdb Database

Namjena: Privremeno skladište za:

🔄 tempdb Karakteristike

  • Recreira se na svaki restart SQL Server-a
  • Svi objekti su privremeni
  • Koristi SIMPLE recovery model (transaction logs se automatski truncate-uju)
  • Deljeno među svim bazama i korisnicima
🔧 tempdb Configuration Check
-- Provjera tempdb fajlova (SQL 2022 automatski kreira multiple data files)
SELECT 
    name AS FileName,
    physical_name AS FilePath,
    size * 8 / 1024 AS SizeMB,
    max_size * 8 / 1024 AS MaxSizeMB,
    growth * 8 / 1024 AS GrowthMB,
    is_percent_growth
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

-- tempdb space usage
SELECT 
    SUM(unallocated_extent_page_count) * 8 / 1024 AS UnallocatedSpaceMB,
    SUM(version_store_reserved_page_count) * 8 / 1024 AS VersionStoreMB,
    SUM(user_object_reserved_page_count) * 8 / 1024 AS UserObjectsMB,
    SUM(internal_object_reserved_page_count) * 8 / 1024 AS InternalObjectsMB
FROM sys.dm_db_file_space_usage;

☁️ Cloud-Ready Mindset: Azure SQL Managed Instance

SQL Server 2022 je dizajniran sa "cloud-first" mentalitetom, omogućavajući seamless integraciju sa Azure cloud servisima.

Šta je Azure SQL Managed Instance?

Azure SQL Managed Instance je PaaS (Platform as a Service) opcija koja pruža skoro 100% kompatibilnost sa on-premises SQL Server-om, ali bez brige o hardware-u, OS patching-u, ili backup infrastrukturi.

Prednosti Hybrid Pristupa

Feature On-Premises Azure Managed Instance
Hardware Management Manual (kupovina, održavanje) ✅ Automatski
High Availability Manual setup (AlwaysOn) ✅ Built-in (99.99% SLA)
Automatic Backups Manual scheduling ✅ Automatic (PITR do 35 dana)
Scaling Hardware upgrade ✅ Online (minutama)
Security Patches Manual installation ✅ Automatski

Kada Koristiti Koji Pristup?

🏢 On-Premises SQL Server

  • Regulatorni compliance zahtjevi (podaci ne smiju napustiti data center)
  • Legacy aplikacije sa specifičnim zavisnostima
  • Postojeća infrastruktura i maintenance tim

☁️ Azure SQL Managed Instance

  • Nova aplikacija ili modernizacija postojeće
  • Potreba za high availability bez kompleksnog setup-a
  • Variable workloads (scaling gore-dole)
  • Želite fokus na razvoj umjesto na infrastrukturu

🎯 Praktična Vježba: Setup i Verifikacija

Zadatak 1: Kreiranje Test Baze Podataka

Kreirajte novu bazu podataka i verifikujte system databases.

Korak 1: Otvorite SSMS i konektujte se na vash SQL Server instance.

Korak 2: Izvršite sledeći kod za kreiranje test baze:

Kreiranje Test Baze
-- Kreiranje baze podataka za državnu statistiku
CREATE DATABASE StateStatisticsDB
GO

-- Postavljanje opcija koje preferiramo
ALTER DATABASE StateStatisticsDB 
SET RECOVERY SIMPLE;  -- Za development
GO

-- Verifikacija kreacije
USE StateStatisticsDB;
GO

SELECT DB_NAME() AS CurrentDatabase;
GO

-- Kreiranje schema-a
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Stats')
BEGIN
    EXEC('CREATE SCHEMA Stats');
END
GO

-- Kreiranje osnovne tabele za regije
CREATE TABLE Stats.Regions (
    RegionID INT PRIMARY KEY IDENTITY(1,1),
    RegionName NVARCHAR(100) NOT NULL,
    RegionCode NVARCHAR(10) NOT NULL UNIQUE,
    Population INT NOT NULL,
    Area DECIMAL(10,2) NOT NULL,
    CreatedDate DATETIME2 DEFAULT SYSDATETIME()
);
GO

-- Insert test data
INSERT INTO Stats.Regions (RegionName, RegionCode, Population, Area)
VALUES 
    ('Federacija BiH', 'FBIH', 2200000, 26395.00),
    ('Republika Srpska', 'RS', 1200000, 24857.00);
GO

-- Provjera podataka
SELECT * FROM Stats.Regions;
GO

Korak 3: Istražite system databases:

Eksploracija System Databases
-- Koliko prostora zauzima svaka baza?
SELECT 
    DB_NAME(database_id) AS DatabaseName,
    SUM(size * 8 / 1024) AS SizeMB
FROM sys.master_files
GROUP BY database_id
ORDER BY SizeMB DESC;
GO

-- Ko je kreirao objekte u master bazi? (ne bi trebali biti custom objekti)
USE master;
GO

SELECT 
    o.name AS ObjectName,
    o.type_desc AS ObjectType,
    SCHEMA_NAME(o.schema_id) AS SchemaName
FROM sys.objects o
WHERE o.is_ms_shipped = 0  -- Samo user-created objekti
ORDER BY o.type_desc, o.name;
GO

-- Provjera tempdb konfiguracije
SELECT 
    name,
    physical_name,
    size * 8 / 1024 AS CurrentSizeMB,
    max_size * 8 / 1024 AS MaxSizeMB
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

Zadatak 2: VS Code Setup

Ako još niste, instalirajte VS Code i mssql extension, zatim se konektujte na vašu SQLTutorial_DB bazu.

  1. Instalirajte VS Code
  2. Dodajte mssql extension
  3. Kreirajte connection profile za localhost
  4. Otvorite novi .sql fajl i konektujte se na SQLTutorial_DB
  5. Izvršite SELECT upit na TestTable

✅ Zaključak

U ovoj lekciji ste postavili profesionalan SQL Server development environment:

📚 Sljedeća Lekcija

U Lekciji 1.2 ćete naučiti kako dizajnirati i implementirati tabele, uključujući odabir pravih data types, normalizaciju, i korištenje schemas za organizaciju objekata.