📖 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
- Parameter Sensitive Plan (PSP) Optimization - automatsko generisanje različitih execution plans za iste upite sa različitim parametrima
- Cardinality Estimation (CE) Feedback - SQL Server uči iz execution-a i optimizuje buduće upite
- Memory Grant Feedback Persistence - trajno čuvanje naučenih memory grant-ova
- Degree of Parallelism (DOP) Feedback - automatsko podešavanje paralelizma
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
- Ledger - tamper-evident database tehnologija za compliance
- Microsoft Purview Integration - automatizovana data governance
- Enhanced Always Encrypted - enkripcija sa secure enclaves
🔑 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:
- CREATE (Kreiranje) - Umetanje novih podataka
- READ (Čitanje) - Upiti/dohvaćanje podataka
- UPDATE (Ažuriranje) - Mijenjanje postojećih podataka
- DELETE (Brisanje) - Uklanjanje podataka
🔑 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:
-- 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
-- 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
-- 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:
- Prvo testirajte WHERE klauzulu sa SELECT da vidite koje redove će ažurirati
- Zatim izvršite UPDATE sa istom WHERE klauzulom
- Koristite transakcije (BEGIN TRANSACTION) da možete rollback-ovati ako nešto pođe po zlu
-- 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
-- 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
-- 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
-- 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
SELECT Department, COUNT(*)
FROM Employees
GROUP BY Department;
-- Department je u GROUP BY, COUNT je agregaciona funkcija
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
-- 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:
- Developer Edition - besplatna, puna funkcionalnost, samo za development (preporučeno)
- Express Edition - besplatna, limitirana (10GB max database size)
- Enterprise/Standard - komercijalne licence
📥 Download Link
Preuzmite SQL Server 2022 Developer Edition sa: https://www.microsoft.com/sql-server/sql-server-downloads
Koraci Instalacije
Pokretanje Setup-a
Pokrenite SQLServer2022-x64-ENU-Dev.exe i izaberite
"Custom" installation type.
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
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".
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.
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 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:
- Pisanje i izvršavanje T-SQL upita - Query Editor sa syntax highlighting-om
- Upravljanje bazama podataka - kreiranje, brisanje, backup, restore
- Upravljanje sigurnošću - korisnici, uloge, permisije
- Monitoring i optimizacija - execution plans, index tuning, performance monitoring
- Database design - vizuelni dizajn tabela, relacija, indeksa
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
Pokrenite SSMS i u dijalogu "Povezivanje sa Serverom" unesite:
- Tip servera: Database Engine
- Ime servera:
localhostili.(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 instancalocalhost= lokalni server, default instanca(local)= lokalni server, default instanca127.0.0.1= lokalni server preko IP adrese
-- 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:
- Databases - korisnički kreirane baze
- System Databases - master, model, msdb, tempdb
- Security - logins, server roles
- Server Objects - linked servers, triggers
- Replication - replication configuration
- Management - maintenance plans, logs
Query Editor
Glavni prostor za pisanje T-SQL koda. Korisni shortcuts:
- Ctrl + N - Nova query
- F5 ili Ctrl + E - Execute query
- Ctrl + R - Toggle results pane
- Ctrl + L - Display execution plan
- Ctrl + Shift + M - Specify template parameters
💻 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
Preuzmite i instalirajte Visual Studio Code
Instalirajte SQL Server (mssql) extension:
- Pritisnite Ctrl + Shift + X
- Pretražite "mssql"
- Instalirajte extension od Microsoft-a
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.
- Lista svih baza podataka na instance-u
- Login accounti i permisije
- Linked servers
- Sistem konfiguracija
⚠️ 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.
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:
- Jobs - zakazani taskovi
- Alerts - notifikacije
- Operators - kontakt lista za notifikacije
- Backup/Restore history - tracking backups
- Database Mail - email funkcionalnost
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:
- Temp tables (#TempTable)
- Table variables (@TableVar)
- Intermediate query results
- Version store (za snapshot isolation)
- Workload od online index operations
🔄 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
-- 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 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:
-- 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.
- Instalirajte VS Code
- Dodajte mssql extension
- Kreirajte connection profile za localhost
- Otvorite novi .sql fajl i konektujte se na SQLTutorial_DB
- Izvršite SELECT upit na TestTable
✅ Zaključak
U ovoj lekciji ste postavili profesionalan SQL Server development environment:
- ✅ Instalirali SQL Server 2022 Developer Edition
- ✅ Podesili SQL Server Management Studio (SSMS)
- ✅ Upoznali se sa VS Code + mssql extension
- ✅ Razumjeli ulogu system databases (master, model, msdb, tempdb)
- ✅ Upoznali koncept cloud-connected arhitekture
📚 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.