MODUL 3 - LEKCIJA 5

CLR Integracija (Managed Code)

Proširivanje SQL Servera snagom .NET framework-a i C# jezika

⏱️ Trajanje: ~3.5 časa 📚 Nivo: Ekspertski 🎯 Praktični primjeri: 4

📖 Šta je CLR u SQL Serveru?

Common Language Runtime (CLR) integracija omogućava da pišete proceduru, funkciju, triger ili čak tip podatka koristeći C# ili VB.NET. Dok je T-SQL neprikosnoven za manipulaciju podacima, on je limitiran kada je u pitanju kompleksna logika, obrada teksta (Regex) ili matematički algoritmi.

🎯 Kada odabrati CLR umjesto T-SQL-a?

🛡️ Sigurnosni Nivoi (Permission Sets)

Pri uvozu .NET koda, morate ga kategorisati u jedan od tri nivoa:

  1. SAFE (Preporučeno): Kod može pristupati samo podacima unutar baze. Nema pristupa fajlovima, mreži ili registry ključevima.
  2. EXTERNAL_ACCESS: Dozvoljava pristup eksternim resursima (fajlovi, mreža) uz strogu kontrolu.
  3. UNSAFE: Potpuni pristup svemu što i sam SQL Server proces može doseći. Visok rizik, rijetko se koristi u produkciji.

🛠️ Proces Implementacije

Korak 1: Omogućavanje CLR-a na serveru

⚙️ Server Configuration
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
GO

Korak 2: Kreiranje i registracija Assembly-ja

Nakon što kreirate DLL u Visual Studiju, uvozite ga u bazu:

📦 Uvoz koda
CREATE ASSEMBLY MyExtensions 
FROM 'C:\Binaries\MyExtensions.dll' 
WITH PERMISSION_SET = SAFE;
GO

Korak 3: Povezivanje .NET metoda sa SQL funkcijom

🔗 Bridge SQL to C#
CREATE FUNCTION dbo.fn_IsValidEmail(@email NVARCHAR(MAX)) 
RETURNS BIT 
AS EXTERNAL NAME MyExtensions.[MyExtensions.Validators].IsValidEmail;
GO

🎯 Praktična Vježba: Regex u SQL-u

Zadatak: Validacija formata (C# kod)

U T-SQL-u je teško provjeriti da li string odgovara formatu ABC-1234-XYZ. Koristićemo C# Regex podršku.

💻 C# Code Snippet (Visual Studio)
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public class MyValidators {
    [SqlFunction]
    public static bool IsSpecialFormat(string input) {
        return Regex.IsMatch(input, @"^[A-Z]{3}-\d{4}-[A-Z]{3}$");
    }
}
🧪 SQL Testiranje
-- Test koda nakon registracije
SELECT dbo.fn_IsSpecialFormat('ABC-1234-XYZ') -- Vraća 1
SELECT dbo.fn_IsSpecialFormat('AB1234XYZ')    -- Vraća 0

✅ Zaključak Modula 3

Završili smo modul o programabilnosti. Sada ste sposobni da izgradite kompletnu logiku unutar baze podataka:

📚 Modul 4: Specijalizovano Skladištenje

U sljedećem modulu prelazimo na "egzotične" tehnologije. Istražićemo In-Memory OLTP za baze koje moraju raditi sa nula milisekundi kašnjenja, te rad sa XML i Prostornim podacima (GIS).