Programiranje SQL Server 2005.pdf

January 29, 2017 | Author: TihoDuman | Category: N/A
Share Embed Donate


Short Description

Download Programiranje SQL Server 2005.pdf...

Description

Priprema za zaranjanje u SQL Server 2005

Baze podataka/SQL Server

Programiranje SQL Server 2005

upotrebe novog alata za rad s bazama podataka. Napisana za čitatelje svih razina znanja, ova knjiga ne zahtijeva poznavanje SQL Servera 2000, jer se programiranje SQL Servera 2005 u gotovo svakom dijelu razlikuje od rada s prethodnom inačicom. Budući da objašnjava sve detalje programiranja SQL Servera 2005, ova je knjiga idealna za programere sa malo ili nimalo iskustva u SQL programiranju, ali i odličan alat za iskusne programere koji se spremaju za uvođenje novih programskih modela koje donosi SQL Server 2005. Posebice, Programiranje SQL Server 2005 pruža detaljan pregled novih programskih značajki koje se odnose na RDBMS. Među njima su i sljedeće:



Upotreba .NET CLR sklopova za stvaranje SQL Server objekata kao što su pohranjene procedure i okidači.



Izrada većine SQL SMO objekata za izradu, modificiranje i brisanje baza podataka te manipuliranje bazama podataka, tablicama i drugim SQL Server objektima.



Izgradnja izvornih Web usluga.

Programiranje SQL Server 2005 obuhvaća i teme kao što su SQL Server Management Studio, poboljšanja T-SQL-a, korisnički definirane funkcije, xml tip podataka, SASS, SSIS, SSRS, usluge obavješćivanja, posrednik usluga, RMO, SQL Server Agent te SQL Server Mobile Edition.

Programiranje

SQL Server 2005

Hamilton

Bill Hamilton je autor knjige ADO.NET Cookbook. Programski je arhitekt specijaliziran za projektiranje, razvoj i implementiranje poslovnih aplikacija upotrebom tehnologija .NET i J2EE. U proteklih petnaest godina Bill je pružao savjetničke usluge za integraciju B2B, B2C, B2E poslovnih aplikacija, razvijao portale i poslovne aplikacije prema zahtjevima korisnika iz područja financija, prodaje, usluga i proizvodnje. Osim ove, napisao je i knjigu NUnit Pocket Reference te je koautor knjige ADO.NET in a Nutshell, obje u izdanju O’Reilly. Autor je i mnogih članaka za Microsoft Developer Network.

Programiranje

Programiranje SQL Server 2005 je sveobuhvatan izvor koji pomaže da svladate brojne detalje

SQL Server 2005

SQL Server 2005, Microsoftovo rješenje nove generacije za pohranu i analizu podataka, veliki je korak naprijed. Donosi ogroman broj promjena koje pružaju pojačanu sigurnost i skalabilnost i stoga čine SQL Server kompletnim alatom za obradu podataka. Ako se koristi na pravi način, SQL Server 2005 može pomoći organizacijama svih veličina da uspješno čuvaju i organiziraju podatke te da rade s njima.

„Prakticˇan uvod u sve aspekte programiranja SQL Servera 2005.“ —Narayana Vyas Kondreddi, Microsoft SQL Server MVP

PROFESION A LN A I N F O R M A T I Cˇ K A LITERATURA

www.itexpertbooks.com ISBN 953-95207-5-4

IT profesionalci za IT profesionalce

omot_SQS5.indd 1

y(7IJ5D9*PMKRPN(

IT profesionalci za IT profesionalce

Bill Hamilton

23.5.2006 13:28:33

Programiranje SQL Server 2005

Programiranje SQL Server 2005

Bill Hamilton Prijevod: Jasmina Morvaj Mariana Lisjak Ivana Čorak

Programiranje SQL Server 2005 Bill Hamilton

Nakladnik: Za nakladnika:

Dobar Plan, Zagreb Tomislav Kotnik

Urednik: Recenzent:

Aleksandar Dragosavljević Nenad Crnko

Copyright © 2006 Dobar Plan, Zagreb. Autorizirani prijevod engleskog izdanja knjige Programming SQL Server 2005 © O’Reilly Media, Inc. Ovaj prijevod je objavljen i prodaje se s dozvolom O’Reilly Media, Inc. koja je vlasnik svih prava za objavljivanje i prodaju. Iako je tijekom prijevoda i pripreme ove knjige za tisak uložen veliki trud kako bi se izbjegle pogreške, autor i izdavač ne preuzimaju odgovornost za pogreške ili propuste niti za štetu koja bi mogla nastati upotrebom informacija iz ove knjige.

CIP - Katalogizacija u publikaciji Nacionalna i sveučilišna knjižnica - Zagreb UDK 004.655.3(035) HAMILTON, Bill Programiranje SQL Server 2005 / Bill Hamilton ; prijevod Jasmina Morvaj, Ivana Čorak, Mariana Lisjak. - Zagreb : Dobar plan, 2006. Prijevod djela: Programming SQL Server 2005. - Kazalo. ISBN 953-95207-5-4 I. SQL -- Priručnik 460522035

ISBN 953-95207-5-4

3 2 1

Sadržaj

Predgovor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix 1. Uvod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Sadržaj knjige Što nećete pronaći u knjizi

3 7

2. Alati i pomoćni programi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 SQL Server Management Studio SQL Server Configuration Manager SQL Server Surface Area Configuration Database Engine Tuning Advisor SQL Server Profiler SQL Server Business Intelligence Development Studio Visual Studio 2005 Novi pomoćni programi za odzivnik

8 24 25 25 25 26 27 28

3. T-SQL poboljšanja. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30 Novi tipovi podataka Poboljšanja T-SQL jezika Data Definition Language (DDL) okidači Metapodaci

30 32 53 57

4. Uvod u Common Language Runtime (CLR) integraciju . . . . . . . . . . . . . . . . . .58 Projektni ciljevi CLR integracije Uključivanje CLR integracije Tipovi CLR rutina Primjer Hello World

59 61 62 62

v

DDL podrška za CLR integraciju ADO.NET unutarprocesna proširenja koja podržavaju CLR programiranje Prilagođeni atributi za CLR rutine SQL Server tipovi podataka u .NET Frameworku CLR rutine za pronalaženje i uklanjane pogrešaka

68 87 90 90 92

5. Programiranje SQL Server CLR rutina . . . . . . . . . . . . . . . . . . . . . . . . . . . .93 Funkcije sa skalarnim vrijednostima Funkcije s tabličnim vrijednostima Pohranjene procedure Korisnički definirane agregatne funkcije Korisnički definirani tipovi podataka Okidači

93 96 100 106 109 117

6. .NET klijentsko programiranje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Programiranje SQL Native Clienta SQLXML 4.0 Okvir s porukom o iznimci

128 130 156

7. XML podaci. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 xml tip podataka Stvaranje instanci xml tipa podataka Metode XML tipa podataka Pregled XML podataka kao relacijskih podataka Indeksiranje XML podataka Upravljanje kolekcijama XML shema Podrška za XQuery XML Data Manipulation Language XML rezultati upotrebom klauzule FOR XML XML kataloški pogledi

162 167 172 176 180 186 193 197 201 208

8. Izvorne XML Web usluge. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 Otvoreni standardi Izrada Web usluge Primjer izrade HTTP krajnje točke i izlaganja Web metode SOAP poruke zahtjeva i odgovora Rad sa HTTP krajnjim točkama

vi | Sadržaj

210 211 211 217 218

9. SQL Server Management Objects (SMO). . . . . . . . . . . . . . . . . . . . . . . . . . 234 SMO objektni model Izrada SMO projekta u Visual Studiju .NET Jednostavna SMO aplikacija

235 236 237

10. SQL Server Management Objects (SMO) klase instance, 1. dio . . . . . . . . . . . . 238 Programiranje SMO klasa instance za administriranje objekata za pohranu podataka Referenca na SMO klase instance za administriranje objekata za pohranu podataka

238 255

11. SQL Server Management Objects (SMO) klase instance, 2. dio . . . . . . . . . . . . 267 Programiranje SMO klasa instance za administriranje objekata baze podataka koji se ne koriste za pohranu podataka Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka

267 286

12. SQL Server Management Objects (SMO) pomoćne klase . . . . . . . . . . . . . . . . 298 Skriptiranje Izrada sigurnosnih kopija i restauriranje podataka Prijenos podataka Praćenje Database Mail

298 305 309 311 314

13. Windows Management Instrumentation (WMI) programiranje . . . . . . . . . . . 318 Programiranje SMO WMI klasa

318

14. SQL Server Reporting Services (SSRS) . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 Započinjanje Integriranje izvješća u aplikacije Proširenja za Reporting Services

328 329 342

15. SQL Server Integration Services (SSIS). . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Arhitektura Alati Programiranje SSIS-a

343 350 351

16. SQL Server Agent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Programiranje SQL Server Agenta

375

Sadržaj

| vii

17. Service Broker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 Arhitektura Programiranje Service Brokera

388 389

18. Notification Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402 Arhitektura Stvaranje Notification Services aplikacije Programiranje Notification Services rješenja

402 406 407

19. Replikacija . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441 Programiranje replikacije

442

20. SQL Server Analysis Services (SSAS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478 Prije početka Pregled SSAS-a SSAS baza podataka SSAS jezici Razvoj Pristup podacima s pomoću ADOMD.NET-a Upravljanje SSAS objektima

479 479 480 480 486 487 493

21. SQL Server Mobile Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496 Okolina Preduvjeti Programiranje SQL Server Mobile rješenja

497 497 498

Dodatak: ADO.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 Kazalo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545

viii | Sadržaj

Predgovor

Ova je knjiga napisana za korisnike svih razina znanja, tako da ne morate biti iskusan programer za SQL Server 2005 da biste ju mogli koristiti. Također, nije potrebno nikakvo iskustvo sa SQL Serverom 2000, s obzirom da se programiranje SQL Servera 2005 u gotovo svakom aspektu razlikuje od programiranja SQL Servera 2000. Ono što je potrebno je poznavanje temeljnih koncepata relacijskih baza podataka. Osnovno znanje o jeziku T-SQL također je od pomoći. Cilj knjige je da upozna programera sa svim stranama programiranja SQL Servera 2005. Programski inženjeri bez iskustva ili s malim iskustvom u radu sa SQL Serverom mogu je koristiti kao početnicu. Programerima s više iskustva može služiti kao pristup novim modelima programiranja za SQL Server 2005, ili se može upotrebljavati kao potrebna pozadina i početnica za specifične koncepte. Programski kod iz knjige možete preuzeti s O’Reillyjeve Web stranice na adresi http:// www.oreilly.com/catalog/progsqlsvr, tako da ga za praćenje primjera ne morate prepisivati. U knjizi je naveden samo dio koda koji je važan za ilustriranje specifičnih koncepata, ali i to je dovoljno da se knjiga može koristiti bez učitavanja stvarnog koda. Kod korisničkog sučelja niti kod koji automatski generira Visual Studio .NET nije prikazan.

Što vam treba za korištenje ove knjige Za izvođenje priloženih primjera potrebno vam je računalo sa sustavom Windows 2000 SP4 ili novijim, Microsoftov .NET Framework 2.0 (instalira se sa SQL Serverom 2005), te SQL Server 2005 – izdanje Developer, Standard ili Enterprise. U većini primjera koristi se jezik C# i Visual Studio 2005. Najjednostavnije je da se za prevođenje i izvođenje primjera u knjizi upotrebljava Visual Studio 2005. Primjeri se, međutim, mogu prevoditi i s pomoću C# prevoditelja za odzivnik (csc.exe) koji se isporučuje uz NET Framework.

Predgovor

| ix

Za neke je primjere potrebna pokusna baza podataka AdventureWorks koja se dobija uz SQL Server 2005, ali se ne instalira automatski. Pratite dokumentaciju za instaliranje baze podataka AdventureWorks zajedno sa SQL Serverom 2005 ili za dodavanje postojećoj instalaciji. Drugim primjerima u knjizi potrebna je baza podataka ProgrammingSqlServer2005 koju trebate izraditi – ova se nova baza podataka koristi za minimiziranje utjecaja primjera na instalaciju baze podataka AdventureWorks.

Pravila označavanja korištena u ovoj knjizi U knjizi se koriste sljedeća pravila označavanja: Običan tekst Označava imena izbornika, opcije izbornika, gumbe izbornika te prečace na tipkovnici (kao što su Alt i Ctrl). Kurziv Označava nove termine, URL adresee, adrese elektroničke pošte, imena datoteka, nastavke imena datoteka, nazive putanja, mape te pomoćne Unix programe. Pismo konstantne širine

Označava naredbe, opcije, prekidače, varijable, atribute, ključeve, funkcije, tipove, klase, imenske prostore, metode, module, svojstva, parametre, vrijednosti, objekte, događaje, metode za obradu događaja, XML oznake, HTML oznake, makroe, baze podataka, sadržaj datoteka te rezultate naredbi. Pismo konstantne širine u kurzivu

Označava tekst koji korisnik treba zamijeniti svojim vrijednostima. Kod

Označava izvorni kod – C# ili T-SQL. Obratite pozornost na napomene koje su od glavnog teksta odvojene sljedećim sličicama: Ova sličica označava savjet, prijedlog ili napomenu.

Ova sličica označava upozorenje ili poziv na oprez.

x | Predgovor

Zahvale Ovu knjiga ne bih mogao objaviti bez pomoći mnogih ljudi. Želim zahvaliti izdavačima Jeffu Pepperu, Ralphu Davisu i Jonathanu Gennicku što su mi pomogli da je poboljšam. Zahvaljujem recenzentima Louisu Davidsonu, Vyasu Kondreddiju, Deacu Lancasteru, Alexu Limu i Joshu Sackettu za pružanje vrijednih savjeta. Proizvodnoj ekipi – Adamu Witweru, Nancy Kotari i Billu McManusu – zahvaljujem na prijelomu rukopisa. Također želim zahvaliti Janu Shanahanu iz Microsofta za pravovremeno i strpljivo odgovaranje na sva moja pitanja tijekom razvoja SQL Servera 2005. Naravno, ova knjiga ne bi postojala da Microsoftov tim nije razvio SQL Server 2005 – dečki, napravili ste dobar komad softvera. Konačno, zahvaljujem Molly, svojim prijateljima i obitelji – vi ste mi najvažniji.

xi

POGLAVLJE 1

Uvod

Microsoft SQL Server 2005 je najnoviji Microsoftov poslužitelj relacijskih baza podataka i nadogradnja je Microsoft SQL Servera 2000. SQL Server 2005 dodaje nove funkcionalnosti i popravlja performanse, pouzdanost, mogućnost programiranja te upotrebljivost sustava SQL Server 2000. Knjiga opisuje i pokazuje kako programirati SQL Server 2005. Općenito pokriva cjelokupnu tematiku s obzirom da je većina aspekata programiranja SQL Servera 2005 nova. Primjeri uključuju primjenu Common Language Runtime (CLR) sklopova za izradu SQL Server objekata, kao što su pohranjene procedure i okidači, te upotrebu SMO (SQL Server Management Objects) objekata za programsku izradu, modificiranje, brisanje i upravljanje bazama podataka, tablicama te drugim SQL Server objektima. U slučaju Transact-SQL-a (T-SQL) i ADO.NET-a 2.0, opisana su i demonstrirana samo poboljšanja. Usluga SQL Server Analysis Services (SSAS) pruža široki uvod u SSAS koji bi vam morao biti od pomoći za razumijevanje što je SSAS, koji su mu ključni dijelovi i kako početi sa SSAS programiranjem – tematika je jednostavno preširoka da bi se u ovoj knjizi moglo učiniti više od toga. Iz programerske perspektive nova svojstva SQL Servera 2005 uključuju sljedeće: Alati i pomoćni programi Novi IDE nazvan SQL Server Management Studio za upravljanje SQL Server topologijama, bazama podataka i objektima te kolekcija novih alata za konfiguriranje, profiliranje i razvijanje SQL Server 2005 rješenja. Tipovi podataka Podrška za spremanje izvornih XML podataka i rad s njima te podrška za velike binarne podatke. T-SQL poboljšanja Nova podrška za okidače, Data Definition Language (DDL), označavanje događaja, skupne operacije, rekurzivne upite i distribuirane upite te uvođenje novih operatora.

1

Poboljšanja programskih mogućnosti Nova podrška za razvijanje objekata baze podataka kao što su pohranjene procedure, okidači te korisnički definirane funkcije s pomoću .NET programskih jezika. SQL Native Client (SQLNCLI) kombinira i nadomješta izvorni OLE DB pružatelj za SQL Server te ODBC pružatelj sa samostojećim API-jem. SQLXML 4.0 poboljšava SQLXML 3.0 i donosi podršku za nove mogućnosti rada s XML podacima te SQLNCLI. XML podrška Podrška za xml tipove podataka koja se upotrebljavaju za spremanje izvornih XML fragmenata i dokumenata te za manipulaciju instancama xml tipova podataka s pomoću jezika XML Query Language (XQuery) i XML Data Manipulation Language (DML). Izvorne XML Web usluge Nova podrška omogućava da SQL Server prihvaća SOAP zahtjeve tako da možete izvoditi upite bez aplikacijskog poslužitelja srednjeg sloja kao što je Internet Information Server (IIS). SQL Management Objects (SMO) Proširuje i nadilazi DMO (Distributed Management Objects) objekte za konfiguriranje svih aspekata SQL Server instanci i rad s njima. SQL Server Integration Services (SSIS) Nova tehnologija za izgradnju rješenja integracije podataka i praćenja toka podataka. SSIS nadomješta Data Transformation Services (DTS) koji je uveden sa SQL Serverom 2000. SQL Server Reporting Services (SSRS) Tehnologija za izvještavanje smještena na poslužitelju koja podržava stvaranje i distribuciju izvještaja te upravljanje i pristup njima. SSRS je uveden u SQL Server u2000 i značajno je poboljšan u SQL Serveru 2005. SQL Server Notification Services Nova ugrađena tehnologija za razvoj aplikacija koje prave i šalju poruke pretplatnicima prema rasporedu ili kao odgovor na događaje. SQL Server Service Broker Nova tehnologija za razvoj skalabilnih, labavo povezanih, distribuiranih aplikacija s komunikacijom temeljenom na porukama. Replication Management Objects (RMO) Proširuje i nadilazi DMO sposobnosti replikacije za konfiguriranje svih aspekata SQL Server replikacije i rad s njima. SQL Server Agent Automatizira administrativne zadatke tako što izvodi poslove, nadgleda SQL Server te obrađuje uzbune. SQL Server 2005 uvodi nove SMO klase za izradu SQL Server agenta i rad s njim. 2 | Programiranje SQL Server 2005

SQL Server Mobile Edition Pruža funkcionalnost relacijske baze podataka za mobilne uređaje u kompaktnom obliku s programskim modelom koji je u skladu sa SQL Serverom 2005. Nadogradnja inačice SQL Server 2000 Windows CE Edition 2.0.

Sadržaj knjige Knjiga je organizirana u 20 poglavlja (plus ovaj uvod te dodatak) koja se usredotočuju na tematiku programiranja u sustavu SQL Server 2005. U nekim slučajevima se za obradu različitih aspekata jedne teme koristi više poglavlja. Svako poglavlje sadrži primjere koda koji pokazuju kako programirati SQL Server 2005. Primjeri koda napisani su u jeziku C# i prevedeni u razvojnom okolišu Visual Studija 2005. Kako biste dobili uvid u sadržaj knjige, sljedeći popis daje sažetak svakog poglavlja: Poglavlje 2, Alati i pomoćni programi Ovo poglavlje pruža pregled novih i poboljšanih alata i pomoćnih programa za odzivnik u SQL Serveru 2005. Ono opisuje: • SQL Server Management Studio, novi IDE za rad sa SQL Server 2005 objektima. • SQL Server Configuration Manager za rad sa SQL Server 2005 uslugama. • SQL Server Surface Area Configuration Manager za upravljanje raspoloživim svojstvima, uslugama te mogućnostima daljinskog pristupa SQL Server 2005 instance. • Database Engine Tuning Advisor koji se upotrebljava za poboljšavanje obrade upita bez potrebe za detaljnim razumijevanjem strukture baze podataka ili kako se obrada upita u stvari odvija. • SQL Server Profiler koji se upotrebljava za praćenje obrade upita u svrhu ispitivanja, uklanjana pogrešaka te konfiguriranja. • SQL Server Business Intelligence Development Studio za razvoj SQL Server 2005 rješenja –analitičkih, integracijskih i obavještajnih usluga – s IDE-om koji je sličan onome u Visual Studiju 2005. • Visual Studio .NET 2005 koji se upotrebljava za razvoj CLR programa i rješenja za programsko upravljanje SQL Serverom 2005. • Nove pomoćne programe za odzivnik uključene u SQL Server 2005. Poglavlje 3, T-SQL poboljšanja Ovo poglavlje opisuje nove SQL Server 2005 tipove podataka koji obrađuju XML i velike binarne podatke, poboljšanja programskog jezika T-SQL, nove DDL okidače i nove kataloške poglede koji nadomještaju informacijske poglede u sustavu SQL Server 2005 kao mehanizam za pristup metapodacima o SQL Server objektima.

Poglavlje 1: Uvod | 3

Poglavlje 4, Uvod u integraciju Common Language Runtime izvedbene okoline (CLR) SQL Server 2005 ugošćuje CLR za .NET Framework u Database Engineu. Takav raspored omogućava izradu objekata baze podataka, kao što su pohranjene procedure, funkcije i okidači, u programskim jezicima koje CLR podržava. Više niste ograničeni na izrađivanje ovih objekata u T-SQL-u. Ovo poglavlje vas uvodi u programiranje CLR rutina ta njihovo ispitivanje, uklanjanje pogrešaka, instaliranje i osiguravanje. Poglavlje 5, Programiranje SQL Server CLR rutina Ovo poglavlje pokazuje kako programirati različite tipove CLR rutina – funkcije sa skalarnim vrijednostima, funkcije s tabličnim vrijednostima, pohranjene procedure, korisnički definirane agregatne funkcije i tipove podataka te DML i DDL okidače. Poglavlje 6, .NET klijentsko programiranje SQL Server 2005 uvodi SQL Native Client (SQLNCLI) koji zamjenjuje OLE DB pružatelj za SQL Server i ODBC pružatelj sa samostalnim API-jem koji njihove funkcionalnosti kombinira u jedan DLL. SQL Server 2005 uvodi i SQLXML 4.0 koji pruža klijentsku funkcionalnost za razvijanje aplikacija koje pristupaju XML podacima iz SQL Servera, obrađuju podatke i vraćaju ih natrag poslužitelju. SQLXML 4.0 poboljšava funkcionalnost SQLXML 3.0 uz podršku za nove funkcionalnosti XML i Web usluga. Ovo poglavlje opisuje SQLNCLI i SQLXML 4.0 programiranje. Poglavlje 7, XML podaci SQL Server 2005 uvodi izvornu podršku za spremanje i obradu XML podataka. Najznačajnije, novi xml tip podataka sprema tipizirane (koji imaju XML shemu) i netipizirane XML fragmente i dokumente. Instancama xml tipa podataka može se manipulirati koristeći XQuery ili XML DML. SQL Server omogućava preslikavanje relacijskih podataka u XML podatke, čime se olakšava rad s mješavinom tipova podataka. Ovo poglavlje razmatra programsku izradu i manipulaciju instancama xml tipa podataka te preslikavanje XML podataka u relacijske podatke. Poglavlje 8, Izvorne XML Web usluge SQL Server 2005 podržava izvorne Web usluge tako da SOAP poruke možete slati izravno u SQL Server 2005 za izvođenje T-SQL naredbi, pohranjenih procedura te korisnički definiranih funkcija sa skalarnim vrijednostima. Ovo poglavlje pokazuje kako izraditi HTTP krajnje točke, izlagati metode Web usluga, raditi sa SOAP zahtjevima i odgovorima, raditi sa SOAP sesijama te pratiti SOAP zahtjeve kako bi se kontrolirale performanse. Poglavlje 9, SQL Server Management Objects (SMO) SQL Server 2005 uvodi SMO (SQL Management Object) – kolekciju imenskih prostora koja se koristi za programsko upravljanje svim aspektima SQL Servera 2005. SMO nadilazi funkcionalnosti SQL DMO za upravljanje bazom podataka koja se upotrebljava za upravljanje sustavom SQL Server 2000. Ovo poglavlje opisuje SMO objektni model i pokazuje kako izraditi jednostavnu SMO aplikaciju.

4 | Programiranje SQL Server 2005

Poglavlje 10, Klase instanci za SQL Server Management Objects (SMO), Dio 1 SMO sadrži hijerarhiju klasa koja odgovara hijerarhiji baza podataka u SQL Serveru. Ovo poglavlje opisuje SMO klase za rad s objektima baze podataka koji spremaju podatke i pristupaju im, kao što su tablice, indeksi, okidači te pohranjene procedure. Također pokazuje kako programski upotrebljavati SMO klase za upravljanje ovim objektima. Pokazuje i kako se može pretplatiti na SMO događaje te kako postupati s iznimkama. Poglavlje 11, Klase instanci SQL Server Management Objects (SMO), Dio 2 SMO sadrži klase za upravljanje objektima baze podataka koje ne spremaju podatke niti im pristupaju, kao što su podatkovne i dnevničke datoteke, korisnički računi, uloge te .NET Framework sklopovi. Ovo poglavlje opisuje kako programski upotrebljavati ove klase. Poglavlje 12, Klase pomoćnih programa za SQL Server Management Objects SMO klase pomoćnih programa upotrebljavaju se za izvođenje zadataka koji su neovisni od instance SQL Servera. Ove klase uključuju klase za pisanje skripti, izradu rezervnih kopija i obnavljanje podataka, transfer, poštu i praćenje. Poglavlje pokazuje kako programski upotrebljavati ove klase. Poglavlje 13, Windows Management Instrumentation (WMI) programiranje WMI se može upotrebljavati za upravljanje uslugama SQL Servera, postavkama mreže te postavkama sinonima poslužitelja. Ovo poglavlje opisuje klase koje se koriste za pristup i programiranje WMI. Poglavlje 14, SQL Server Reporting Services (SSRS) SSRS pruža izvedbenu okolinu za izvještavanje koja se izvodi povrh IIS-a. Izvještaje možete graditi iz bilo kojeg izvora podataka – relacijskog, multidimenzionalnog ili XML – kojem se može pristupiti s pomoću .NET upravljanog pružatelja, OLE DB pružatelja ili ODBC pružatelja. Izvještajima se može pristupati kroz parametrizirani URL ili primjenom kontrole za pregled izvještaja u Windows Forms ili Web Forms aplikaciji. Poglavlje pokazuje kako graditi, konfigurirati i ugrađivati izvještaje u aplikacije. Poglavlje 15, SQL Server Integration Services (SSIS) SSIS je platforma za izgradnju rješenja integracije podataka i praćenja toka podataka u kojoj možete spajati podatke iz različitih izvora podataka, popunjavati skladišta podataka, standardizirati podatke te provoditi administrativne operacije kao što arhiviranje, učitavanje te kopiranje podataka. Poglavlje pruža pregled SSIS-a te pokazuje programiranje s pomoću SSIS upravljanog koda. Poglavlje 16, SQL Server Agent SQL Server Agent automatizira administrativne zadatke tako što izvodi poslove, nadgleda SQL Server te obrađuje uzbune. SMO sadrži klase koje se upotrebljavaju za upravljanje svim aspektima SQL Server Agenta. Ovo poglavlje opisuje SQL Server Agenta i SMO hijerarhiju klasa za SQL Server Agenta te pokazuje kako programski stvarati i koristiti objekte SQL Server Agenta. Poglavlje 1: Uvod | 5

Poglavlje 17, Service Broker Service Broker je tehnologija koja pomaže u gradnji skalabilnih, labavo povezanih aplikacija za baze podataka. Service Broker pruža komunikacijsku platformu temeljenu na porukama koja se upotrebljava za integriranje neovisnih aplikacija i komponenata. SMO sadrži klase koje se upotrebljavaju za upravljanje svim aspektima Service Brokera. Ovo poglavlje opisuje Service Broker i za njega potrebnu SMO hijerarhiju klasa te pokazuje kako programski izraditi i primijeniti Service Broker uslugu. Poglavlje 18, Notification Services Notification Services je programski kostur za izradu aplikacija koji generira i šalje poruke pretplatnicima na nizu različitih uređaja, ili prema rasporedu ili kao odgovor na događaje. Notification Services integriran je u SQL Server 2005 umjesto da se distribuira kao komponenta za preuzimanje, kao što je bio slučaj sa SQL Serverom 2000. SMO sadrži klase koje se upotrebljavaju za upravljanje svim aspektima Notification Services. Poglavlje opisuje Notification Services i SMO hijerarhiju klasa za njih te pokazuje kako programski izraditi Notification Services objekte te ih koristiti. Poglavlje 19, Replikacija Replikacija kopira i distribuira podatke i objekte među bazama podataka te pruža mehanizam koji podatke održava sinkroniziranima. SQL Server 2005 uvodi SQL Server Replication Management Objects (RMO), kolekciju imenskih prostora koja se upotrebljava za programiranje svih aspekata SQL Server 2005 replikacije. RMO nadomješta mogućnosti upravljanja replikacijom koje ima SQL DMO, korišten za upravljanje replikacijom u SQL Serveru 2000. Ovo poglavlje opisuje RMO objektni model i pokazuje kako programirati replikaciju primjenom RMO klasa. Poglavlje 20, SQL Server Analysis Services (SSAS) SSAS pruža “online” funkcionalnost za analitičku obradu (OLAP) i pronalaženje podataka s pomoću kombinacije klijentskih i poslužiteljskih komponenata. Ovo poglavlje opisuje SSAS, pokazuje kako programski postavljati upite za podatke i metapodatke te objašnjava kako programski upravljati SSAS instancama i objektima. Poglavlje 21, SQL Server Mobile Edition SQL Server Mobile Edition omogućava korištenje relacijske baze podataka na mobilnim uređajima tako što pruža funkcionalnosti relacijske baze podataka u kompaktnom obliku s programskim modelom koji je u skladu s SQL Serverom 2005. SQL Server Mobile je osuvremenjeni SQL Server Windows CE. Ovo poglavlje opisuje SQL Server Mobile, pokazuje kako stvarati i koristiti baze podataka i objekte baza podataka te objašnjava kako programski čitati, ažurirati i sinkronizirati podatke.

6 | Programiranje SQL Server 2005

Dodatak, ADO.NET 2.0 ADO.NET 2.0 je kolekcija klasa koja omogućava .NET aplikacijama da konzistentno pristupaju podacima spremljenim u raznim izvorima podataka. ADO. NET se upotrebljava za uzimanje, obradu i ažuriranje podataka spremljenih u podržanim izvorima podataka koji uključuju SQL Server, Oracle te izvore podataka izložene kroz OLE DB. ADO.NET 2.0 je poboljšani ADO.NET kojeg je uveo Visual Studio .NET 2002. Ovaj dodatak opisuje novu funkcionalnost, podršku i značajke ADO.NET-a 2.0.

Što nećete pronaći u knjizi Ova knjiga nije referentni priručnik, iako je nešto referentnog materijala uključeno tamo gdje pomaže u objašnjavanju koncepata. Detaljne referentne informacije raspoložive su u sustavu Microsoft SQL Server 2005 Books Online, koji se podrazumijevano instalira sa SQL Serverom 2005, a pristupa mu se odabiranjem opcije Start ➝ All Programs ➝ Microsoft SQL Server 2005 ➝ Documentation and Tutorials ➝ SQL Server Books Online. Knjiga također ne obrađuje SQL Server 2005 administraciju ni prijelaz sa sustava SQL Server 2000 na SQL Server 2005.

Poglavlje 1: Uvod | 7

POGLAVLJE 2

Alati i pomoćni programi

SQL Server 2005 uvodi nove i poboljšane alate te pomoćne programe za odzivnik. Ovo poglavlje pruža pregled tih alata i pomoćnih programa. Usredotočuje se na nova svojstva i poboljšanja te na informacije koje su najrelevantnije za programiranje i programsku administraciju SQL Servera. Za detaljne informacije o ovim alatima i pomoćnim programima pogledajte Microsoft SQL Server 2005 Books Online.

SQL Server Management Studio SQL Server Management Studio je integrirana okolina za pristupanje, konfiguriranje, upravljanje i administraciju SQL Servera te za razvoj SQL Server objekata. Management Studio radi sa svim SQL Server komponentama, što uključuje Report Services, Data Transformation Services, SQL Server Mobile te Notification Services. SQL Server Management Studio udružuje svojstva Enterprise Managera, Query Analyzera i Analysis Managera iz SQL Servera 2000 te dodaje novu funkcionalnost.

Pokrenite SQL Server Management Studio odabirom opcije Start ➝ All Programs ➝ Microsoft SQL Server 2005 ➝ SQL Server Management Studio. Otvara se dijaloški okvir Connect to Server gdje se traže podaci o poslužitelju i vjerodajnice. Upišite tražene podatke i pritisnite Connect. Slika 2-1 prikazuje SQL Server Management Studio. SQL Server Management Studio podrazumijevano prikazuje dvije kartice: • Object Explorer • Document (na početku samo Summary Page) Ovi i drugi prozori mogu se dodati s pomoću izbornika View. Različiti su prozori opisani u sljedećim odjeljcima.

8

Slika 2-1. SQL Server Management Studio

Registered Servers Prozor Registered Servers navodi poslužitelje koje ste prethodno registrirali, opcionalno organizirane u grupe poslužitelja – hijerarhijsku strukturu koja se koristi pri upravljanju registriranim poslužiteljima. Registrirani poslužitelj čuva informacije o povezivanju i omogućava da jednostavno ustanovite rade li poslužitelji, pristupite Object Exploreru i Query Editoru za poslužitelje te korisnicima pruža prikladnija imena zajedno s detaljnim opisom poslužitelja. Alatna vrpca ispod glavnog izbornika omogućava prebacivanje između pet tipova registriranih poslužitelja kojima se može upravljati (navedeni slijeva nadesno): Database Engine Sprema, obrađuje i osigurava podatke. Analysis Services Funkcionalnost za online analitičku obradu podataka (Online Analytical Processing, OLAP) te pronalaženje podataka. Reporting Services Izvještaji pripremljeni za Web koji se povezuju s nizom izvora podataka i sadržaja, objavljuju rezultate u različitim formatima ta upravljaju sigurnošću i pretplatama. SQL Server Mobile Funkcionalnost relacijske baze podataka postavljena u kompaktnom obliku prikladnom za mobilne uređaje s programskim modelom koji je u skladu sa SQL Serverom 2005. Poglavlje 2: Alati i pomoćni programi | 9

Integration Services Paketi koji izdvajaju, transformiraju i učitavaju podatke za rješenja integracije i skladištenje podataka. Tip registiranog poslužitelja možete mijenjati s pomoću opcije izbornika View ➝ Registered Server Types. Kontekstni izbornik stavke Registered Servers sadrži opcije opisane u tablici 2-1. Tablica 2-1. Opcije kontekstnog izbornika Registered Server Opcija izbornika

Opis

Connect

Dodaje odabrani poslužitelj u prozor Object Explorer.

Start

Pokreće odabranu instancu SQL Servera.

Stop

Zaustavlja odabranu instancu SQL Servera.

Pause

Postavlja odabranu instancu SQL Servera u stanje pauze. Pauzirana instanca omogućava priključenim korisnicima da završe zadatke ali ne dozvoljava nova priključivanja.

Resume

Nastavlja rad pauzirane SQL Server instance.

Restart

Ponovno pokreće odabranu SQL Server instancu.

Start/Stop Service and Change Accounts

Omogućava konfiguriranje SQL Server usluge.

SQL Server Configuration Manager

Otvara SQL Server Configuration Manager (opisan kasnije u ovom poglavlju).

New

Omogućava izradu nove skupine poslužitelja ili registraciju poslužitelja.

Edit

Omogućava konfiguraciju skupine poslužitelja ili registriranog poslužitelja.

Update Local Server Registration

Automatski registrira sve instance lokalnog poslužitelja.

Move To

Preseljava registrirani poslužitelj u drugu skupinu poslužitelja.

Delete

Uklanja registrirani poslužitelj.

Import

Uvozi prethodno iznesenu informacijsku datoteku poslužitelja.

Export

Izvozi registrirani poslužitelj u datoteku za pojedinačni poslužitelj ili skupinu poslužitelja.

Previously Registered Servers

Uvozi poslužitelje koje je registrirao SQL Server 2000.

Object Explorer Object Explorer spaja se s instancama Database Engine, Analysis Services, Integration Services, Reporting Services i SQL Server Mobile. Organizira sve objekte na instanci baze podataka u stablastu hijerarhiju i omogućava da radite s njima. Object Explorer podrazumijevano je vidljiv. Ako nije vidljiv, treba odabrati opciju izbornika View ➝ Object Explorer. Alatna vrpca na vrhu prozora Object Explorer ima pet gumba (slijeva nadesno): Connect Priključuje instancu poslužitelja na Object Explorer. Pritisnite gumb Connect i odaberite tip poslužitelja s pomoćnog izbornika. Otvara se dijaloški okvir Connect to Server i traži podatke o poslužitelju i vjerodajnice. Upišite traženu informaciju i 10 | Programiranje SQL Server 2005

pritisnite Connect u dijaloškom okviru. Alternativno možete desnom tipkom miša pritisnuti ime poslužitelja u prozoru Registered Servers i odabrati Connect ➝ Object Explorer iz kontekstnog izbornika. Također možete dvaput pritisnuti instancu poslužitelja u prozoru Registered Servers kako biste je priključili na Object Browser. Disconnect Prekida vezu instance poslužitelja s Object Explorerom. Odaberite instancu poslužitelja koju treba isključiti te pritisnite gumb Disconnect. Stop Zaustavlja tekuću aktivnost Object Explorera. Refresh Obnavlja čvor stabla. Alternativno možete desnom tipkom miša pritisnuti čvor i odabrati Refresh iz kontekstnog izbornika, ili odabrati View ➝ Refresh iz SQL Server Management Studio izbornika. Stavke Object Explorera ne obnavljaju se automatski kako bi se poboljšale performanse i očuvali resursi sustava. Filter Vraća podskup stavki iz mape. Kada se pritisne gumb Filter, otvara se dijalog Object Explorer Filter Settings, kao što je prikazano na slici 2-2. Gumb Filter je dostupan samo kada je čvor tipa objekta (mapa) odabran u Object Exploreru – gumb nije dostupan kada je odabran specifičan objekt, kao što je instanca poslužitelja, baza podataka ili tablica.

Slika 2-2. Dijaloški okvir Object Explorer Filter

Poglavlje 2: Alati i pomoćni programi | 11

Dijaloški okvir na slici 2-2 prikazuje se kada odaberete čvor Tables u bazi podataka AdventureWorks i pritisnete gumb Filter. Ako Schema postavite na HumanResources u kriterijima filtera ograničavaju se tablice prikazane u čvoru Tables u bazi podataka AdventureWorks na one iz sheme HumanResources, kao što je prikazano na slici 2-3.

Slika 2-3. Filtrirani čvor Tables

Riječ „filtered“ prikazana je u zagradama kako bi naznačilo da je to filtrirani popis tablica. Osim toga, kada se filtrira čvor Tables, gumb Filter na alatnoj vrpci Object Explorer više nije pritisnut. Za uklanjanje filtra treba pritisnuti gumb Filter i zatim Clear Filter u dijaloškom okviru Object Explorer Filter Settings. Također se može desnom tipkom miša pritisnuti filtrirani čvor i odabrati Filter ➝ Remove Filter s kontekstnog izbornika. U određenom trenutku može se odabrati samo jedna stavka u stablastom prikazu Object Explorera. SummaryPage omogućava odabiranje više stavki istovremeno i izvođenje akcija nad odabranom skupinom. SummaryPage se otvara odabirom opcije View ➝ Summary u glavnom izborniku Management Studija ili pritiskom na gumb Summary na alatnoj vrpci Standard. Objekti sustava u Object Exploreru mogu se sakriti odabirom opcije Tools ➝ Options u izborniku Management Studio, zatim odabirom Environment ➝ General u stablu na lijevoj kartici dijaloškog okvira Options te potvrđivanjem polja Hide System Objectsu Object Exploreru. SQL Server Management Studio se mora ponovno pokrenuti kako bi ove promjene djelovale. Sljedeći odjeljci opisuju tipove čvorova u Object Exploreru i aktivnosti koje se u svakom tipu čvora mogu provoditi.

Instanca poslužitelja baze podataka Instanca poslužitelja baze podataka predstavlja instalaciju SQL Servera. Kontekstni izbornik za instancu poslužitelja baze podataka omogućava povezivanje s poslužiteljem i prekidanje veze s njim, registriranje novog poslužitelja, izrađivanje upita, upravljanje SQL Server uslugom za instancu, obnavljanje stablaste hijerarhije te upravljanje svojstvima poslužitelja. 12 | Programiranje SQL Server 2005

Čvor Databases Čvor Databases sadrži sistemske podatke, snimke baze podataka te baze podataka korisnika. Snimke baze podataka novost su u SQL Serveru 2005, a omogućavaju statički prikaz baze podataka samo za čitanje. Snimka se izrađuje s pomoću T-SQL naredbe CREATE DATABASE uz klauzulu AS SNAPSHOT. Slika 2-4 prikazuje hijerarhiju objekata pod čvorom Databases. Iz čvora Databases možete izraditi novu bazu podataka, pridružiti bazu podataka odabirom njenih datoteka ili restaurirati bazu podataka, datoteku ili skupinu datoteka. Upit se može izraditi iz imenovanog čvora baze podataka. To se postiže pritiskom na desnu tipku miša te odabirom New Query s kontekstnog izbornika, čime se pokreće QueryEditor. Query Editor otvara okno za pisanje koda u koje možete unositi T-SQL naredbe. Nakon izvođenja naredbe odabirom opcije Query ➝ Execute s glavnog izbornika, pritiskom na desnu tipku miša u oknu s kodom QueryEditora i odaberom Execute s kontekstnog izbornika ili pritiskom na tipku F5, prikazat će se dvije nove kartice: Results Prikazuje rezultat upita. Messages Prikazuje poruke s obavijestima i pogreškama. Query Editor prikazan je na slici 2-5. QueryDesigner je vizualni alat koji omogućava oblikovanje DML naredbi SELECT, INSERT, UPDATE i DELETE. Nakon što se otvori Query Editor, može se iz izbornika SQL Server Management Studija pokrenuti Query Designer odabirom opcije Query ➝ Design Query in Editor ili pritiskom na desnu tipku miša u oknu s kodom QueryEditora te odabirom Design Query in Editor s kontekstnog izbornika. Prikazuje se dijaloški okvir Add Table, što omogućava odabir tablica za upit. Tablice se mogu dodavati ili uklanjati za vrijeme oblikovanja upita. Nakon pritiska na gumb Close, Query Designer prikazuje tri okna – sa dijagramom, kriterijem i SQL kodom – kao što je prikazano na slici 2-6. Upit se može stvarati istovremenom upotrebom tri okna. Pritisnite desnu tipku miša u području dijagrama (gornje okno) kako bi se otvorio kontekstni izbornik koji omogućava mijenjanje tipa upita, dodavanje tablica te promjenu načina grupiranja rezultata. Relacije se izrađuju automatski ako već postoje u bazi podataka. Također se može prevući jedan ili više stupaca iz jedne tablice na drugu kako bi se izradile relacije između tablica. Stupci koji će se prikazati u upitu biraju se s pomoću polja za potvrdu pored imena stupaca. Kada je završena izrada upita pritisnite OK kako bi se generirani T-SQL upit prebacio u Query Editor gdje se može izvesti. Odaberite T-SQL kod u QueryEditoru, otvorite Query Designer i odabrani T-SQL će automatski biti parsiran u dijagram.

Poglavlje 2: Alati i pomoćni programi | 13

Slika 2-4. Hijerarhija čvora Databases u Object Exploreru

14 | Programiranje SQL Server 2005

Slika 2-5. Query Editor

Slika 2-6. Query Designer

Dijagrami baze podataka mogu se izraditi iz čvora Database Diagrams (slika 2-4). Odabirom New Database Diagram iz kontekstnog izbornika pokreće se Database Diagram Designer, vizualni alat koji omogućava izradu, uređivanje i brisanje tablica, stupaca, indeksa, ograničenja i relacija. Automatski se može izraditi jedan ili više dijagrama iz Poglavlje 2: Alati i pomoćni programi | 15

postojeće baze podataka – SQL Server održava dijagrame usklađene s bazom podataka. Slika 2-7 prikazuje dio dijagrama za bazu podataka AdventureWorks. Ako prvi put pravite dijagram u bazi podataka, pojavit će se poruka „This database does not have one or more of the support objects required to use database diagramming. Do you wish to create them?“ („Ova baza podataka nema jedan ili više objekata za potporu koji su potrebni kako bi se moglo koristiti stvaranje dijagrama baze podataka. Želite li ih izraditi?“) Pritisnite Yes kako biste izradili dijagrame baze podataka.

Slika 2-7. Database Diagram Designer

Table Designer može se također upotrijebiti kako bi se izradila nova tablica ili uredila postojeća. U kontekstnom izborniku Table odaberite Select New Table za izradu nove ili Modify za uređivanje postojeće tablice. Table Designer ima dva okna. Gornje okno je tablica u kojoj svaki red opisuje stupac u tablici. Donje okno prikazuje dodatna svojstva stupca koji je odabran u gornjoj tablici. Slika 2-8 prikazuje Table Designer za tablicu Person.Contact u bazi podataka AdventureWorks. Table Designer se može upotrijebiti za modificiranje indeksa, ograničenja i relacija odabirom odgovarajuće opcije s kontekstnog izbornika. 16 | Programiranje SQL Server 2005

Slika 2-8. Table Designer Poglavlje 2: Alati i pomoćni programi | 17

Podaci u tablici se mogu pogledati i izmijeniti odabirom opcije Open Table s kontekstnog izbornika tablice. Time se otvara mreža za podatke za tablicu. Slika 2-9 prikazuje mrežu za podatke za tablicu Person.Contact u bazi podataka AdventureWorks.

Slika 2-9. Pregled i uređivanje podataka tablice

Drugi čvorovi u Databases hijerarhiji omogućavaju izradu, upravljanje i uklanjanje objekata unutar čvora kao i provođenje drugih zadataka specifičnih za objekt.

Čvor Security Čvor Security omogućava upravljanje korisničkim računima, ulogama i vjerodajnicama na poslužitelju. Slika 2-10 prikazuje hijerarhiju objekata pod čvorom Security.

Slika 2-10. Hijerarhija čvora Security

Čvor Server Objects Čvor Server Objects omogućava upravljanje uređajima za izradu rezervnih kopija, završnim točkama, povezanim poslužiteljima te DDL okidačima poslužitelja. Slika 2-11 prikazuje hijerarhiju objekata pod čvorom Server Objects.

18 | Programiranje SQL Server 2005

Slika 2-11. Hijerarhija čvora Server Objects

Čvor Replication Čvor Replication omogućava upravljanje lokalnim publikacijama i pretplatnicima. Slika 2-12 prikazuje hijerarhiju objekata pod čvorom Replication.

Slika 2-12. Hijerarhija čvora Replication

Čvor Management Čvor Management omogućava upravljanje planovima održavanja, dnevnicima poslužitelja, poštom Database Mail, Distributed Transaction Coordinatorom, Full-Text Searchom te starijim objektima. Također omogućava pristup ActivityMonitoru koji pruža informacije o procesima i lokotima. Slika 2-13 prikazuje hijerahiju objekata pod čvorom Management.

Čvor Notification Services Čvor Notification Services omogućava upravljanje instancama Notification Services.

Čvor SQL Server Agent Čvor SQL Server Agent omogućava upravljanje poslovima, upozorenjima, operatorima i posrednicima te pruža pristup dnevnicima pogrešaka SQL Server Agenta i SQL Server Agent Job Activity Monitoru. Slika 2-14 prikazuje hijerarhiju objekata pod čvorom SQL Server Agent. Poglavlje 2: Alati i pomoćni programi | 19

Slika 2-13. Hijerarhija objekata čvora Management

Slika 2-14. Hijerarhija objekata čvora SQL Server Agent

Template Explorer Predlošci za skripte sadrže T-SQL naredbe za izvođenje niza različitih uobičajenih zadataka. Template Explorer otvara se odabirom View ➝ Template Explorer u glavnom izborniku ili pritiskanjem gumba Template Explorer na alatnoj vrpci Standard. Slika 2-15 prikazuje prozor Template Explorer. 20 | Programiranje SQL Server 2005

Slika 2 -15. Template Explorer

Template Explorer upotrebljava stablastu strukturu za organizaciju predložaka u mape. Dno prozora pohranjuje popis nedavno upotrebljavanih predložaka. Alatna vrpca na vrhu Template Explorera ima tri gumba koji omogućavaju odabir predložaka za Database Engine, Analysis Server ili SQL Server Mobile.

Poglavlje 2: Alati i pomoćni programi | 21

Predlošci sadrže parametre kako bi se olakšalo prilagođavanje koda. Definicije parametara slijede format , gdje su vrijednosti: parameter_name

Ime parametra data_type

Tip podataka parametra value

Vrijednost koja se koristi za zamjenu svake instance parametra u skripti Predložak create database (iz mape Database) ima oblik: -- ============================================= -- Create database template -- ============================================= USE master GO -- Uklanja bazu podataka ako već postoji IF EXISTS ( SELECT name FROM sys.databases WHERE name = N'' ) DROP DATABASE GO CREATE DATABASE GO

Ova skripta ima jedan parametar, . Za zamjenu parametra treba u glavnom izborniku odabrati Query ➝ SpecifyValues for Template Parameters ili pritisnuti odgovarajući gumb na alatnoj vrpci SQL Editora. Time se otvara dijaloški okvir Specify Values for Template Parameters, prikazan na slici 2-16.

Slika 2-16. Dijaloški okvir Specify Values for Template Parameters

22 | Programiranje SQL Server 2005

Zamijenite vrijednost parametra Database_Name vrijednošću ProgrammingSqlServer2005 i pritisnite OK. Skripta se ažurira za vrijednost parametra: -- ============================================= -- Create database template -- ============================================= USE master GO -- Uklanja bazu podataka ako već postoji IF EXISTS ( SELECT name FROM sys.databases WHERE name = N'ProgrammingSqlServer2005' ) DROP DATABASE ProgrammingSqlServer2005 GO CREATE DATABASE ProgrammingSqlServer2005 GO

Treba uočiti da, kada se jednom postavi vrijednost parametra, ona je zamijenjena za stalno i ne može joj se više pristupiti. U Template Exploreru možete izraditi i vlastite predloške. Treba slijediti ove korake: 1. Odaberite čvor u kojem želite izraditi predložak. 2. Pritisnite desnu tipku miša u prozoru Template Explorer i odaberite New ➝ Template s kontekstnog izbornika. 3. Unesite ime novog predloška. 4. Desnom tipkom miša pritisnite predložak i odaberite Edit s kontekstnog izbornika (ili dvaput pritisnite predložak). Upišite pottrebne informacije u dijaloškom okviru Connect to Database Engine te pritisnite Connect. 5. Izradite skriptu. Umetnite parametre koristeći sintaksu opisanu ranije. Možete ostaviti prazne vrijednosti za tip podatka i vrijednost (tj. ). 6. Pohranite predložak odabirom File ➝ Save s glavnog izbornika ili pritiskom na gumb Save na alatnoj vrpci Standard.

Solution Explorer Prozor Solution Explorer SQL Server Management Studija omogućava pregled i upotrebu stavki povezanih s projektom skripte. Solution Explorer se otvara odabirom View ➝ Solution Explorer s glavnog izbornika. SQL Server Management Studio omogućava izradu tri tipa projekata – SQL Server Scripts, Analysis Services Scripts i SQL Server Mobile Scripts. Više projekata možete

Poglavlje 2: Alati i pomoćni programi | 23

grupirati u rješenje. Projekt sadrži stavke – informaciju o vezama, upitima, skriptama (skupovi T-SQL naredbi pohranjeni u datoteku) te raznorazne datoteke relevantne za projekt. Solution Explorer omogućava pregled svake stavke u odgovarajućem programu za uređivanje. Prozor svojstava podrazumijevano je smješten ispod prozora Solution Explorer te omogućava pregled svojstava stavke i rad s njima.

SQL Server Configuration Manager SQL Server 2005 se izvodi kao kolekcija usluga – različitih tipova aplikacija koje se izvode u pozadini sustava. SQL Server Configuration Manager je dodatak za Microsoft Management Console (MMC) koja omogućava pokretanje, zaustavljanje, pauziranje, nastavljanje rada, ponovno pokretanje i konfiguriranje usluga, a uključuje: • SQL Server • SQL Server Agent • SQL Server Analysis Services • SQL Server Browser • SQL Server Full-Text Search • SQL Server Integration Services • SQL Server Reporting Services SQL Server Configuration Manager se pokreće odabirom Start ➝ All Programs ➝ Microsoft SQL Server 2005 ➝ Configuration Tools ➝ SQL Server Configuration Manager. Slika 2-17 prikazuje SQL Server Configuration Manager.

Slika 2-17. SQL Server Configuration Manager

Uz upravljanje uslugama, SQL Server Management Studio dodatno omogućava upravljanje poslužiteljskim i klijentskim mrežnim protokolima – protokoli se mogu uključiti i isključiti te se može prisiliti šifriranje protokola – te sinonimima poslužitelja. SQL Server Configuration Manager kombinira funkcionalnosti usluga Server Network Utility, Client Network Utility i Service Manager iz SQL Servera 2000. 24 | Programiranje SQL Server 2005

SQL Server Surface Area Configuration SQL Server Surface Area Configuration omogućava uključivanje, isključivanje, pokretanje i zaustavljanje značajki, usluga i mogućnosti povezivanja na daljinu SQL Server 2005 instalacija, što pomaže u osiguravanju lokalnih i udaljenih sistema. SQL Server Surface Area Configuration Manager se pokreće odabirom opcije Start ➝ All Programs ➝ Microsoft SQL Server ➝ Configuration Tools ➝ SQL Server Surface Area Configuration. Pomoćni program za odzivnik sac.exe uvozi Microsoft SQL Server 2005 postavke tako da ih možete primijeniti na druge instance SQL Servera. Pomoćni program nalazi se u mapi C:\Program Files\Microsoft SQL Server\90\Shared (ako je SQL Server instaliran u podrazumijevanoj mapi).

Database Engine Tuning Advisor Database Engine Tuning Advisor (DTA) poboljšava obradu upita bez potrebe za razumijevanjem strukture baze podataka ili načina na koji SQL Server obrađuje upite. DTA pomaže odabrati i izraditi optimalni skup indeksa, indeksiranih pogleda te particija. On analizira radno opterećenje –skup T-SQL naredbi koje se izvode u bazi podataka – prema implementaciji jedne ili više baza podataka i preporučuje promjene koje smanjuju procijenjeni trošak radnog opterećenja optimizatora upita. Ove modifikacije uključuju dodavanje, brisanje ili promjene klaster indeksa, neklaster indeksa, indeksiranih pogleda te particija. Database Engine Tuning Advisor može se pokrenuti na jedan od tri načina: • Odabirom Start ➝ All Programs ➝ Microsoft SQL Server 2005 Tools ➝ Database Engine Tuning Advisor.



Performance

• Odabirom Tools ➝ Database Engine Tuning Advisor s izbornika SQL Server Management Studio. • Pokretanjem programa dta.exe u odzivniku.

SQL Server Profiler SQL Trace sprema događaje mehanizma baze podataka u realnom vremenu u prateću datoteka. Praćenje (engl. tracing) se temelji na instancama klase događaja koju odlučite nadgledati. Informacije o praćenju koriste se za nadgledanje i procjenu performansi, analiziranje aktivnosti te uklanjanje pogrešaka iz SQL naredbi i pohranjenih procedura. Praćenjem se obično upravlja kroz SQL Server Profiler, grafičko korisničko sučelje za SQL Trace. SQL Server Profiler omogućava konfiguriranje praćenja događaja, izradu predložaka za praćenje te prikazivanje rezultata praćenja. Uz SQL Server Profiler može se nadgledati Poglavlje 2: Alati i pomoćni programi | 25

kako se upiti rješavaju i hvatati SQL Server događaji iz Database Enginea ili Analysis Servicesa u prateću datoteku u svrhu analize. Kasnije se praćeni događaji mogu prikazati kao pomoć pri dijagnosticiranju problema. SQL Server Profiler se pokreće na jedan od ova tri načina: • Odabirom opcije Start ➝ All Programs mance Tools ➝ SQL Server Profiler.



Microsoft SQL Server 2005



Perfor-

• Odabirom Tools ➝ SQL Server Profiler iz SQL Server Management Studija. • Pokretanjem alat profiler90.exe u odzivniku. SQL Server Management Objects (SMO) pruža klase koje se mogu upotrijebiti za upravljanje praćenjem događaja za SQL Server ili Analysis Server. Detaljno su obrađene u poglavlju 12.

SQL Server Business Intelligence Development Studio SQL Server Business Intelligence Development Studio je razvojna okolina – poput Visual Studija 2005 – za razvijanje Analysis Services, Integration Services i Reporting Services projekata. Business Intelligence (BI) Development Studio omogućava razvoj ovih projekata neovisno o poslužitelju te organiziranje skupina projekata u rješenja. BI Development Studio omogućava instaliranje projekata na testne, pozadinske i produkcijske poslužitelje. BI Development Studio funkcionalnost dodaje se u Visual Studio 2005 na računalima na kojima je instaliran Visual Studio 2005.

BI Development Studio pokreće se odabirom opcije Start ➝ All Programs ➝ Microsoft SQL Server ➝ SQL Server Business Intelligence Development Studio. Sastoji se od pet glavnih prozora: Designer Prozor za oblikovanje i stvaranje objekata u projektu. Pruža prikaz koda i projektni prikaz svakog objekta, sukladno njegovom tipu. Solution Explorer Upravlja projektima u rješenju. Properties Prikazuje i modificira svojstva objekta. Toolbox Sadrži kontrole koje su na raspolaganju za objekt. Kontrole su obično na raspolaganju samo u projektnom prikazu.

26 | Programiranje SQL Server 2005

Output Prikazuje izlazne podatke, podatke za uklanjanje pogrešaka te druge obavijesti za vrijeme prevođenja i izvođenja rješenja. Slika 2-18 prikazuje BI Development Studio sa učitanim probnim projektom Analysis Services.

Slika 2-18. Business Intelligence Development Studio s učitanim pokaznim projektom Analysis Services

Visual Studio 2005 SQL Server 2005 ugošćuje .NET Common Language Runtime (CLR) u Database Engineu. Time se omogućava izrada objekata baze podataka kao što su funkcije, pohranjene procedure, okidači, korisnički definirani tipovi podataka i agregatne funkcije u programskim jezicima koje podržava CLR. Visual Studio 2005 podržava integraciju CLR-a u SQL Server kroz novi tip projekta pod nazivom SQL Server Project. Kada se prevedeni sklop za SQL Server projekt registrira u SQL Serveru, objekti baze podataka u sklopu mogu se upotrebljavati na isti način kao da su izrađeni pomoću T-SQL-a. Poglavlja 4 i 5 obrađuju integraciju SQL Servera 2005 i CLR-a te programiranje objekata baze podataka s pomoću Visual Studija 2005.

Poglavlje 2: Alati i pomoćni programi | 27

Novi pomoćni programi za odzivnik SQL Server 2005 uvodi nove pomoćne programe za odzivnik (engl. command prompt) opisane u tablici 2-2. Tablica 2-2. Novi pomoćni programi za odzivnik Pomoćni program

Opis

sqlcmd

Izvodi T-SQL naredbe, sistemske procedure i skripte u odzivniku. Pomoćni program sqlcmd opisan je kasnije u ovom poglavlju.

sqlwb

Pokreće SQL Server Management Studio iz odzivnika.

profiler90

Pokreće SQL Server Profiler iz odzivnika.

dta

Pokreće Database Engine Tuning Advisor iz odzivnika.

dtexec

Koristi se za konfiguriranje i izvođenje SSIS paketa uvezenog iz baze podataka, SSIS spremišta paketa ili datotečnog sustava.

dtutil

Koristi se za potvrđivanje postojanja SSIS paketa pohranjenog u SQL Server msdb bazi podataka, SSIS spremištu paketa ili datotečnom sustavu te njegovu upotrebu.

tablediff

Koristi se za uspoređivanje podataka u dvije tablice kako bi se ustanovilo jesu li konvergentni.

SQL Server alat za odzivnik (program sqlcmd) SQL Server odzivnik omogućava izvođenje T-SQL naredbi, sistemskih procedura i datoteka skripti iz odzivnika. Pomoćni program sqlcmd zamjenjuje pomoćne programe osql i isql. sqlcmd, umjesto ODBC-a ili DB-Library API-ja, za komuniciranje sa SQL Server Database Engineom upotrebljava OLE DB. Regularni naredbeni režim u SQL Server Management Studiju koristi .NET SqlClient pružatelj za izvođenje u regularnom i naredbenom načinu, dok sqlcmd koristi OLE DB pružatelj. Zbog toga se mogu dobiti različiti rezultati prilikom izvođenja istog upita, jer mogu vrijediti različite podrazumijevane opcije.

Sljedeći primjer povezuje podrazumijevanu instancu SQL Servera i izvodi upit u bazi podataka AdventureWorks. Otvorite dijaloški okvir Command Prompt (odabirom Start ➝ All Programs ➝ Accessories ➝ Command Prompt) te zadajte sljedeću naredbu: sqlcmd -q "SELECT TOP 3 ContactID, FirstName, LastName FROM AdventureWorks.Person.Contact"

Izlaz na konzoli prikazan je na slici 2-19. Opcija -q izvodi navedeni upit. Opcija -? vraća informacije o svim opcijama za pomoćni program sqlcmd. Za više detalja o programu sqlcmd i njegovim opcijama pogledajte Microsoft SQL Server 2005 Books Online.

28 | Programiranje SQL Server 2005

Slika 2-19. Primjer sqlcmd

Alternativno, možete pokrenuti program sqlcmd i prethodni upit izvesti u paketnoj obradi zadavanjem sljedeće naredbe: sqlcmd SELECT TOP 3 ContactID, FirstName, LastName FROM AdventureWorks.Person.Contact" GO

Slika 2-20 prikazuje rezultat paketne obrade sqlcmd.

Slika 2-20. Primjer rezultata SqlCmd paketne obrade

Naredbom QUIT ili EXIT izlazi se iz režima paketne obrade programa sqlcmd.

Poglavlje 2: Alati i pomoćni programi | 29

POGLAVLJE 3

T-SQL poboljšanja

SQL Server 2005 proširuje T-SQL jezik na nekoliko načina: • Donosi nove tipove podataka za XML i velike objekte. • Donosi nove i poboljšane sposobnosti jezika, uključujući podršku za rekurzivne upite te poboljšanu obradu pogrešaka. • Uvodi okidače za Data Definition Language (DDL). • Pruža kataloški pogledi za pristup metapodacima. U ovom ću poglavlju obraditi navedena poboljšanja i promjene.

Novi tipovi podataka SQL Server 2005 uvodi xml tip podataka i tipove podataka za velike vrijednosti. Tip podataka xml podržava pohranjivanje XML dokumentata i fragmenata u bazi podataka. Tipovi podataka za velike vrijednosti – varchar(max), nvarchar(max) i varbinary(max) – proširuju kapacitet pohranjivanja tipova podataka varchar, nvarchar i varbinary do 2 31 bajtova.

xml tip podataka Ugrađeni xml tip podataka pohranjuje XML dokumente i fragmente izvorno kao stupac, varijablu, parametar ili povratni tip funkcije. Shema se može povezati sa xml tipom podataka kako bi se potvrdila svaka instanca tipa – XML instanca se onda tipizira (engl. typed). XML instanca bez sheme je netipizirana (engl. untyped). S xml tipovima podataka može se rukovati koristeći XQuery i XML DML, a stupci takvih podataka mogu se indeksirati. Poglavlje 7 pruža detaljan pregled podrške za XML podatke u SQL Serveru 2005.

Tipovi podataka za velike vrijednosti SQL Server 2000 ima varchar, nvarchar i varbinary tipove podataka koji su promjenjive duljine: 30

varchar Podaci promjenjive duljine koji nisu Unicode s najvećom duljinom od 8 000 bajtova. nvarchar Unicode podaci promjenjive duljine s maksimalnom duljinom od 4 000 bajtova. varbinary Binarni podaci promjenjive duljine s maksimalnom duljinom od 8 000 bajtova. SQL Server 2005 uvodi tipove podataka za velike vrijednosti – varchar(max), nvarchar(max) i varbinary(max). Oznaka max upotrebljava se za proširivanje sposobnosti pohranjivanja varchar, nvarchar i varbinary tipova podataka na 231 bajtova u varchar i varbinary tipovima podataka te na 230 bajtova Unicode podataka u nvarchar tipu podataka. U ranijim inačicama SQL Servera ovi su se tipovi navodili kao varchar(n), nvarchar(n) i varbinary(n), gdje je n cijeli broj koji zadaje granicu pohranjivanja u redu za podatke s velikim znakovnim vrijednostima, Unicode i binarne – do 8 000 bajtova za varchar i varbinary te 4 000 bajtova za nvarchar. Ako trebate pohraniti više podataka, trebate upotrijebiti tipove podataka za velike objekte – text, ntext i image – sa smanjenom funkcionalnošću. U SQL Serveru 2005 treba upotrebljavati varchar(max), nvarchar(max) i varbinary(max) umjesto text, ntext i image tipova podataka jer će oni biti izbačeni u sljedećoj inačici SQL Servera.

Tipovi podataka za velike vrijednosti ponašaju se na isti način kao i njihove varijante za manje vrijednosti. Podržane su za naredbu kursora FETCH, za djelomično ažuriranje kroz klauzulu .WRITE, reference after okidača na tablice inserted i deleted te ugrađene funkcije za nizove znakova kao što su LEN i SUBSTR. Tipovi podataka za velike vrijednosti nemaju neka ograničenja koja imaju tipovi za velike objekte – na primjer, mogu se upotrebljavati kao varijable u skupnim naredbama i skriptama. Klauzulu .WRITE treba upotrijebiti u naredbi UPDATE za modificiranje dijela vrijednosti pohranjene u stupcu varchar(max), nvarchar(max) i varbinary(max) u tablici ili pogledu. Sintaksa klauzule .WRITE je sljedeća: .WRITE (expression, @Offset, @Length)

.WRITE zamjenjuje dio vrijednosti u stupcu sa tipom podataka za velike vrijednosti koja počinje na @Offset i proteže se @Length jedinica s vrijednošću expression.

Sljedeći primjer pokazuje .WRITE klauzulu. Prvo treba izraditi tablicu s jednim varchar(max) stupcem te u nju dodati red s pomoću sljedeće naredbe: USE ProgrammingSqlServer2005 CREATE TABLE WriteMethodDemoTable( ID int, varcharMaxCol varchar(max) )

Poglavlje 3: T-SQL poboljšanja | 31

INSERT INTO WriteMethodDemoTable (ID, varcharMaxCol) VALUES (1, 'Imagine this is a very long non-Unicode string.') INSERT INTO WriteMethodDemoTable (ID, varcharMaxCol) VALUES (2, 'Imagine this is another very long non-Unicode string.')

Nakon toga treba postaviti upit u tablicu, izvesti .WRITE klauzulu te ponovno postaviti upit s pomoću sljedeće naredbe: SELECT * FROM WriteMethodDemoTable UPDATE WriteMethodDemoTable SET varcharMaxCol .WRITE('n incredibly', 17, 5) WHERE ID = 1 SELECT * FROM WriteMethodDemoTable

Rezultati su prikazani na slici 3-1.

Slika 3-1. Rezultati primjera WRITE klauzule

Za više informacija o .WRITE klauzuli, pogledajte Microsoft SQL Server 2005 Books Online.

Poboljšanja T-SQL jezika SQL Server 2005 donosi znatna poboljšanja T-SQL jezika: • Poboljšana TOP klauzula podržava upotrebu izraza za zadavanje broja redova ili postotka redova koji su vraćeni u skup rezultata. • Nova TABLESAMPLE klauzula vraća slučajni uzorak redova iz skupa rezultata. • Nova OUTPUT klauzula vraća skup rezultata koji sadrži redove na koje je djelovala naredba INSERT, UPDATE ili DELETE. • Uobičajeni tablični izrazi omogućavaju izradu privremenog imenovanog skupa rezultata iz upita. Time se pojednostavljuje obavljanje zadataka kao što su rekurzivni upiti. • Novi operatori SOME, ANY i ALL uspoređuju vrijednosti u stupcu sa skalarnom vrijednošću. 32 | Programiranje SQL Server 2005

• Novi operator PIVOT rotira tablicu, prevodeći jedinstvene vrijednosti u redovima u stupce u skupu rezultata, dok novi UNPIVOT operator višestruke stupce u skupu rezultata prevodi u redove. • Novi APPLY operator poziva funkciju tablične vrijednosti za svaki red u skupu rezultata. • Nova EXECUTE naredbi.

AS klauzula definira korisnikov kontekst izvođenja T-SQL

• Nove ROW_NUMBER(), DENSE_RANK( ) i NTILE() rangirajuće funkcije dodane su RANK funkciji koja postoji u SQL Serveru 2000. • Nova podrška za strukturiranu obradu iznimaka s pomoću TRY...CATCH blokova. Ovaj odjeljak detaljnije obrađuje navedena poboljšanja.

TOP TOP klauzula ograničava broj redova vraćenih u skupu rezultata. SQL Server 2005 poboljšava TOP klauzulu pa je moguće da se kao argument TOP klauzule koristi izraz umjesto konstante kao što je to bio jedini mogući slučaj u SQL Serveru 2000. TOP klauzula može se koristiti u naredbama SELECT, INSERT, UPDATE i DELETE.

Sintaksa TOP klauzule je: TOP (expression) [PERCENT] [ WITH TIES ]

gdje: expression Zadaje broj ili postotak redova koje treba vratiti u skupu rezultata. Zagrade oko izraza su potrebne ako nije u pitanju konstanta. PERCENT

Zadaje da upit treba vratiti postotak od svih obrađenih redova umjesto određenog broja redova. WITH TIES

Zadaje da dodatni redovi, koji imaju iste vrijednosti stupca ORDER BY klauzule kao i posljednji red skupa rezultata, trebaju biti vraćeni ako postoje, iako uslijed toga broj redova koji se vraćaju postaje veći nego što je zadano izrazom expression. (Ovo će uskoro razjasniti primjer.) Sljedeći upit pokazuje poboljšanu funkcionalnost tako što vraća 10 proizvoda s najvišom cijenom iz tablice Product u AdventureWorks. Za zadavanje broja redova koristi se varijabla. USE AdventureWorks DECLARE @n int; SET @n = 10;

Poglavlje 3: T-SQL poboljšanja | 33

SELECT TOP(@n) ProductID, Name, ProductNumber, ListPrice FROM Production.Product ORDER BY ListPrice DESC

Rezultati su prikazani na slici 3-2.

Slika 3-2. Rezultati iz primjera TOP klauzule

Sljedeći primjer pokazuje efekt WITH TIES klauzule: USE AdventureWorks SELECT TOP(6) WITH TIES ProductID, Name, ProductNumber, ListPrice FROM AdventureWorks.Production.Product ORDER BY ListPrice DESC

Rezultati su prikazani na slici 3-3.

Slika 3-3. Rezultati iz primjera TOP WITH TIES klauzule

34 | Programiranje SQL Server 2005

Iako je u TOP klauzuli zadano šest redova, WITH TIES klauzula uzrokuje da naredba SELECT TOP vrati dodatna tri reda koji imaju istu vrijednost ListPrice kao u zadnjem redu SELECT TOP naredbe bez WITH TIES klauzule.

TABLESAMPLE TABLESAMPLE klauzula vraća slučajan, reprezentativan uzorak tablice. Uzorak je izražen ili kao približan broj redova ili kao postotak ukupnog broja redova. Za razliku od TOP klauzule, TABLESAMPLE vraća skup rezultata koji sadrži uzorak redova iz svih redova

koje je upit obradio. Sintaksa TABLESAMPLE klauzule je: TABLESAMPLE [SYSTEM] (sample_number [PERCENT | ROWS]) [REPEATABLE (repeat_seed)]

gdje je: SYSTEM

Ključna ANSI SQL riječ koja zadaje metodu uzorkovanja ovisnu o poslužitelju baze podataka. Iako druge baze podataka podržavaju dodatne metode uzorkovanja, koje ne ovise o poslužitelju baze podataka (npr. DB2 podržava BERNOULLI), SYSTEM je jedina metoda koju podržava SQL Server 2005 i to je podrazumijevana vrijednost. sample_number [PERCENT | ROWS]

Numerički izraz koji zadaje broj redova koje treba vratiti ili postotak redova u skupu rezultata koje treba vratiti. REPEATABLE (repeat_seed)

Sjeme (engl. seed) koje se koristi za odabir redova koji će se vratiti u uzorku. REPEATABLE zadaje da se odabrani uzorak može vratiti više nego jedanput. Ako se koristi isto sjeme, isti redovi vraćat će se svaki put kada se izvede upit, sve dok se ne naprave promjene na podacima u tablici. Sljedeći primjer vraća uzorak skupa rezultata koji sadrži gornjih 10 posto redova iz tablice Contact: SELECT ContactID, Title, FirstName, MiddleName, LastName FROM Person.Contact TABLESAMPLE (10 PERCENT)

Uzorak redova svaki se put razlikuje. Dodavanje REPEATABLE klauzule kao što je pokazano u sljedećem uzorku koda vraća isti uzorak skupa rezultata svaki put sve dok se ne promijene podaci u tablici: SELECT ContactID, Title, FirstName, MiddleName, LastName FROM Person.Contact TABLESAMPLE (10 PERCENT) REPEATABLE (5)

TABLESAMPLE klauzula ne može se koristiti s pogledima ili u funkciji tablične vrijednosti. Poglavlje 3: T-SQL poboljšanja | 35

OUTPUT OUTPUT klauzula vraća informacije o redovima na koje djeluje naredba INSERT, UPDATE ili DELETE. Ovaj skup rezultata može se vratiti aplikaciji koja ga poziva i upotrijebiti za

arhiviranje i zapisivanje u dnevnik. Sintaksa OUTPUT klauzule je: ::= { OUTPUT [ ,...n ] INTO @table_variable } ::= { | scalar_expression } ::= { DELETED | INSERTED | from_table_name } . { * | column_name }

gdje su: @table_variable

Tablična varijabla u koju se umeće skup rezultata. Tablična varijabla mora imati jednak broj stupaca kao OUTPUT skup rezultata, isključujući stupce identiteta i izračunate stupce (koje treba preskočiti).

Eksplicitna referenca za stupac (column_name) ili kombinacija simbola i operatora koja se evaluira na jednu vrijednost (scalar_expression).

Eksplicitna referenca za stupac. Stupac se označava s ključnom riječi DELETED ili INSERTED ako se odnosi na izmijenjenu tablicu. from_table_name zadaje tablicu koja se koristi za dobivanje kriterija za operacije

ažuriranja ili brisanja. Kao primjer mogu se uzeti sljedeći koraci za brisanje nekoliko redova iz tablice uz korištenje OUTPUT klauzula za zapisivanje izbrisanih vrijednosti u Log tabličnu varijablu: 1. U novoj bazi podataka ProgrammingSqlServer2005 izradite tablicu nazvanu OutputTest i dodajte joj tri reda: USE ProgrammingSqlServer2005 CREATE TABLE OutputTest ( ID int NOT NULL, Description varchar(max) NOT NULL, )

36 | Programiranje SQL Server 2005

INSERT INTO OutputTest (ID, Description) VALUES (1, 'row 1') INSERT INTO OutputTest (ID, Description) VALUES (2, 'row 2') INSERT INTO OutputTest (ID, Description) VALUES (3, 'row 3')

2. Izvedite sljedeći upit kako bi se iz tablice OutputTest izbrisao red čiji je ID = 1. Upotrijebite OUTPUT klauzulu za upisivanje izbrisanog reda u @DeleteLog tabličnu varijablu. DECLARE @DeleteLog AS TABLE (LogID INT, LogEntry VARCHAR(MAX)) DELETE OutputTest OUTPUT DELETED.ID, DELETED.Description INTO @DeleteLog WHERE ID = 1 SELECT * FROM @DeleteLog

Zadnji red u upitu pokazuje zabilježeni skup rezultata u tabličnoj varijabli @DeleteLog nakon što je red izbrisan iz OutputTest tablice, kao što je pokazano na slici 3-4.

Slika 3-4. Rezultati primjera OUTPUT klauzule

Kada se koristi OUTPUT klauzula za UPDATE naredbu, na raspolaganju su obje tablice, DELETED i INSERTED – tablica DELETED sadrži vrijednosti prije ažuriranja, dok INSERTED sadrži vrijednosti nakon ažuriranja.

Uobičajeni tablični izrazi Uobičajeni tablični izraz (engl. Common Table Expression, CTE) je privremeni skup rezultata izveden iz jednostavnog upita unutar dosega SELECT, INSERT, DELETE, UPDATE ili CREATE VIEW naredbi. CTE može imati referencu na samog sebe kako bi se izradio rekurzivni CTE. CTE se ne pohranjuje i traje samo dok traje upit koji ga sadrži. Sintaksa uobičajenog tabličnog izraza je: [WITH [ , ...n]] ::= expression_name [(column_name [ , ...n])] AS (query_definition)

gdje: expression_name

Zadaje ime za CTE. Poglavlje 3: T-SQL poboljšanja | 37

column_name

Zadaje ime stupca u CTE, jedinstveno unutar definicije. Broj imena stupaca mora odgovarati broju stupaca koje vraća CTE upit. query_definition.

Popis imena stupaca je opcionalan ako se vraćaju različita imena za sve stupce u CTE upitu. query_definition

Zadaje SELECT naredbu koja popunjava CTE. Sljedeći upit koristi CTE za prikazivanje broja zaposlenika koji su izravno odgovorni svakom upravitelju u tablici Employee u AdventureWorks: USE AdventureWorks; WITH ManagerEmployees(ManagerID, EmployeesPerManager) AS ( SELECT ManagerID, COUNT(*) FROM HumanResources.Employee GROUP BY ManagerID ) SELECT ManagerID, EmployeesPerManager FROM ManagerEmployees ORDER BY ManagerID

Upit vraća rezultate koji su djelomično prikazani na slici 3-5.

Slika 3-5. Rezultati iz primjera CTE

Iako se izvođenje ovog primjera može postići bez uobičajenih tabličnih izraza, korisno je pokazati njihovu temeljnu sintaksu. WITH klauzula zahtijeva da se na kraju naredbe koja dolazi prije nje

nalazi točka-zarez (;).

Sljedeći primjer koristi rekurzivni uobičajeni tablični izrazi za vraćanje popisa zaposlenika i njihovih upravitelja: 38 | Programiranje SQL Server 2005

USE AdventureWorks; WITH DirectReports( ManagerID, EmployeeID, Title, FirstName, LastName, EmployeeLevel) AS ( SELECT e.ManagerID, e.EmployeeID, e.Title, c.FirstName, c.LastName, 0 AS EmployeeLevel FROM HumanResources.Employee e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE ManagerID IS NULL UNION ALL SELECT e.ManagerID, e.EmployeeID, e.Title, c.FirstName, c.LastName, EmployeeLevel + 1 FROM HumanResources.Employee e INNER JOIN DirectReports d ON e.ManagerID = d.EmployeeID JOIN Person.Contact AS c ON e.ContactID = c.ContactID ) SELECT * FROM DirectReports

Upit vraća rezultate prikazane na slici 3-6.

Slika 3-6. Rezultati iz primjera rekurzivnog CTE

Rekurzivni CTE mora sadržavati najmanje dvije definicije upita – to su sidreni član (engl. anchor member) i rekurzivni član (engl. recursive member). UNION ALL operator kombinira sidreni član s rekurzivnim članom. Prva SELECT naredba vraća sve zaposlenike s najviše razine – to znači zaposlenike bez upravitelja (ManagerID IS NULL). Druga SELECT naredba nakon operatora UNION ALL rekurzivno vraća sve zaposlenike za svakog upravitelja dok se ne obrade zapisi svih zaposlenika. Konačno, zadnja SELECT naredba vraća sve zapise iz rekurzivnog uobičajenog tabličnog izraza DirectReports.

Poglavlje 3: T-SQL poboljšanja | 39

Broj rekurzija može se ograničiti tako da se u upitu zada MAXRECURSION. Sljedeći primjer dodaje taj naputak u upit iz prethodnog primjera čime ograničava skup rezultata na prve tri razine zaposlenika – sidreni skup i dvije rekurzije: USE AdventureWorks; WITH DirectReports( ManagerID, EmployeeID, Title, FirstName, LastName, EmployeeLevel) AS ( SELECT e.ManagerID, e.EmployeeID, e.Title, c.FirstName, c.LastName, 0 AS EmployeeLevel FROM HumanResources.Employee e JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE ManagerID IS NULL UNION ALL SELECT e.ManagerID, e.EmployeeID, e.Title, c.FirstName, c.LastName, EmployeeLevel + 1 FROM HumanResources.Employee e INNER JOIN DirectReports d ON e.ManagerID = d.EmployeeID JOIN Person.Contact AS c ON e.ContactID = c.ContactID ) SELECT * FROM DirectReports OPTION (MAXRECURSION 2)

Rezultati upita su podskup skupa rezultata iz prethodnog primjera te su ograničeni na EmployeeLevel vrijednosti 0, 1 ili 2. Također se prikazuje poruka o pogrešci prikazana na slici 3-7, što govori da je rekurzivni upit zaustavljen prije nego što je završen:

Slika 3-7. Poruka iz MAXRECURSION klauzule u primjeru rekurzivnog uobičajenog tabličnog izraza

SOME i ANY Operatori SOME i ANY koriste se u WHERE klauzuli za uspoređivanje skalarne vrijednosti sa skupom vrijednosti rezultata u jednom stupcu. Red se vraća ako uspoređivanje skalara sa skupom vrijednosti rezultata u jednom stupcu ima najmanje jednu podudarnost. SOME i ANY su semantički ekvivalentni. Sintaksa SOME i ANY operatora je sljedeća: { = | | != | > | >= | !> | < | = | !> | < | = | !> | < | = | !> | < | 0 ORDER BY Nam

Djelomični rezultati su prikazani na slici 3-17.

Slika 3-17. Rezultati iz primjera funkcije NTILE ( )

Ako se broj redova ne može ravnomjerno podijeliti na skupine, veličina skupina razlikovat će se za jedan.

Obrada pogrešaka SQL Server 2005 uvodi strukturiranu obradu iznimaka sličnu onoj u jeziku C#. Skupina T-SQL naredbi može se uključiti u TRY blok. Ako se pojavi pogreška unutar TRY bloka, kontrola se prepušta CATCH bloku koji sadrži T-SQL naredbe za obradu iznimke. U protivnom se izvođenje nastavlja s prvom naredbom iza CATCH bloka. Ako se CATCH Poglavlje 3: T-SQL poboljšanja | 51

blok izvede, kontrola se prenosi na prvu naredbu iza bloka CATCH nakon što je završen kod iz bloka CATCH. TRY...CATCH blok ne hvata upozorenja – poruke s oznakom ozbiljnosti 10 ili manjom

– ili pogreške s razinom ozbiljnosti većom od 20 – pogreške koje najčešće prekidaju Database Engine. Blokovi TRY...CATCH podliježu sljedećim pravilima: • Nakon TRY bloka mora odmah slijediti njegov CATCH blok. • Svaki TRY...CATCH blok mora biti sadržan u jednom paketu, pohranjenoj proceduri, okidaču ili funkciji. TRY blok se ne može prostirati kroz više paketa – na primjer, više BEGIN...ELSE ili IF...ELSE blokova. • TRY...CATCH blokovi mogu se ugnijezditi. • Naredba GOTO može se upotrijebiti za prijenos kontrole unutar TRY ili CATCH bloka ili za njegovo napuštanje. Naredba GOTO ne može se upotrijebiti za ulazak u TRY ili CATCH blok. TRY...CATCH sintaksa je sljedeća: BEGIN TRY { sql_statement | sql_statement_block } END TRY BEGIN CATCH { sql_statement | sql_statement_block } END CATCH

gdje izrazi imaju sljedeća značenja: sql_statement

T-SQL naredba. sql_statement_block

Skupina T-SQL naredbi uključena u BEGIN...END blok. Na primjer, tablica Employee u AdventureWorks ima ograničenje da stupac Gender može sadržavati samo oznaku M ili F. Sljedeća naredba ažurira Gender za zaposlenika s EmployeeID = 1 sa nevažećom vrijednošću X: USE AdventureWorks BEGIN TRY UPDATE HumanResources.Employee SET Gender = 'X' WHERE EmployeeID = 1; END TRY BEGIN CATCH SELECT ERROR_NUMBER( ) ErrorNumber, ERROR_STATE( ) ErrorState, ERROR_SEVERITY( ) ErrorSeverity, ERROR_MESSAGE( ) ErrorMessage; END CATCH

52 | Programiranje SQL Server 2005

Izvođenje ovog koda vraća skup rezultata koji sadrži informaciju o pogrešci: Stupac

Vrijednost

ErrorNumber

547

ErrorState

0

ErrorSeverity

16

ErrorMessage

UPDATE statement conflicted with CHECK constraint 'CK_Employee_ Gender'. The conflict occurred in database 'AdventureWorks', table 'Employee', stupac 'Gender'

Kako je pokazano u primjeru, sljedeće funkcije mogu se upotrijebiti za vraćanje informacije o pogrešci putem CATCH bloka: ERROR_MESSAGE( )

Dijagnostička informacija o pogrešci. Ove poruke često sadrže zamjenske varijable koje omogućavaju uključivanje specifičnih informacija, kao što su objekti baze podataka koji su uzrokovali pogrešku, u poruku. ERROR_NUMBER( )

Jedinstveni broj pogreške. ERROR_NUMBER( ) funkcija vraća zadnji broj pogreške kod svakog poziva. Ovo se razlikuje od @@ERROR, koji radi samo ako neposredno slijedi iza pogreške ili ako je to prva naredba u CATCH bloku. ERROR_SEVERITY()

Razina ozbiljnosti pogreške. Oznake ozbiljnosti pogreške su u rasponu od 0 do 24. Razine pogreške od 0 do 9 su upozorenja ili obavijesti. ERROR_STATE( )

Stanje pogreške. Kod stanja jedinstveno identificira specifične uvjete koji uzrokuju pogreške s istim brojem pogreške.

Data Definition Language (DDL) okidači Data Manipulation Language (DML) okidači izazivaju se u akcijama koje uzrokuju promjene podataka u tablici ili pogledu – INSERT, UPDATE ili DELETE. SQL Server 2005 uvodi Data Definition Language (DDL) okidače koji se izazivaju kao odgovor na DDL naredbe koje mijenjaju shemu baze podataka ili poslužitelja. Ove naredbe uključuju CREATE, ALTER, DROP, GRANT, DENY i REVOKE. DDL okidači se tipično upotrebljavaju za ispitivanje i zapisivanje u dnevnik događaja. Sintaksa za DDL okidač je: CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH [ ...,n ] ] { FOR | AFTER } { event_type | event_group } [ ,...n ]

Poglavlje 3: T-SQL poboljšanja | 53

AS { sql_statement [ ...n ] | EXTERNAL NAME < method specifier > } [ ; ] ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] ::= assembly_name.class_name.method_name

gdje izrazi iz koda imaju sljedeća značenja: trigger_name

Ime okidača. ON { ALL SERVER | DATABASE }

Definira razinu DDL okidača. Okidači na razini ALL SERVER izazivaju se kad se dogodi event_type ili event_group bilo gdje na tekućem poslužitelju. Treba postojati najmanje jedna CONTROL SERVER dozvola na poslužitelju za izradu DDL okidača na razini poslužitelja. Okidači na razini DATABASE izazivaju se kad se dogodi event_type ili event_group u tekućoj bazi podataka. Klauzula WITH ENCRYPTION šifrira tijelo CREATE TRIGGER naredbe i sprječava joj pri-

stup kroz kataloške poglede ili objavljivanje tijekom SQL Server replikacije. Klauzula EXECUTE AS zadaje sigurnosni kontekst pod kojim se okidač izvodi. { FOR | AFTER } FOR zadaje da se okidač izaziva za svaki red na koji djeluje naredba za okidanje. AFTER zadaje da se okidač izaziva samo kada su sve operacije u SQL naredbi za

okidanje izvedene uspješno. Sve referentne kaskadne akcije i provjere ograničenja moraju također biti uspješne. AFTER je podrazumijevana vrijednost. event_type

T-SQL događaj koji izaziva DDL okidač nakon što je završeno izvođenje događaja. Za potpuni spisak tipova događaja koji su važeći za upotrebu u DDL okidačima pogledajte Microsoft SQL Server 2005 Books Online. event_group

Ime prethodno definiranog grupiranja T-SQL događaja. DDL okidač se izaziva nakon što se završi izvođenje bilo kojeg od događaja u event_group. Za potpuni popis skupina događaja koji su važeći za upotrebu u DDL okidačima pogledajte Microsoft SQL Server 2005 Books Online.

54 | Programiranje SQL Server 2005

sql_statement

T-SQL naredba koja zadaje uvjete u kojima se izaziva DDL okidač kao i T-SQL naredba koja zadaje akciju ili akcije koje treba poduzeti kada se izazove okidač.

Zadaje metodu registriranog sklopa koju treba povezati s okidačem za CLR okidače. Izrada CLR okidača obrađena je detaljno u poglavlju 5. Za primjer pogledajte proces izrade DDL okidača za upisivanje CREATE TABLE i DROP TABLE operacija u tablicu dnevnika događaja: 1. Izvedite sljedeći upit kako bi se izradila tablica DdlLog u bazi podataka ProgrammingSqlServer2005 – izradite bazu podataka ako to već niste učinili. DdlLog tablica pohranjivat će informaciju o CREATE_TABLE i DROP_TABLE događaju. USE ProgrammingSqlServer2005 CREATE TABLE DdlLog ( LogID int IDENTITY(1,1) NOT NULL, LogEntry xml NOT NULL, CONSTRAINT PK_Log PRIMARY KEY CLUSTERED ( LogID ASC ) )

2. Izradite DDL okidač koji će u dnevnik upisivati stvorene i obrisane tablice: USE ProgrammingSqlServer2005 GO CREATE TRIGGER LogTableActivity ON DATABASE FOR CREATE_TABLE, DROP_TABLE AS INSERT INTO DdlLog (LogEntry) VALUES ( EVENTDATA( ) )

Funkcija EVENTDATA vraća informacije o događajima baze podataka ili poslužitelja. Funkcija se poziva kada se izazove događaj notifikacije. Za događaje koji izazivaju DDL okidač, EVENTDATA funkcija vraća vrijednost xml tipa koja sadrži: • Vrijeme događaja. • System Process ID (SPID) identifikator veze koja je uspostavljena u vrijeme dok se izvodi okidač.

Poglavlje 3: T-SQL poboljšanja | 55

• Tip događaja koji je izazvao okidač. • Dodatnu informaciju ovisno o tipu događaja. Za detalje o shemama za specifične tipove događaja, pogledajte objašnjenje za EVENTDATA (Transact-SQL) u Microsoft SQL Server 2005 Books Online. 3. Izvedite sljedeću T-SQL naredbu kako bi se stvorila i zatim obrisala tablica TestTable: USE ProgrammingSqlServer2005 CREATE TABLE TestTable ( TestID int NOT NULL ) DROP TABLE TestTable

4. Ispitajte tablicu DdlLog. Ona sadrži dva reda s detaljima o DDL događajima CREATE_TABLE i DROP_TABLE: CREATE_TABLE 2005-09-15T22:23:06.030 51 WHAMILTONXP DANTECONSULTING\WHamilton dbo ProgrammingSqlServer2005 dbo TestTable TABLE CREATE TABLE TestTable ( TestID int NOT NULL ) DROP_TABLE 2005-09-15T22:23:06.063 51 WHAMILTONXP DANTECONSULTING\WHamilton dbo ProgrammingSqlServer2005 dbo

56 | Programiranje SQL Server 2005

TestTable TABLE DROP TABLE TestTable

Metapodaci SQL Server 2005 uvodi kataloške poglede – sučelje za metapodatke poslužitelja – koji izlažu informaciju o objektima baze podataka uključujući tablice, poglede, stupce, indekse te pohranjene procedure. Kataloški pogledi izlažu kataloge metapodataka koji su dostupni korisnicima pa su najefikasniji način za dobijanje, transformiranje i predstavljanje kataloških podataka. Kataloški pogledi mogu se pretraživati s pomoću SELECT naredbe na isti način kao i bilo koji drugi pogled baze podataka i vratiti kao standardni skup rezultata. Kataloški pogledi često se udružuju u upitima kako bi se došlo do složenih metapodataka. Kao i pogledi, informacijske sheme – drugi način za dolaženje do metapodataka – kataloški pogledi izlažu metapodatke neovisno o implementaciji tablica kataloga na kojoj su temeljeni. Ako se promijene osnovne kataloške tablice, aplikacije koje se oslanjaju na kataloške poglede neće osjetiti promjene. Za razliku od informacijskih shema, kataloški pogledi izlažu metapodatke koji su specifični za SQL Server. Kataloški pogledi ne sadrže podatke o replikaciji, izradi rezervnih kopija, planovima održavanja baze podataka ili o SQL Server Agentu. Sljedeći upit upotrebljava kataloški pogled za dobijanje informacije o svim tablicama u AdventureWorks bazi podataka. Jedan zapis vraća se u skupu rezultata za svaku tablicu. SELECT * FROM sys.tables

Više informacija o specifičnim kataloškim pogledima javlja se kroz cijelu knjigu. Za kompletan popis kataloških pogleda i njihovu organizaciju, pogledajte Microsoft SQL Server 2005 Books Online.

Poglavlje 3: T-SQL poboljšanja | 57

POGLAVLJE 4

Uvod u Common Language Runtime (CLR) integraciju

Common Language Runtime (CLR) u .NET Frameworku je okolina u kojoj se izvodi prevedeni kod napisan u programskim jezicima kao što su C# i VB.NET. Kod se prevodi u datoteku nazvanu sklop koja sadrži prevedeni kod zajedno s manifestom sklopa. Manifest sadrži metapodatke o sklopu koji uključuju tipove, metode i odnose nasljeđivanja. Kod koji se izvodi unutar CLR-a zove se upravljani kod (engl. managed code). CLR pruža usluge kao što je automatsko sakupljanje otpada, podrška sigurnosti te provjeravanje tipova za vrijeme izvođenja. S obzirom da prevedeni kod izvodi CLR umjesto da ga direktno izvodi operacijski sustav, aplikacije upravljanog koda ne ovise o platformi niti o jeziku. SQL Server 2005 ugošćuje CLR u Database Engineu. Ovo se zove CLR integracija. CLR integracija omogućava izradu objekata baze podataka kao što su funkcije, pohranjene procedure, okidači, korisnički definirani tipovi i agregatne funkcije u programskim jezicima koje CLR podržava. Upravljani kod koji se izvodi u CLR-u kojeg ugošćuje SQL Server naziva se CLR rutina (engl. CLR routine). Prije SQL Servera 2005, glavni način na koji se SQL Server proširivao bilo je korištenje proširenih pohranjenih procedura koje omogućavaju izradu vanjskih rutina s pomoću progranskih jezika kao što je C. Proširene pohranjene procedure koriste se kao regularne pohranjene procedure. One, međutim, mogu imati probleme s performansama i stoga mogu narušiti stabilnost poslužitelja. CLR integracija omogućava proširivanje SQL Servera sa sigurnošću i pouzdanošću T-SQL-a te s fleksibilnošću proširenih pohranjenih procedura. Upravljani kod upotrebljava Code Access Security (CAS) kako bi kontrolirao koje sve operacije mogu provoditi sklopovi. CAS osigurava kod koji se izvodi unutar SQL Servera i sprječava da nepovoljno utječe na operacijski sustav ili poslužitelj baze podataka. Općenito bi trebalo upotrebljavati T-SQL kada kod u rutinama primarno provodi pristupanje podacima. CLR rutine su najbolje za intenzivne proračune te za podržavanje kompleksne logike koja bi inače bila teška za implementiranje s pomoću T-SQL-a. 58

Komponente koje su potrebne za razvoj CLR rutina instalirane su unutar SQL Servera 2005. SQL Server 2005 se isporučuje s .NET Frameworkom i prevoditeljima za C# i VB.NET, kao i s Visual Studio .NET IDE-om koji omogućava izgradnju Analysis Services i Reporting Services projekata. Ipak, treba instalirati Visual Studio 2005 kako bi se razvijale CLR rutine u Visual Studiju 2005.

Projektni ciljevi CLR integracije Microsoft navodi sljedeće projektne ciljeve CLR integracije u SQL Serveru 2005: Pouzdanost CLR rutine ne mogu izvoditi operacije koje ugrožavaju integritet Database Engine procesa niti im je dozvoljeno da pišu preko Database Engine memorijskih međuspremnika i struktura internih podataka. Skalabilnost SQL Server i CLR imaju različite modele za rad s dretvama, izradu rasporeda i upravljanje memorijom. Cilj projekta je osiguravanje skalabilnost kada korisnički kod poziva API za rad s dretvama, sinkronizacijskim primitivama i memorijom. Sigurnost Korisnički kod koji se izvodi u bazi podataka mora slijediti pravila SQL Servera o autentičnosti i autorizaciji za pristup objektima baze podataka. Dodatno, administratori moraju biti u stanju kontrolirati pristup resursima operacijskog sustava iz koda koji se izvodi unutar baze podataka. Performanse Korisnički kod koji se izvodi u bazi podataka mora raditi najmanje jednako dobro kao ekvivalentne implementacije kroz izvornu Database Engine funkcionalnost ili T-SQL. CLR pruža sljedeće usluge kako bi postigao ove projektne ciljeve: Potvrda sigurnog tipa Nakon što se sklopovi učitaju u CLR, ali prije nego što se prevedu, kod se provjerava kako bi se osigurao pristup memorijskim strukturama samo na dobro definirane načine – kod koji prođe ovu provjeru je siguran za tip. Domene aplikacije Domene aplikacije su prostori za izvedbu unutar procesa domaćina u koji se sklopovi učitavaju, u kojem se izvode i iz kojeg se brišu. One osiguravaju izolaciju sklopova koji se izvode. Code Access Security CAS na temelju identiteta koda primjenjuje dozvole kako bi kontrolirao koje operacije kod može izvoditi te kojim resursima sustava može pristupati.

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 59

Host Protection Attributes (HPA) HPA je mehanizam za obilježavanje .NET upravljanih API-ja atributima koji su interesantni matičnim CLR-ovima kao što je SQL Server. Matični CLR može odbiti pozive korisničkog koda od onih API-ja koji su na popisu zabranjenih. SQL Server 2005 ugošćuje CLR u Database Engineu tako da efektivno djeluje kao operacijski sustav za CLR. Projektni ciljevi za SQL Server 2005 CLR integraciju su pouzdanost, skalabilnost i sigurnost postižu se na sljedeći način: Pouzdanost Nije moguće uvijek oporaviti sustav od kritičnih iznimaka u .NET upravljanom kodu kao kada se, an primjer, izbaci iznimka odbacivanja dretve. Ako postoji bilo koje dijeljeno stanje u aplikacijskoj domeni u kojoj se dogodi iznimka odbacivanja dretve, CLR ugošćen na SQL Serveru briše takvu aplikacijsku domenu i zaustavlja transakcije baze podataka koje se u njoj izvode. Skalabilnost CLR poziva SQL Server API-je koji su potrebni za izradu dretvi i poziva SQL Server sinkronizacijske objekte za sinkroniziranje dretvi. Sve dretve i sinkronizacijski objekti poznati su SQL Serveru, tako da može efikasno praviti raspored za ne-CLR dretve, otkriti i uklanjati zastoje koji uključuju CLR sinkronizacijske objekte, te otkriti i obraditi CLR dretve koje nisu dovršene u razumnom vremenskom razdoblju. CLR poziva SQL Server primitive za alokaciju i dealokaciju memorije. To omogućava da SQL Server ostane unutar zadanih granica memorije – SQL Server može odbiti CLR memorijske zahtjeve kada je memorija ograničena ili zatražiti od CLRa da prema potrebi smanji upotrebu memorije. Sigurnost Kada se izrađuje ili mijenja SQL Server registrirani sklop, može mu se zadati jedan od tri skupa dopuštenja: SAFE, EXTERNAL-ACCESS ili UNSAFE. SQL Server koristi skupove dopuštenja za postavljanje CAS dopuštenja kada se sklop izvodi. Tri skupa dopuštenja opisana su u tablici 4-1. Tablica 4-1. Skupovi dopuštenja za SQL Server CLR rutine Skup dopuštenja

Opis

SAFE

SAFE sklopovi mogu pristupati podacima iz baze podataka lokalnog SQL Servera i izvoditi

EXTERNAL-ACCESS

izračune i poslovnu logiku koja ne uključuje resurse izvan lokalnih baza podataka. SAFE sklopovi ne mogu pristupati vanjskim resursima sustava kao što su datoteke, mreže, varijable okoline ili registri. SAFE skup dopuštenja može se primijeniti samo na kod koji je potvrdivo siguran. To je podrazumijevani sklop dopuštenja i on je najrestriktivniji. Omogućava da sklopovi pristupaju izvjesnim vanjskim resursima sustava kao što su datoteke, mreža, varijable okoliša i Registry pored dopuštenja koje daje skup SAFE. EXTERNAL-ACCESS skup dopuštenja može se primijeniti samo na kod koji je potvrdivo siguran.

60 | Programiranje SQL Server 2005

Tablica 4-1. Skupovi dopuštenja za SQL Server CLR rutine (nastavak) Skup dopuštenja

Opis

UNSAFE

UNSAFE sklopovi imaju neograničen pristup resursima unutar SQL Servera i izvan njega. UNSAFE sklop može pozvati neupravljani kod.

Samo administrator baze podataka može registrirati UNSAFE sklop.

CLR ugošćen u SQL Serveru postavlja sljedeća programska ograničenja povezana sa sigurnošću: • Kod označen kao SAFE ili EXTERNAL-ACCESS ne može upotrebljavati statičke podatke članove i varijable. • Ne mogu se upućivati pozivi .NET Framework API tipovima ili članovima koji su označeni s ExternalProcessMgmt, MayLeakOnAbort, SharedState ili Synchronization atributima zaštite domaćina (HostProtectionAttribute) – to sprječava da kod u sklopovima označen kao SAFE ili EXTERNAL-ACCESS poziva API koji bi mogao uzrokovati curenje resursa prilikom zatvaranje, koji omogućava stanje dijeljenja ili obavlja sinkronizaciju.

Uključivanje CLR integracije CLR integracija je u SQL Serveru 2005 podrazumijevano isključena. Treba upotrijebiti sistemsku pohranjenu proceduru sp_configure za uključivanje CLR integracije, kao što je ovdje prikazano: sp_configure 'clr enabled', 1 GO RECONFIGURE GO

clr enabled konfiguracijska opcija poslužitelja zadaje može li SQL Server izvoditi .NET

sklopove (0 = nije dozvoljeno; 1 = dozvoljeno). Promjena stupa na snagu odmah nakon što se izvedu sp_configure i reconfigure – ne treba ponovno pokretati poslužitelj. Potrebna su ALTER SETTINGS dopuštenja na razini poslužitelja da se uključi CLR integracija.

Potrebni .NET imenski prostori Komponente koje su potrebne za izradu jednostavnih CLR rutina instalirane su sa SQL Serverom 2005 u .NET Framework sklopu System.Data.dll – dijelu osnovne biblioteke klasa .NET Frameworka smještenom u Global Assembly Cacheu (GAC) kao i u \Microsoft.NET\Framework\ mapi. Ključni imenski prostori u ovom sklopu opisani su u tablici 4-2.

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 61

Tablica 4-2. .NET imenski prostori za CLR rutine Imenski prostori sklopa System.Data.dll

Opis

System.Data

Klase koje čine ADO.NET arhitekturu.

System.Data.Sql

Klase koje podržavaju funkcionalnosti specifične za SQL Server 2005.

Microsoft.SqlServer.Server

Klase koje podržavaju .NET CLR funkcionalnosti unutar SQL Server CLR rutina – korisnički definirane funkcije (UDF), pohranjene procedure, UDA funkcije, UDT i okidači.

System.Data.SqlTypes

Klase koje podržavaju izvorne SQL Server tipove podataka.

System.Data.SqlClient

.NET Framework pružatelj podaka za SQL Server.

Tipovi CLR rutina SQL Server 2005 CLR integracija omogućava izgradnju objekata baze podataka s pomoću .NET jezika. Kada je .NET Framework sklop registriran u sustavu SQL Server, mogu se razvijati CLR rutine koje se mogu upotrebljavati tamo gdje se može upotrebljavati ekvivalentna T-SQL rutina. Tablica 4-3 opisuje raspoložive CLR rutine. Tablica 4-3. Tipovi CLR rutina Objekt baze podataka

.NET Framework tip sklopa

Opis

Funkcija skalarne vrijednosti

Javna statička metoda

UDF koji vraća jednu vrijednost.

Funkcija tablične vrijednosti

Javna statička metoda

UDF koj vraća tablicu kao skup rezultata.

Pohranjena procedura

Javna statička metoda

Rutina koja vraća tablični skup rezultata i poruke klijentu, poziva DDL i DML naredbe te vraća izlazne parametre.

Agregatna funkcija koju definira korisnik

Klasa ili struktura

UDA funkcija koja djeluje na vrijednosti u skupu redova i vraća skalar.

Korisnički definiran tip

Klasa ili struktura

Kompleksni tipovi podataka s metodama koje proširuju sustav skalarnih tipova u SQL Serveru.

Okidač (DML i DDL)

Javna statička metoda

Tip pohranjene procedure koja se automatski izvodi kada se dogodi DML ili DDL događaj.

Primjer Hello World Ova cjelina prikazuje kako izraditi, konfigurirati i upotrebljavati SQL Server CLR rutinu putem pokazne CLR pohranjene procedure koja vraća takstualnu poruku „Hello world“. Nakon ovog primjera slijedi primjer koji pokazuje kako izraditi isti .NET Framework sklop s pomoću prevoditelja za odzivnik. Slijedite ove korake u Visual Studiju 2005 za izradu .NET Framework sklopa koji sadrži CLR pohranjenu proceduru: 1. Odaberite File ➝ New ➝ Project. 2. Odaberite SQL Server Project u dijaloškom okviru New Project, prikazanom na slici 4-1, nazovite ga HelloWorld, zadajte lokaciju te pritisnite OK. 62 | Programiranje SQL Server 2005

Slika 4-1. Dijaloški okvir New Project

3. Kako pohranjena procedura neće pristupati nikakvim podacima pritisnite Cancel u dijaloškom okviru Add Database Reference (slika 4-2).

Slika 4-2. Dijaloški okvir Add Database Rerefrence Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 63

4. U Solution Exploreru pritisnite desnom tipkom miša na HelloWorld projekt te odaberite Add ➝ Stored Procedure s kontekstnog izbornika, kao što je prikazano na slici 4-3.

Slika 4-3. Stavka izbornika Add Stored Procedure

5. U dijaloškom okviru Add New Item, prikazanom na slici 4-4, odaberite predložak Stored Procedure. Unesite ime HelloWorldStoredProcedure.cs i pritisnite Add. 6. Dodajte sljedeći red koda u HelloWorldStoredProcedure( ) metodu iz HelloWorldStoredProcedure.cs: SqlContext.Pipe.Send("Hello world.\n");

Kompletan kod bi sada trebao glasiti: using using using using using

System; System.Data; System.Data.Sql; System.Data.SqlTypes; Microsoft.SqlServer.Server;

64 | Programiranje SQL Server 2005

Slika 4-4. Dijaloški okvir Add New Item public partial class StoredProcedures { [SqlProcedure] public static void HelloWorldStoredProcedure( { SqlContext.Pipe.Send("Hello world.\n"); } };

)

7. Izgradite rješenje odabirom opcije Build ➝ Build Solution iz glavnog izbornika Visual Studija 2005, pritiskom na Build Solution gumb na alatnoj vrpci Build ili pritiskom desne tipke miša na projekt HelloWorld u Solution Exploreru te odabirom Build s kontekstnog izbornika. Pohranjena procedura prevodi se u sklop nazvan HelloWorld.dll u bin\Debug podmapi. Kad je pohranjena procedura prevedena, treba registrirati sklop kod SQL Servera prije nego se može pristupiti CLR pohranjenoj proceduri. Ove upute i mnogi drugi primjeri u knjizi koriste bazu podataka nazvanu ProgrammingSqlServer2005. Slijedite ove korake kako biste registrirali sklop kod SQL Servera: 1. Pritisnite desnom tipkom miša ProgrammingSqlServer2005 bazu podataka u Object Exploreru te odaberite New Query s kontekstnog izbornika, kao što je prikazano na slici 4-5. 2. Registrirajte sklop HelloWorld.dll u SQL Serveru s imenom sklopa HelloWorld zadavanjem sljedeće T-SQL naredbe: USE ProgrammingSqlServer2005 GO CREATE ASSEMBLY HelloWorld FROM 'C:\PSS2005\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll'

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 65

Slika 4-5. Opcija izbornika New Query

SQL Server ime sklopa i .NET Framework ime DLL sklopa ne moraju biti ista. SQL Server ime sklopa mora biti jedinstveno u bazi podataka. Da je sklop registriran možete potvrditi proširivanjem čvora Databases ➝ ProgrammingSqlServer2005 ➝ Programmability ➝ Assemblies u stablastom prikazu Object Explorera, kao što je prikazano na slici 4-6.

Slika 4-6. Čvor Assemblies u Object Exploreru

3. Izradite CLR pohranjenu proceduru HelloWorldSP temeljenu na statičkoj metodi HelloWorld StoredProcedure( ) iz HelloWorld.dll sklopa registriranog u koraku 2. Izvedite sljedeći upit:

66 | Programiranje SQL Server 2005

CREATE PROCEDURE HelloWorldSP AS EXTERNAL NAME HelloWorld.StoredProcedures.HelloWorldStoredProcedure

Klauzula EXTERNAL NAME ima tri dijela odvojena točkama: • SQL Server registrirano ime sklopa (iz koraka 2) – HelloWorld. • Ime klase u .NET Framework sklopu – StoredProcedures. • Ime javne statičke metode koja implementira pohranjenu proceduru – HelloWorldStoredProcedure( ). Možete provjeriti je li pohranjena procedura izrađena proširivanjem čvora Databases ➝ ProgrammingSqlServer2005 ➝ Stored Procedure u stablastom prikazu Object Explorera, kao što je prikazano na slici 4-7.

Slika 4-7. Čvor Stored Procedures u Object Exploreru

Pohranjena procedura se sada može upotrebljavati kao i bilo koja druga pohranjena procedura. Izvedite pohranjenu proceduru HelloWorldSP sljedećom T-SQL naredbom: EXEC HelloWorldSP

Njen rezultat je: Hello world.

Rezultat je potpuno jednak onome kakav bi dala i sljedeća pohranjena T-SQL procedura: CREATE PROCEDURE HelloWorldSP2 AS PRINT 'Hello world.'

Kada je primjer završen, možete ukloniti CLR pohranjenu proceduru i registrirani .NET Framework sklop zadavanjem sljedećih naredbi: DROP PROCEDURE HelloWorldSP DROP ASSEMBLY HelloWorld

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 67

Prevoditelj za odzivnik Primjeri u ovoj knjizi koriste Visual Studio 2005, ali se isto tako programske datoteke mogu izraditi korištenjem bilo kojeg editora teksta i prevesti s pomoću .NET prevoditelja za odzivnik. SQL Server 2005 instalira .NET Framework redistribucijske datoteke, uključujući prevoditelje koji se koriste u odzivniku – na primjer csc.exe za C# i vbc. exe za VB.NET. Prevoditelji za odzivnik instalirani su u mapi C:\\Microsoft. NET\ Framework\, gdje je: Mapa u kojoj je instalirana vaša inačica Windowsa – najčešće WINDOWS ili WINNT. Inačica .NET Frameworka. Kako biste mogli upotrijebiti prevoditelj, mapu koja ga sadrži treba dodati u sistemsku varijablu okoline Path definiranu u popisu System variables kojem se pristupa kroz Control Panel ➝ System ➝ Advanced ➝ Environment Variables. Za korištenje C# prevoditelja za prevođenje HelloWorldStoredProcedure.cs datoteke izrađene u prethodnoj cjelini, treba pokrenuti sljedeću naredbu: csc /target:library /out:HelloWorld.dll HelloWorldStoredProcedure.cs

Prevoditeljska oznaka /target upućuje prevoditelj da izgradi DLL. Oznaka /out upućuje prevoditelja da premosti podrazumijevano DLL ime HelloWorldStoredProcedure. dll imenom HelloWorld.dll. Za više informacija o Visual Studio .NET prevoditeljima i prevoditeljskim oznakama pogledajte Microsoft Developer Network (MSDN). Kada je .NET Framework sklop preveden, treba ga zajedno s CLR rutinama registrirati na isti način kao što bi se to učinilo da je upotrijebljen Visual Studio 2005 prevoditelj.

DDL podrška za CLR integraciju SQL Server uvodi nove T-SQL naredbe za stvaranje .NET sklopova i rad s njima te poboljšava druge T-SQL naredbe za izradu i upravljanje funkcijama, pohranjenim procedurama, okidačima te UDA funkcijama koje su izrađene iz CLR sklopova. Ove naredbe opisane su u tablici 4-4. Tablica 4-4. Nove i promijenjene T-SQL naredbe za podršku CLR integracije Doseg

DDL naredba

Nova T-SQL naredba

Opis

.NET Framework sklop

CREATE ASSEMBLY

Da

Učitava sklop u SQL Server.

ALTER ASSEMBLY

Da

Mijenja učitani sklop.

DROP ASSEMBLY

Da

Uklanja sklop iz SQL Servera.

68 | Programiranje SQL Server 2005

Tablica 4-4. Nove i promijenjene T-SQL naredbe za podršku CLR integracije (nastavak) Doseg

DDL naredba

Nova T-SQL naredba

Korisnički definirana agregatna funkcija

CREATE AGGREGATE

Da

Stvara UDA funkciju u SQL Server bazi podataka iz UDA funkcije implementirane kao klasa u .NET Frameworku. Sklop koji sadrži ovu klasu mora se prvo registrirati u SQL Serveru s pomoću T-SQL naredbe CREATE ASSEMBLY.

DROP AGGREGATE

Da

Uklanja UDA funkciju iz SQL Server baze podataka.

CREATE TYPE

Ne

Izrađuje UDT u SQL Server bazi podataka iz tipa implementiranog kao klasa ili struktura u .NET Framework sklopu. Sklop koji sadrži klasu ili strukturu mora se prvo registrirati u SQL Serveru s pomoću T-SQL naredbe CREATE ASSEMBLY.

DROP TYPE

Ne

Uklanja UDT iz SQL Server baze podataka.

CREATE PROCEDURE

Ne

Stvara pohranjenu proceduru u SQL Server bazi podataka iz CLR pohranjene procedure koja je implementirana kao metoda u .NET Framework sklopu. Sklop koji sadrži ovu metodu mora se prvo registrirati u SQL Serveru s pomoću T-SQL naredbe CREATE ASSEMBLY.

ALTER PROCEDURE

Ne

Mijenja pohranjenu proceduru koja je prethodno stvorena s pomoću CREATE PROCEDURE T-SQL naredbe.

DROP PROCEDURE

Ne

Uklanja pohranjenu proceduru iz SQL Server baze podataka.

CREATE FUNCTION

Ne

Stvara UDF u SQL Server bazi podataka iz CLR UDF koja je implementirana kao metoda u .NET Framework sklopu. Sklop koji sadrži ovu metodu mora se prvo registrirati u SQL Serveru s pomoću T-SQL naredbe CREATE ASSEMBLY.

ALTER FUNCTION

Ne

Mijenja UDF koja je prethodno stvorena s pomoću T-SQL naredbe CREATE FUNCTION.

DROP FUNCTION

Ne

Ukalanja UDF iz SQL Server baze podataka.

CREATE TRIGGER

Ne

Stvara DML ili DDL okidač u SQL Server bazi podataka iz CLR okidača koji je implementiran kao metoda u .NET Framework sklopu. Sklop koji sadrži ovu metodu mora se prvo registrirati u SQL Serveru s pomoću T-SQL naredbe CREATE ASSEMBLY.

ALTER TRIGGER

Ne

Mijenja okidač koji je prethodno stvoren s pomoću T-SQL naredbe CREATE TRIGGER.

DROP TRIGGER

Ne

Uklanja okidač iz SQL Server baze podataka.

Korisnički definiran tip

Pohranjena procedura

Korisnički definirana funkcija (sa skalarnom ili tabličnom vrijednošću)

Okidač

Opis

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 69

Naredbe su detaljno opisane u sljedećim odjeljcima. Poglavlje 5 daje detaljniji pregled i primjere izrade ovih objekata u jeziku C#.

Metapodaci CLR rutine Kataloški pogledi vraćaju metapodatke koje koristi SQL Server 2005 Database Engine. Kataloški pogled sys.all_objects vraća red za svaki korisnički definiran objekt i sistemski objekt u tekućoj bazi podataka. Stupac type zadaje tip objekta – vrijednosti za CLR rutine prikazane su u tablici 4-5. Tablica 4-5. Vrijednosti tipova CLR objekata Vrijednost stupca tipa za sys.all_objects

Tip CLR objekta

AF

Agregatna funkcija

FS

Funkcija sa skalarnom vrijednosti

FT

Funkcija s tabličnom vrijednosti

PC

Pohranjena procedura

TA

Okidač

Na primjer, sljedeća T-SQL naredba vraća informacije o svim CLR pohranjenim procedurama u AdventureWorks bazi podataka: USE AdventureWorks GO SELECT * FROM sys.all_objects WHERE type='PC'

Kataloški pogled sys.all_objects ne vraća informaciju za DDL okidače. Zato umjesto njega treba koristiti kataloški pogled sys.triggers kako bi se dobile informacije za sve DML i DDL okidače u tekućoj bazi podataka. Kataloški pogled sys.all_objects ne vraća informaciju za UDT. Kataloški pogled sys. types vraća informaciju za sve sistemske i korisnički definirane tipove u tekućoj bazi podataka. Kataloški pogled sys.sklop_types vraća informacije za sve CLR UDT-ove. SQL Server 2005 pruža kataloške poglede koji sadrže informacije o registriranim sklopovima i CLR funkcijama, pohranjenim procedurama, okidačima, UDT i UDA funkcijama definiranima iz registriranih sklopova. Ovi kataloški pogledi opisani su u tablici 4-6, a detaljno su opisani u sljedećim odjeljcima. Tablica 4-6. Kataloški pogledi koji vraćaju metapodatke o registriranim .NET Framework sklopovima i CLR rutinama Kataloški pogled

Opis

sys.assemblies

Red za svaki sklop registriran u tekućoj bazi podataka.

sys.assembly_files

Red za svaku datoteku koja čini sklop.

70 | Programiranje SQL Server 2005

Tablica 4-6. Kataloški pogledi koji vraćaju metapodatke o registriranim .NET Framework sklopovima i CLR rutinama (nastavak) Kataloški pogled

Opis

sys.assembly_modules

Red za svaku funkciju, CLR pohranjenu proceduru ili okidač.

sys.assembly_references

Red za svaki par sklopova koji direktno navode jedan drugoga kao referencu.

sys.assembly_types

Red za svaki CLR UDT.

sys.assemblies Kataloški pogled sys.assemblies sadrži red za svaki sklop registriran u tekućoj bazi podataka. Tablica 4-7 opisuje stupce u ovom pogledu. Tablica 4-7. Stupci kataloškog pogleda sys.assemblies Stupac

Opis

name

Ime skopa, jedinstveno unutar sheme.

principal_id

Identifikator principala koji posjeduje shemu.

assembly_id

Identifikatorski broj sklopa, jedinstven unutar sheme.

permission_set

Dopuštenja pristupa kodu za sklop; jedna od sljedećih numeričkih vrijednosti: • 1 = Safe Access • 2 = External Access • 3 = Unsafe Access

permission_set_desc

Opis dopuštenja za pristup kodu koja su zadana vrijednošću stupca permission_set, jednom od sljedećih vrijednosti niza snakova: SAFE_ACCESS, EXTERNAL_ACCESS ili UNSAFE_ACCESS.

is_visible

Numerička vrijednost koja označava vidljivost sklopa: 0 = Sklop mogu pozivati samo drugi sklopovi. 1 = Sklop se može koristiti za izradu CLR korisnički definiranih funkcija, pohranjenih procedura i okidača.

clr_name

Kanonski niz znakova koji jedinstveno identificira sklop. Niz znakova šifrira jednostavno ime, broj inačice, kulturološke postavke, javni ključ te arhitekturu sklopa.

create_date

Datum kada je sklop izrađen ili registriran.

Sljedeća T-SQL naredba vraća skup rezultata svih CLR sklopova koji su registrirani u tekućoj bazi podataka: SELECT * FROM sys.assemblies;

sys.assembly_files Kataloški pogled sys.assembly_files sadrži red za svaki registrirani sklop u tekućoj bazi podataka. Tablica 4-8 opisuje stupce u ovom pogledu.

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 71

Tablica 4-8. Stupci kataloškog pogleda sys.assembly_files Stupac

Opis

assembly_id

Identifikator sklopa kojem datoteka pripada.

name

Ime datoteke sklopa.

file_id

Identifikator datoteke, jedinstven unutar sklopa. Korijenski sklop ima identifikator datoteke 1. Datoteke koje se dodaju u sklop imaju identifikator datoteke 2 ili više.

content

Binarni sadržaj datoteke.

sys.assembly_modules Kataloški pogled sys.assembly_modules sadrži red za svaku CLR funkciju (sa skalarnom vrijednošću, tabličnom vrijednošću ili agregatom), pohranjenu proceduru ili okidač definiran u .NET Framework sklopu u tekućoj bazi podataka. Tablica 4-9 opisuje stupce u ovom pogledu. Tablica 4-9. Stupci kataloškog pogleda sys.assembly_modules Stupac

Opis

Object_id

Identifikator modula (CLR rutina), jedinstven unutar baze podataka.

assembly_id

Identifikator sklopa iz kojeg je modul izrađen.

assembly_class

Ime klase unutar sklopa koji definira modul.

assembly_method

Ime metode unutar assembly_class koja definira ovaj modul. Ova vrijednost je NULL za agregatne funkcije.

null_on_null_input

Označava vraća li modul NULL ako su neki argumenti NULL.

execute_as_principal_id

Glavni identifikator baze podataka za izvedbeni kontekst. Ako je ova vrijednost NULL, izvedbeni kontekst je CALLER.

sys.assembly_references Kataloški pogled sys.assembly_references sadrži red za svaki par sklopova registriranih u tekućoj bazi podataka, gdje jedan sklop direktno referencira drugi. Tablica 4-10 opisuje stupce u ovom pogledu. Tablica 4-10. Stupci kataloškog pogleda sys.assembly_reference Stupac

Opis

assembly_id

Identifikator sklopa koji ima referencu na drugi sklop.

referenced_assembly_id

Identifikator sklopa na koji se referenca odnosi.

sys.assembly_types Kataloški pogled sys.assembly_types sadrži red za svaki korisnički definiran tip u tekućoj bazi podataka koji je definiran u CLR sklopu. Tablica 4-11 opisuje stupce u ovom pogledu. 72 | Programiranje SQL Server 2005

Tablica 4-11. Stupci kataloškog pogleda sys.assembly_type Stupac

Opis



Stupci naslijeđeni iz kataloškog pogleda sys.types.

assembly_id

Identifikator sklopa iz kojeg je izrađen UDT.

assembly_class

Ime klase unutar sklopa koji definira UDT.

is_binary_ordered

Označava je li razvrstavanje bajtova ekvivalentno razvrstavanju s pomoću operatora za uspoređivanje.

is_fixed_length

Označava je li duljina jednaka maksimalnoj duljini (max_length u sys.types).

prog_id

ProgID tipa izloženog COM-u.

assembly_qualified_name

Ime kvalificiranog tipa sklopa.

Rad sa sklopom .NET Framework sklop sadrži klase i metode koje mogu implementirati CLR rutine u SQL Serveru 2005. Prvo treba registrirati sklop u SQL Serveru s pomoću T-SQL naredbe CREATE ASSEMBLY, kao što je učinjeno ranije u odjeljku „Primjer Hello World“. Registrirani sklop može se izmijeniti s pomoću naredbe ALTER ASSEMBLY, ili se može ukloniti sa poslužitelja s pomoću naredbe DROP ASSEMBLY. Ove tri nove T-SQL naredbe opisane su u sljedećim odjeljcima.

CREATE ASSEMBLY T-SQL naredba CREATE ASSEMBLY registrira .NET Framework sklop kao objekt unutar SQL Servera iz kojeg se mogu praviti CLR pohranjene procedure, UDF, okidači, UDA funkcije i UDT-ovi. Sintaksa za CREATE ASSEMBLY je sljedeća: CREATE ASSEMBLY assembly_name [ AUTHORIZATION owner_name ] FROM { client_assembly_specifier | assembly_bits [,...n] } [ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ] client_assembly_specifier :: = '[\\computer_name\]share_name\[path\]manifest_file_name' | '[local_path\]manifest_file_name' assembly_bits :: = { varbinary_literal | varbinary_expression }

gdje: assembly_name

Zadaje ime sklopa koje mora biti jedinstveno unutar baze podataka. AUTHORIZATION owner_name

Zadaje ime korisnika ili uloge koja je vlasnik sklopa. Ako nije zadano, vlasništvo se pripisuje tekućem korisniku. Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 73

FROM

Zadaje .NET Framework sklop koji treba učitati. client_assembly_specifier

Zadaje lokalnu putanju ili Universal Naming Convention (UNC) putanju sklopa te ime datoteke manifesta sklopa. Sklopovi sa više modula nisu podržani. Ovisni sklopovi se automatski učitavaju s iste lokacije, ili se učitavaju iz tekuće baze podataka ako je posjeduje isti principal. CREATE ASSEMBLY ne uspijeva ako nešto od toga nije moguće. assembly_bits

Zadani spisak binarnih vrijednosti koje čine sklop i njegove ovisne sklopove. Sklop korijenske razine mora se zadati prvi, nakon čega slijede ovisni sklopovi bilo kojim redoslijedom. PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }

Zadaje sigurnost pristupa kodu kada SQL Server pristupa sklopu. Ako nije zadano, podrazumijevana vrijednost je SAFE. Na poslužitelj se može učitati više inačica istog sklopa. Ti sklopovi moraju imati različite brojeve inačica ili oznake kulture i moraju se registrirati s pomoću jedinstvenih imena sklopova unutar SQL Servera.

ALTER ASSEMBLY T-SQL naredba ALTER ASSEMBLY mijenja svojstva sklopa koji je prethodno registriran s pomoću naredbe CREATE ASSEMBLY i osvježava sklop zadnjom inačicom. Sintaksa za ALTER ASSEMBLY je sljedeća: ALTER ASSEMBLY assembly_name [ FROM { client_assembly_specifier | assembly_bits [ ,...n ] } ] [ WITH assembly_option [ ,...n ] ] [ DROP FILE { file_name [ ,...n ] | ALL } ] [ ADD FILE FROM { client_file_specifier [ AS file_name ] | file_bits AS file_name } [,...n ] ] client_assembly_specifier :: = '\\computer_name\share-name\[path\]manifest_file_name' | '[local_path\]manifest_file_name' assembly_bits :: = { varbinary_literal | varbinary_expression } assembly_option :: = PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE } | VISIBILITY { ON | OFF } ] | UNCHECKED DATA

74 | Programiranje SQL Server 2005

gdje izrazi iz koda imaju sljedeća značenja: assembly_name

Zadaje ime registriranog sklopa koji treba mijenjati. FROM

Zadaje .NET Framework sklop koji treba zamijeniti zadnjom kopijom. DROP FILE { file_name [ ,...n ] | ALL }

Uklanja datoteku povezanu sa sklopom ili sve datoteke povezane sa sklopom. DROP FILE se izvodi prije ADD FILE ako su zadana oba dijela. ADD FILE FROM { client_file_specifier [ AS file_name ] | file_bits AS file_name } Učitava datoteku koju treba povezati sa sklopom sa lokacije zadane client_file_ specifier argumentom ili iz binarnih vrijednosti koje čine datoteku zadanu file_ bits argumentom. Argument file_name zadaje ime koje treba upotrijebiti za spremanje datoteke u SQL Serveru. Ako file_name argument nije zadan argumentom client_file_specified, dio client_file_specifier koji predstavlja ime datoteke

koristi se kao ime u SQL Serveru. VISIBILITY { ON | OFF }

Zadaje može li se sklop upotrijebiti za izradu CLR pohranjenih procedura, funkcija, okidača, UDT i UDA funkcija. Sklopove s VISIBILITY = OFF mogu pozivati samo drugi sklopovi. Podrazumijevana vrijednost za VISIBILITY je ON. UNCHECKED DATA

Mijenja sklop čak i ako postoje tablice sa stupcima ili ograničenjima za potvrdu koje referenciraju metode iz sklopa ili ako postoje CLR UDT-ovi koji ovise o sklopu i koji koriste User-Defined serijalizacijski format. Samo članovi db_owner i db_ddlowner mogu zadati ovu opciju. Drugi argumenti su isti kao za CREATE ASSEMBLY naredbu. Izvođenje naredbe ALTER ASSEMBLY ne utječe na sesije koje se trenutno izvode i koje koriste sklop koji se mijenja – one do kraja koriste nepromijenjeni sklop. Stvara se nova aplikacijska domena koja izvodi najsvježiji kod za nove korisnike sklopa. Ako klauzula FROM nije zadana, sklop se osvježava zadnjom kopijom sklopa, čime se CLR rutine ponovno povezuju s posljednjom implementacijom u sklopu.

DROP ASSEMBLY Naredba DROP ASSEMBLY uklanja sklop koji je prethodno registriran naredbom CREATE ASSEMBLY. Sklop i sve njegove povezane datoteke uklanjaju se iz baze podataka. Sintaksa DROP ASSEMBLY je sljedeća: DROP ASSEMBLY assembly_name [ WITH NO DEPENDENTS ]

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 75

gdje: assembly_name

Zadaje ime registriranog sklopa koji treba ukloniti. WITH NO DEPENDENTS

Zadaje da se ovisni sklopovi ne uklanjaju. Izvođenje DROP ASSEMBLY naredbe ne utječe na sesije koje se trenutno izvode i koje izvode sklop koji se uklanja – one se izvode do kraja. Novi pokušaji za pozivanje koda iz sklopa ne uspijevaju. Ne može se ukloniti sklop koji je referenciran u drugom sklopu ili kojeg koristi CLR funkcija, pohranjena procedura, okidač, UDT ili UDA funkcija.

Korisnički definirane funkcije Korisnički definirana funkcija (engl. User-Defined Function, UDF) je rutina koju piše korisnik i koja vraća skalarnu vrijednost (funkcija skalarne vrijednosti) ili tablicu (funkcija tablične vrijednosti). SQL Server 2005 funkcije mogu se izraditi direktno iz T-SQL naredbe ili metode u registriranom .NET Framework sklopu. Korisnički definirane funkcije se izrađuju, mijenjaju i uklanjaju iz SQL Servera s pomoću T-SQL naredbi CREATE FUNCTION, ALTER FUNCTION i DROP FUNCTION. Ove naredbe poboljšane su u SQL Serveru 2005 kako bi podržavale CLR upravljanje korisnički definiranim funkcijama. Sljedeći odjeljci opisuju poboljšanja.

CREATE FUNCTION T-SQL naredba CREATE FUNCTION poboljšana je u SQL Serveru 2005 kako bi omogućila izradu CLR korisnički definirane funkcije skalarne ili tablične vrijednosti iz korisnički definirane funkcije implementirane kao metoda u .NET Framework sklopu. Prvo treba registrirati sklop s pomoću CREATE ASSEMBLY naredbe. Sintaksa CREATE FUNCTION za izradu CLR korisnički definirane funkcije: CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [AS] [ type_schema_name. ] scalar_parameter_data_type } [ ,...n ] ] ) RETURNS { scalar_return_data_type | TABLE clr_table_type_definition } [ WITH clr_function_option [ [,] ...n ] ] [ AS ] EXTERNAL NAME method_specifier [ ; ] method_specifier ::= assembly_name.class_name.method_name clr_table_type_definition ::= ( { column_name data_type }[ ,...n ] ) clr_function_option ::= [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ] | [ EXECUTE_AS_Clause ]

76 | Programiranje SQL Server 2005

gdje: [ schema_name. ] function_name

Zadaje ime CLR korisnički definirane funkcije koju treba izraditi. @parameter_name [AS] [ type_schema_name. ] scalar_parameter_data_type

Definira nula ili više parametara za UDF: @parameter_name

Zadaje ime parametra za funkciju. Parametar treba zadati tako da znak @ bude prvi znak. DEFAULT parametri ne mogu se zadati za CLR korisnički definirane funkcije. [ type_schema_name. ] scalar_parameter_data_type

Zadaje parametre tipa podataka i opcionalno njihovu shemu. To može biti bilo koji tip skalarnih podataka kojeg podržava SQL Server osim timestamp. Tip podataka povratne vrijednosti može također biti CLR UDT. char, varchar i ntext tipovi podataka ne mogu se zadati za CLR korisnički definirane funkcije skalarne vrijednosti – umjesto toga treba upotrebljavati samo nchar i nvarchar. scalar_return_data_type

Zadaje tipove podataka povratne vrijednosti korisnički definiranih funkcija skalarnih vrijednosti. To može biti bilo koji skalarni tip podataka kojeg podržava SQL Server osim text, ntext, image i timestamp. Tip podataka povratne vrijednosti može također biti CLR UDT. char, varchar i ntext tipovi podataka ne mogu se zadati za CLR korisnički definirane funkcije skalarnih vrijednosti – treba upotrebljavati samo nchar i nvarchar umjesto toga. clr_table_type_definition

Definira CLR tablicu koja se vraća iz korisnički definirane funkcije tablične vrijednosti: column_name

Zadaje ime stupca u tablici. data_type

Zadaje tip podataka stupca – timestamp i UDT nisu podržani. clr_function_option Zadaje OnNullCall atribut funkcije skalarne vrijednosti: RETURNS NULL ON NULL INPUT

Zadaje da SQL Server ne izvodi funkciju i vraća NULL kao rezultat funkcije ako je bilo koji od ulaznih argumenata NULL. CALLED ON NULL INPUT

Zadaje da SQL Server izvodi funkciju čak i ako je jedan ili više ulaznih argumenata NULL. Ako nije zadano, podrazumijevana vrijednost je CALLED ON NULL INPUT. Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 77

CREATE FUCTION vrijednost OnNullCall atributa ima prednost pred OnNullCall atri-

butom metode ako je zadano u .NET kodu. EXECUTE_AS_Clause

Zadaje kontekst sigurnosti izvođenja za korisnički definirane funkcije. method_specifier

Zadaje metodu u .NET Framework sklopu koja implementira korisnički definiranu funkciju. assembly_name

Zadaje ime registriranog sklopa koji sadrži metodu koja implementira CLR korisnički definiranu funkciju. class_name

Zadaje ime klase u sklopu koji implementira CLR korisnički definiranu funkciju. Ime klase može biti kvalificirano imenskim prostorom. U tom slučaju mora biti zatvoreno u uglaste zagrade ([]). method_name

Zadaje javnu statičku metodu klase koja implementira funkcionalnost CLR korisnički definirane funkcije.

ALTER FUNCTION T-SQL naredba ALTER FUNCTION poboljšana je u SQL Serveru 2005 kako bi omogućila modificiranje CLR korisnički definirane funkcije prethodno izrađene s pomoću CREATE FUNCTION naredbe. ALTER FUNCTION sintaksa za izradu CLR korisnički definirane funkcije slijedi: ALTER FUNCTION [ schema_name. ] function_name ( { @parameter_name [AS] [ type_schema_name. ] scalar_parameter_data_type } [ ,...n ] ) RETURNS { scalar_return_data_type | TABLE } [ WITH clr_function_option [ ,...n ] ] [ AS ] EXTERNAL NAME method_specifier method_specifier ::= [ assembly_schema. ] assembly_name.class_name.method_name clr_table_type_definition :: = ( { column_name data_type } [ ,...n ] ) clr_function_option ::= [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ] | [ EXECUTE_AS_Clause ]

Argumenti su isti kao i za naredbu CREATE FUNCTION razmatranu u prethodnoj cjelini.

78 | Programiranje SQL Server 2005

DROP FUNCTION DROP FUNCTION T-SQL naredba uklanja jednu ili više korisnički definiranih funkcija prethodno izrađenih s pomoću naredbe CREATE FUNCTION. SQL Server 2005 naredba DROP FUNCTION je ista kao u SQL Serveru 2000. Ona sada podržava uklanjanje CLR

korisnički definirane funkcije. DROP FUNCTION sintaksa je sljedeća: DROP FUNCTION { [ schema_name. ] function_name } [ ,...n ]

DROP FUNCTION neće uspjeti ako su T-SQL funkcije ili pogledi u bazi podataka izrađeni s pomoću SCHEMABINDING ili ako su funkcijom referencirani indeksirani izračunati stupci.

Pohranjene procedure Pohranjena procedura (engl. stored procedure) je spremljena kolekcija T-SQL naredbi ili referenci na CLR metodu koja opcionalno uzima i vraća argumente te vraća jedan ili više skupova rezultata za podatke. SQL Server 2005 pohranjene procedure mogu se izraditi direktno iz T-SQL naredbi ili iz metoda u registriranim .NET Framework sklopovima. Pohranjene procedure izrađuju se, ažuriraju i uklanjaju s pomoću T-SQL naredbi CREATE PROCEDURE, ALTER PROCEDURE i DROP PROCEDURE. Ove naredbe su poboljšane u SQL Serveru 2005 kako bi podržavale rad sa CLR pohranjenim procedurama. Sljedeći odjeljci opisuju ova poboljšanja.

CREATE PROCEDURE T-SQL naredba CREATE PROCEDURE poboljšana je u SQL Serveru 2005 kako bi omogućila izradu CLR pohranjene procedure iz pohranjene procedure koja je implementirana kao metoda u .NET Framework sklopu. Prvo treba registrirati sklop s pomoću CREATE ASSEMBLY naredbe kako što je učinjeno ranije, u odjeljku „Primjer Hello World“. Poboljšanja koja podržavaju CLR pohranjene procedure su istaknuta u CREATE PROCEDURE sintaksi koja slijedi: CREATE PROC [ EDURE ] [schema_name.] procedure_name [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ] [ WITH [ ,...n ] [ FOR REPLICATION ] AS { sql_statement [ ...n ] | method_specifier } procedure_option ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE_AS_Clause ] sql_statement ::= { [ BEGIN ] statements [ END ] } method_specifier ::= EXTERNAL NAME assembly_name.class_name.method_name

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 79

gdje su novi argumenti sljedeći: method_specifier

Zadaje metodu u .NET Framework sklopu koja implementira ovu pohranjenu proceduru. assembly_name

Zadaje ime registriranog sklopa koji sadrži metodu koja implementira pohranjenu proceduru. class_name

Zadaje ime klase u sklopu koja implementira pohranjenu proceduru. Ime klase može biti kvalificirano imenskim prostorom. U tom slučaju mora biti zatvoreno u zagrade ([]). method_name

Zadaje ime javne statičke metode koja implementira CLR pohranjenu proceduru.

ALTER PROCEDURE T-SQL naredba ALTER PROCEDURE poboljšana je u SQL Serveru 2005 kako bi omogućila izmjenu CLR pohranjene procedure prethodno izrađene s pomoću naredbe CREATE PROCEDURE. Poboljšanja koja podržavaju CLR pohranjene procedure su podebljana u ALTER PROCEDURE sintaksi koja slijedi: ALTER PROC [ EDURE ] [schema_name.] procedure_name [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ] [ WITH procedure_option [ ,...n ] ] [ FOR REPLICATION ] AS { sql_statement [ ...n ] | method_specifier } procedure_option ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE_AS_Clause ] sql_statement ::= { [ BEGIN ] statements [ END ] } method_specifier ::= EXTERNAL NAME [ assembly_schema. ] assembly_name.class_name.method_name

gdje su novi argumenti sljedeći: method_specifier

Zadaje metodu u .NET Framework sklopu koja implementira pohranjenu proceduru.

80 | Programiranje SQL Server 2005

assembly_schema

Zadaje ime sheme za sklop. Ako nije zadano, assembly_name mora odgovarati sklopu, ili u shemi tekućeg korisnika ili u dbo shemi. assembly_name

Zadaje ime registriranog sklopa koji sadrži metodu koja implementira pohranjenu proceduru. class_name

Zadaje ime klase u sklopu koja implementira pohranjenu proceduru. Ime klase može biti kvalificirano imenskim prostorom. U tom slučaju mora biti zatvoreno u zagrade ([]) method_name

Zadaje ime javne statičke metode koja implementira CLR pohranjenu proceduru.

DROP PROCEDURE T-SQL naredba DROP PROCEDURE uklanja jednu ili više pohranjenih procedura prethodno izrađenih s pomoću naredbe CREATE PROCEDURE. SQL Server 2005 DROP PROCEDURE naredba ista je kao i u SQL Serveru 2000. Sada podržava uklanjanje CLR pohranjenih procedura. DROP PROCEDURE sintaksa je sljedeća: DROP PROCEDURE { [ schema_name. ] procedure } [ ,...n ]

Metapodaci sys.procedures kataloški pogled sadrži red za svaku pohranjenu proceduru u tekućoj bazi podataka. Pogled nasljeđuje stupce od kataloških pogleda sys.objects i sys. all_objects tako da se vraćeni redovi mogu ograničiti na CLR pohranjene procedure

filtriranjem po stupcu tipa, kao što je prikazano u sljedećoj naredbi: SELECT * FROM sys.procedures WHERE type='PC'

Korisnički definirane agregatne funkcije Korisnički definirane agregatne funkcije (engl. User Defined Aggregate Functions, UDA) izračunavaju vrijednost za grupu u skupu rezultata. SQL Server 2005 UDA funkcije mogu se izraditi direktno iz T-SQL naredbe ili iz klase u registriranom .NET Framework sklopu. Klauzula WHERE sa zadanim tipom PC vraća CLR pohranjene procedure. Zadavanje tipa P vraća SQL pohranjene procedure.

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 81

UDA funkcije izrađuju se u SQL Serveru s pomoću T-SQL naredbi CREATE AGGREGATE i DROP AGGREGATE. Ove naredbe poboljšane su u SQL Serveru 2005 kako bi podržavale upravljanje CLR UDA funkcijama. Sljedeći odjeljci opisuju ta poboljšanja.

CREATE AGGREGATE T-SQL naredba CREATE AGGREGATE stvara UDA funkciju iz implementacije klase u registriranom sklopu. Sklop se prvo mora registrirati s pomoću CREATE ASSEMBLY naredbe. CREATE AGGREGATE sintaksa je sljedeća: CREATE AGGREGATE [ schema_name. ] aggregate_name ..(@parameter input_sqltype ) RETURNS return_sqltype EXTERNAL NAME assembly_name [ .class_name ] input_sqltype ::= ..system_scalar_type | { [ udt_schema_name. ] udt_type_name } return_sqltype ::= ..system_scalar_type | { [ udt_schema_name. ] udt_type_name }

gdje su novi argumenti: [ schema_name. ] aggregate_name

Zadaje ime CLR agregatne funkcija koja će se izraditi. @parameter input_sqltype

Zadaje ime parametra u CLR agregatnoj funkciji. Ime mora imati prefiks sa znakom at (@). Parametar može označavati samo konstantu, a ne imena objekata baze podataka kao što su imena tablica i stupaca. EXTERNAL NAME assembly_name [ .class_name ]

Zadaje registrirani .NET Framework sklop i opcionalno ime klase u sklopu koja implementira CLR agregatnu funkciju. Ako class_ name nije zadano, podrazumijevana vrijednost je aggregate_name. system_scalar_type

Zadaje SQL Server tip skalarnih podataka za unos ili za povratnu vrijednost. [ udt_schema_name. ] udt_type_name

Ime CLR korisnički definiranog tipa u SQL Serveru. Ako ime sheme nije zadano, podrazumijevana vrijednost je shema tekućeg korisnika.

DROP AGGREGATE T-SQL naredba DROP AGGREGATE uklanja korisnički definiranu agregatnu funkciju prethodno izrađenu s pomoću CREATE AGGREGATE naredbe.

82 | Programiranje SQL Server 2005

Slijedi DROP AGGREGATE sintaksa: DROP AGGREGATE [ schema_name. ] aggregate_name

gdje su argumenti sljedeći: [ schema_name. ] aggregate_name

Zadaje ime korisnički definirane agregatne funkcije koju treba ukloniti. Naredba DROP AGGREGATE se ne izvodi ako postoje pogledi, funkcije ili pohranjene procedure izrađene sa vezivanjem sheme koje referencira korisnički definiranu agregatnu funkciju.

Korisnički definirani tipovi podataka SQL Server 2000 podržava korisnički definirane tipove podataka (engl. User-Defined Types, UDT), također poznate kao alias tipove (engl. alias types). Takve tipove može izraditi s pomoću sistemske pohranjene procedure sp_addtypes. Izvode se iz tipova podataka ugrađenih u SQL Server i opcionalno imaju ograničenja integriteta koja se zovu pravila (engl. rules). SQL Server 2005 proširuje funkcionalnost korisnički definiranih tipova tako što omogućava definiranje CLR korisnički definiranih tipova iz klase u registriranom .NET Framework sklopu. CLR korisnički definiran tip može pohraniti višestruke sadržaje i izlagati metode, svojstva i atribute. Korisnički definiran tip se može upotrijebiti kao tip podataka za stupac u tablici, kao T-SQL varijabla ili kao parametar za pohranjene procedure ili funkcije. UDT se izrađuju i uklanjaju u SQL Serveru s pomoću T-SQL naredbi CREATE TYPE i DROP TYPE. Ove naredbe su poboljšane u SQL Serveru 2005 kako bi se podržalo CLR upravljanje korisnički definiranim tipovima. Sljedeći odjeljci opisuju poboljšanja.

CREATE TYPE Naredba CREATE TYPE poboljšana je u SQL Serveru 2005 kako bi omogućila izradu CLR korisnički definiranih tipova iz tipa implementiranog kao klasa ili struktura u .NET Framework sklopu. Prvo treba registrirati sklop s pomoću CREATE ASSEMBLY naredbe. Poboljšanja koja podržavaju CLR korisnički definirane tipove istaknuta su u sintaksi naredbe CREATE TYPE koja slijedi: CREATE TYPE [ schema_name. ] type_name { FROM base_type [ ( precision [ , scale ] ) ] [ NULL | NOT NULL ] | EXTERNAL NAME assembly_name [ .class_name ] }

gdje: [ schema_name. ] type_name

Zadaje ime CLR korisnički definiranog tipa koji treba izraditi. assembly_name

Zadaje ime registriranog sklopa koji implementira CLR korisnički definiran tip. Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 83

class_name

Zadaje ime klase koja implementira CLR korisnički definiran tip. Ime klase može biti kvalificirano imenskim prostorom. U tom slučaju mora biti zatvoreno u zagrade ([]).

DROP TYPE T-SQL naredba DROP TYPE uklanja korisnički definiran tip prethodno izrađen s pomoću naredbe CREATE TYPE. SQL Server 2005 DROP TYPE naredba jednaka je kao i u SQL Serveru 2000. Sada podržava uklanjanje CLR korisnički definiranog tipa. DROP TYPE sintaksa je sljedeća: DROP TYPE [ schema_name. ] type_name

gdje: [ schema_name. ] type_name

Zadaje ime korisnički definiranog tipa koji treba ukloniti. DROP TYPE se neće izvoditi ako u bazi podataka postoje tablice sa stupcima za korisnički definirane tipove, ako postoje stupci tipa podataka sql_variant koji sadrže

korisnički definiran tip ili ako postoje funkcije, pohranjene procedure ili okidači u bazi podataka izrađeni s pomoću klauzule WITH SCHEMABINDING koja koristi varijable ili parametre iz korisnički definiranog tipa.

Metapodaci Kataloški pogled sys.assemby_types sadrži red za sve CLR korisnički definirane tipove u tekućoj bazi podataka. Ovaj pogled nasljeđuje sve stupce iz kataloškog pogleda sys.types.

Okidači Okidač (engl. trigger) je tip pohranjene procedure koji se izvodi kao odgovor na jedan ili više događaja specifičnih za bazu podataka. DML okidači izvode se kada se podaci mijenjaju s pomoću T-SQL DML naredbi kao što su INSERT, UPDATE ili DELETE. DDL okidači izvode se kada su objekti baze podataka izmijenjeni s pomoću T-SQL DDL naredbi kao što su CREATE, ALTER i DROP. SQL Server 2005 DML i DDL okidači mogu se izraditi direktno iz T-SQL naredbi ili iz metoda u registriranom .NET Framework sklopu. Okidači se izrađuju, mijenjaju i uklanjaju s pomoću T-SQL naredbi CREATE TRIGGER, ALTER TRIGGER i DROP TRIGGER. Ove naredbe su poboljšane u SQL Serveru 2005 kako bi podržavale CLR upravljanje okidačima. Sljedeći odjeljci opisuju poboljšanja.

CREATE TRIGGER T-SQL naredba CREATE TRIGGER poboljšana je u SQL Serveru 2005 kako bi omogućila izradu CLR DML ili DDL okidača iz okidača implementiranog kao metoda u .NET 84 | Programiranje SQL Server 2005

Framework sklopu. Prvo treba registrirati sklop s pomoću CREATE ASSEMBLY naredbe. Poboljšanja koja podržavaju CLR okidače su istaknuta u ovom odjeljku. CREATE TRIGGER sintaksa za DML okidače je sljedeća: CREATE TRIGGER [ schema_name. ]trigger_name ON { TABLE | VIEW } [ WITH dml_trigger_option [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS { sql_statement [ ...n ] | EXTERNAL NAME method specifier } dml_trigger_option ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] method_specifier ::= assembly_name.class_name.method_name

Sintaksa CREATE TRIGGER za DDL okidače je sljedeća: CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH [,...n ] ] { FOR | AFTER } { event_type | event_group } [ ,...n ] AS { sql_statement [ ...n ] | EXTERNAL NAME } ddl_trigger_option ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] method_specifier ::= assembly_name.class_name.method_name

gdje su novi argumenti za DML i DDL okidače sljedeći: method_specifier

Zadaje metodu u .NET Framework sklopu koja implementira okidač. assembly_name

Zadaje ime registriranog sklopa koji sadrži metodu koja implementira okidač. class_name

Zadaje ime klase u sklopu koja implementira CLR okidač. Ime klase može biti kvalificirano imenskim prostorom. U tom slučaju mora biti zatvoreno u zagrade ([]). method_name

Zadaje javnu statičku metodu klase koja implementira funkcionalnost CLR okidača.

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 85

ALTER TRIGGER T-SQL naredba ALTER TRIGGER poboljšana je u SQL Serveru 2005 kako bi omogućila modificiranje DML ili DDL CLR okidača koji je prethodno izrađen s pomoću CREATE TRIGGER naredbe. Poboljšanja koja podržavaju CLR okidače istaknuta su u ovom odjeljku. ALTER TRIGGER sintaksa za DML okidače slijedi: ALTER TRIGGER schema_name.trigger_name ON ( TABLE | VIEW ) [ WITH dml_trigger_option [ ...,n ] ] ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ...n ] | EXTERNAL NAME method specifier } dml_trigger_option ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] method_specifier ::= [ assembly_schema. ] assembly_name.class_name.method_name

ALTER TRIGGER sintaksa za DDL okidače slijedi: ALTER TRIGGER trigger_name ON { DATABASE | ALL SERVER } [ WITH ddl_trigger_option [ ...,n ] ] { FOR | AFTER } { event_type [ ,...n ] | event_group } AS { sql_statement | EXTERNAL NAME method specifier } ddl_trigger_option ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] method_specifier ::= [ assembly_schema. ] assembly_name.class_name.method_name

Novi argumenti za DML i DDL okidače isti su kao i za CREATE TRIGGER naredbu razmotrenu u prethodnom odjeljku.

DROP TRIGGER T-SQL naredba DROP TRIGGER uklanja jedan ili više DML ili DDL okidača koji su prethodno stvoreni s pomoću naredbe CREATE TRIGGER. SQL Server 2005 naredba DROP TRIGGER jednaka je kao i u SQL Serveru 2000. Sada podržava i uklanjanje CLR okidača. Sintksa DROP TRIGGER za DML okidače je: DROP TRIGGER schema_name.trigger_name [ ,...n ]

DROP TRIGGER sintaksa za DDL okidače je: DROP TRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER }

86 | Programiranje SQL Server 2005

Metapodaci Kataloški pogled sys.triggers sadrži red za svaki okidač u tekućoj bazi podataka. Vraćeni redovi mogu se ograničiti na CLR okidače filtriranjem po stupcu tipa, kao što je prikazano u sljedećoj naredbi: SELECT * FROM sys.triggers WHERE type='TA'

ADO.NET unutarprocesna proširenja koja podržavaju CLR programiranje ADO.NET ima četiri glavna unutarprocesna proširenja koja se upotrebljavaju kada se programiraju .NET Framework rutine. Objekt SqlContext pruža pristup do konteksnih informacija, do SqlPipe objekta za slanje rezultata klijentu te do SqlTriggerContext objekta koji pruža informaciju o operaciji koja je uzrokovala okidač. Četvrta – objekt SqlDataRecord – vraća pozivatelju prilagođeni skup rezultata iz pohranjene procedure. Ova četiri proširenja bit će razmotrena u sljedećim odjeljcima.

SqlContext objekt Upravljani kod se poziva na poslužitelju kad god se izvodi CLR rutina. Kod koji se izvodi na poslužitelju izvodi se u kontekstu veze pozivatelja, tako da CLR kod treba pristup do konteksta pozivatelja. SqlContext klasa u imenskom prostoru Microsoft. SqlServer.Server apstrahira kontekst pozivatelja i pruža pristup komponentama konteksta kroz njegova javna statička svojstva, opisana u tablici 4-12. Tablica 4-12. SqlContext javna svojstva Svojstvo

Povratni tip

Opis

IsAvailable

bool

Označava izvodi li se kod unutar SQL Servera. Ako je true, može se pristupiti drugim članovima SqlContexta. Ako je false, sva će druga svojstva izazvati InvalidOperationException tokom pristupa. Svi pokušaji za otvaranje veze s pomoću context connection = true atributa u nizu znakova veze neće u tom slučaju uspjeti.

Pipe

SqlPipe

Put za poruke i sklopove rezultata koji trebaju teći klijentu.

TriggerContext

SqlTriggerContext

Pruža pristup informacijama o operaciji koja je izazvala DML ili DDL okidač. Također pruža mapu ažuriranih stupaca. TriggerContext se može dobiti samo unutar CLR okidača.

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 87

Tablica 4-12. SqlContext javna svojstva (nastavak) Svojstvo WindowsIdentity

Povratni tip

Opis

System.Security. Principal. WindowsIdentity

Pruža pristup imenu koje predstavlja Windows identitet pozivatelja ako klijent koji je započeo izvođenje pohranjene procedure ili funkcije priključene na SQL Server koristi integriranu provjere autentičnosti. Vraća se null ako je autentičnost pozivatelja provjerena s pomoću SQL Server postupka za provjeru autentičnosti pa kod ne može imitirati pozivatelja. Račun SQL Server procesa je kontekst za sav CLR kod koji se poziva unutar SQL Servera. Ime se upotrebljava kako bi se omogućilo da kod obavlja akcije uz korištenje identiteta pozivatelja umjesto identiteta računa procesa. Samo sklopovi označeni s dopuštenjem EXTERNAL_ACCESS ili UNSAFE mogu pristupati WindowsIdentity svojstvu.

Vezu unutar procesa dobijate s pomoću nove ključne riječi connection context. Na primjer: SqlConnection conn = new SqlConnection("context connection=true")

SqlPipe objekt SqlPipe objekt koristi se za slanje poruka i skupova rezultata iz CLR pohranjene procedure klijentu pozivatelju. SqlPipe objekt se ne može izravno instancirati. SqlPipe objekt dobije se pomoću Pipe svojstva SqlContext objekta unutar tijela CLR rutine, kao što je prikazano u odjeljku „Primjer Hello World“ ranije u ovom poglavlju. SqlPipe

klasa ima javna svojstva i metode opisane u tablici 4-13. Tablica 4-13. SqlPipe javna svojstva i metode Svojstvo

Opis

IsSendingResults

Označava je li cijev (engl. Pipe) u procesu slanja skupa rezultata, čime sprječava njegovu upotrebu.

Metoda ExecuteAndSend()

Izvodi naredbu zadanu kao argument SqlCommand objekta. Rezultati se šalju izravno natrag klijentu.

Send()

Tri preopterećene inačice šalju klijentu jednu od sljedećih vrijednosti: • string (informacijska poruka – ekvivalentno T-SQL PRINT naredbi). • SqlDataRecord objekt (skup rezultata u jednom redu). • SqlDataReader objekt (skup rezultata u više redova).

SendResultsEnd()

Označava kraj prilagođenog skupa rezultata iz pohranjene procedure inicirane SendResultsStart() metodom. Postavlja SqlPipe objekt natrag u stanje u kojem se druge metode mogu pozivati na njemu. Ova metoda može se pozvati tek nakon što se pozove SendResultsStart().

88 | Programiranje SQL Server 2005

Tablica 4-13. SqlPipe javna svojstva i metode (nastavak) Svojstvo

Opis

SendResultsRow()

Šalje klijentu redove podataka sadržane u SqlDataRecord objektu. Ova metoda može se pozivati tek nakon što se pozove SendResultsStart(). Svaki red mora odgovarati SqlDataRecord argumentu koji opisuje red koji se šalje SendResultsStart() metodi.

SendResultsStart()

Označava početak prilagođenog skupa rezultata iz pohranjene procedure. Ova metoda uzima SqlDataRecord argument za konstrukciju metapodataka koji opisuju skup rezultata. Svi redovi u skupu podataka koji se nakon toga šalju klijentu s pomoću metode SendResultsRow() moraju odgovarati ovim metapodacima.

SqlTriggerContext objekt SqlTriggerContext klasa pruža kontekstne informacije o DML ili DDL CLR okidaču. SqlTriggerContext objekt ne može se direktno instancirati. SqlTrigger objekt dobije se s pomoću TriggerContext svojstva SqlContext objekta unutar tijela CLR okidača. SqlTriggerContext klasa ima javna svojstva i metode opisane u tablici 4-14. Tablica 4-14. SqlTriggerContext javna svojstva i metode Svojstvo

Opis

ColumnCount

Broj stupaca na koje potencijalno može djelovati UPDATE operacija koja je uzrokovala okidanje DML okidača.

EventData

SqlXml objekt koji sadrži XML s opisom operacije okidanja za DDL okidač.

TriggerAction

Tip akcije koja je uzrokovala okidanje okidača. Ovo je jedna od TriggerAction enumeracijskih vrijednosti.

IsUpdatedColumn()

Označava je li stupac označen brojem modificiran UPDATE operacijom koja je uzrokovala okidanje DML okidača.

SqlDataRecord objekt SqlDataRecord klasa predstavlja jedan red podataka zajedno s njegovim metapoda-

cima. Klasa omogućava pohranjenim procedurama da klijentu vrate prilagođene skupove rezultata s pomoću Send( ) ili SendResultsRow() metoda objekta SqlPipe. SqlDataRecord objekt se instancira prosljeđivanjem polja objekata SqlMetaData koje sadrži element metapodataka za svaki stupac u retku. Svaki SqlMetaData objekt defi-

nira ime stupca, tip stupca te možda ostale atribute stupca. Na primjer, sljedeći kod definira SqlDataRecord koji sadrži dva stupca: SqlMetaData[] md = new SqlMetaData[2]; md[0] = new SqlMetaData("intCol", SqlDbType.Int); md[1] = new SqlMetaData("stringCol", SqlDbType.NVarChar, 50); SqlDataRecord row = new SqlDataRecord(md);

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 89

SqlDataRecord klasa ima pristupne metode koje omogućavaju uzimanje i postavljanje vrijednosti stupca. To je slično DataReaderu osim što se uz čitanje mogu i zapisati vrijednosti stupca. Na primjer, sljedeći kod popunjava dva stupca u SqlDataRecord objektu

definiranom u prethodnom primjeru: row.SetSqlInt32(0, 1); row.SetSqlString(1, "Record 1");

Prilagođeni atributi za CLR rutine .NET CLR je proširen s pomoću atributa – opisnih ključnih riječi spremljenih u metapodacima sklopa koje pružaju dodatne informacije za programske konstrukcije. Prilagođeni atributi koji se koriste uz SQL Server 2005 CLR rutine definirani su u Microsoft.SqlServer.Server imenskom prostoru. Tablica 4-15 opisuje prilagođene atribute koji se koriste uz SQL Server CLR rutine. Tablica 4-15. Prilagođeni atributi za CLR rutine Atribut

CLR rutina

Opis

SqlFacet

UDT

Zadaje detalje o povratnom korisnički definiranom tipu.

SqlFunction

UDF

Označava da se metoda treba registrirati kao korisnički definirana funkcija.

SqlMethod

UDT

Zadaje deterministička svojstva metoda i svojstva za pristup podacima u korisnički definiranom tipu.

SqlProcedure

Pohranjena procedura

Zadaje da se metoda treba registrirati kao pohranjena procedura.

SqlTrigger

Trigger

Zadaje da se metoda treba registrirati kao okidač.

SqlUserDefinedAggregate

UDA

Zadaje da se metoda treba registrirati kao korisnički definirana agregatna funkcija.

SqlUserDefinedType

UDT

Zadaje da se metoda ili struktura treba registrirati kao korisnički definiran tip.

Ovi se atributi detaljno razmatraju u poglavlju 5, u odjeljcima o .NET Framework rutinama koje ih upotrebljavaju.

SQL Server tipovi podataka u .NET Frameworku Imenski prostor System.Data.SqlTypes je dio bazne biblioteke klasa u .NET Frameworku. Imenski prostor pruža tipove podataka koji se preslikavaju na izvorne SQL Server tipove podataka. Postoji razlika između SqlTypes i .NET Framework tipova podataka: • SqlTypes tipovi podataka podržavaju NULL vrijednosti dok .NET Framework tipovi podataka to ne čine. Svi aritmetički i bitovni operatori te većina funkcija vraćaju NULL ako je bilo koji od SqlTypes operanada ili argumenata NULL. 90 | Programiranje SQL Server 2005

• SqlTypes pruža SqlBoolean tip podataka koji predstavlja trovrijednosnu logičku vrijednost – true, false i null (nepoznata vrijednost). • .NET Framework Decimal tip podataka i odgovarajući SQL Server Decimal tip podataka imaju različite maksimalne vrijednosti. Decimal tip podataka pretpostavlja maksimalnu preciznost, dok SqlDecimal tip podataka i SQL Server Decimal tip podataka imaju istu maksimalnu preciznost, skalu i semantiku. • Kada se upotrebljavaju SqlTypes tipovi podataka, iznimke se izbacuju za sve pogreške preopterećenja i podopterećenja te za pogreške dijeljenja s nulom. Ovakvo ponašanje nije garantirano za .NET Framework tipove podataka. Tablica 4-16 navodi SQL Server tipove podataka i njihove ekvivalente u System.Data. SqlTypes imenskom prostoru te u .NET Frameworku. Tablica 4-16. SQL Server, System.Data.SqlTypes i .NET Framework ekvivalenti tipova podataka SQL Server tip podataka

System.Data.SqlTypes tip podataka

.NET Framework tip podataka

Varbinary

SqlBytes, SqlBinary

Byte[]

binary

SqlBytes, SqlBinary

Byte[]

image

Nema

Nema

varchar

Nema

Nema

char

Nema

Nema

nvarchar

SqlChars, SqlString

String, Char[]

nchar

SqlChars, SqlString

String, Char[]

text

Nema

Nema

ntext

Nema

Nema

uniqueidentifier

SqlGuid

Guid

rowversion

Nema

Byte[]

bit

SqlBoolean

Boolean

tinyint

SqlByte

Byte

smallint

SqlInt16

Int16

int

SqlInt32

Int32

bigint

SqlInt64

Int64

smallmoney

SqlMoney

Decimal

money

SqlMoney

Decimal

numeric

SqlDecimal

Decimal

decimal

SqlDecimal

Decimal

real

SqlSingle

Single

float

SqlDouble

Double

smalldatetime

SqlDateTime

DateTime

Poglavlje 4: Uvod u Common Language Runtime (CLR) integraciju | 91

Tablica 4-16. SQL Server, System.Data.SqlTypes i .NET Framework ekvivalenti tipova podataka (nastavak) SQL Server tip podataka

System.Data.SqlTypes tip podataka

.NET Framework tip podataka

datetime

SqlDateTime

DateTime

sql_variant

Nema

Object

Korisnički definiran tip (UDT)

Nema

Ista klasa povezana s tipom u registriranom ili ovisnom sklopu.

table

Nema

Nema

cursor

Nema

Nema

timestamp

Nema

Nema

xml

SqlXml

Nema

CLR rutine za pronalaženje i uklanjane pogrešaka SQL Server 2005 omogućava uklanjane pogrešaka u T-SQL objektima baze podataka kao i u CLR rutinama. SQL Server 2005 se ne isporučuje s alatom za uklanjanje pogrešaka tako da se mora upotrebljavati Visual Studio 2005. Slijedite ove korake za korištenje Visual Studio 2005 alata za uklanjanje pogrešaka kako biste prošli kroz izvorni kod registriranih CLR sklopova kada se izvode T-SQL naredbe s pomoću .NET Framework rutina: 1. Dodajte registriranom sklopu PDB datoteku – datoteku koja sadrži informacije za uklanjanje pogrešaka i informacije o stanju projekta. Na primjer, za dodavanje PDB datoteke u projekt HelloWorld iz odjeljka „Primjer Hello World“ ranije u ovom poglavlju, izvedite slijedeću T-SQL naredbu: ALTER ASSEMBLY HelloWorld ADD FILE FROM 'C:\PSS2005\HelloWorld\HelloWorld\bin\Debug\HelloWorld.pdb'

2. U Visual Studiju 2005 odaberite Debug ➝ Attach to Process. 3. Potvrdite polje Show processes from all users u Attach to Process dijaloškom okviru. 4. Odaberite sqlservr.exe s popisa Available Processes. Pritisnite gumb Attach i zatvorite dijaloški okvir. 5. Postavite točku prekida u izvorni kod, u sljedeći red: SqlContext.Pipe.Send("Hello world.\n");

6. Pokrenite pohranjenu proceduru iz SQL Server Management Studija: exec HelloWorldSP

Izvođenje će se zaustaviti na točki prekida koju ste postavili u Visual Studio IDE-u.

92 | Programiranje SQL Server 2005

POGLAVLJE 5

Programiranje SQL Server CLR rutina

Ovo poglavlje pokazuje kako izraditi svaki tip SQL Server 2005 CLR rutina, a to su: korisnički definirane funkcije (funkcije sa skalarnim vrijednostima i funkcije s tabličnim vrijednostima), pohranjene procedure, korisnički definirane agregatne funkcije, korisnički definirani tipovi podataka te DML i DDL okidači. Svi primjeri u ovom poglavlju koriste Visual Studio 2005 za izradu i prevođenje CLR rutina. Ako nemate Visual Studio 2005, možete upotrijebiti C# prevoditelj za odzivnik (csc.exe) koji je opisan u poglavlju 4.

Funkcije sa skalarnim vrijednostima Funkcija sa skalarnim vrijednostima (engl. Scalar Value Functions, SVF) je korisnički definirana funkcija sa svojstvom da vraća jednu vrijednost. Funkcije sa skalarnim vrijednostima mogu imati argumente i povratne vrijednosti bilo kojeg skalarnog tipa podataka kojeg podržava SQL Server, osim rowversion, text, ntext, image, timestamp, table ili cursor. SVF funkcija se implementira kao metoda klase u .NET Framework sklopu. Povratna vrijednost koju metoda vraća mora biti kompatibilna sa SQL Server tipom podataka. Tablica 4-16 navodi SQL Server tipove podataka i njima ekvivalentne CLR tipove podataka. .NET funkcije sa skalarnom ili tabličnom vrijednošću identificiraju se obilježavanjem metode u kojoj je implementirna funkcija atributom SqlFunction. Uz to što označava da se metoda treba registrirati kao funkcija, SqlFunction atribut se može upotrijebiti za definiranje karakteristika funkcije. SqlFunction atribut ima sljedeću sintaksu: SqlFunction [ ( function-attribute [,...] ) ] function-attribute::= IsDeterministic = {true | false} | DataAccess = { DataAccessKind.None | DataAccessKind.Read } | SystemDataAccess = { SystemDataAccessKind.None | SystemDataAccessKind.Read } | IsPrecise = { true | false } | FillRowMethodName = string | Name = string | TableDefinition = string

93

gdje: IsDeterministic

Zadaje vraća li funkcija uvijek iste izlazne vrijednosti za isti skup ulaznih vrijednosti i za isto stanje baze podataka. To omogućava poslužitelju da provede optimizaciju performansi. Podrazumijevana vrijednost je false. DataAccess = { DataAccessKind.None | DataAccessKind.Read }

Zadaje tip pristupa podacima koji funkcija zahtijeva ako pristupa podacima na lokalnom SQL Serveru ili na udaljenom poslužitelju u slučaju kada je potrebna integracija transakcije. DataAccess argument uzima jednu od dvije vrijednosti DataAccessKind enumeracije: DataAccessKind.None

Funkcija ne pristupa podacima. DataAccessKind.Read

Funkcija samo čita podatke. DataAccess svojstvo trebalo bi postaviti na DataAccessKind.Read ako se izvodi T-SQL

naredba unutar CLR rutine sa skalarnom ili tabličnom vrijednošću. Korisnički definirane funkcije ne mogu umetati, ažurirati ili brisati podatke. SystemDataAccess = { SystemDataAccessKind.None | SystemDataAccessKind.Read }

Zadaje tip pristupa podacima koji funkcija zahtijeva ako pristupa podacima pohranjenim u sistemske kataloge ili virtualne sistemske tablice. SystemDataAccess argument uzima jednu od dvije vrijednosti SystemDataAccessKind enumeracije: SystemDataAccessKind.None

Funkcija ne pristupa podacima. Ovo je podrazumijevana vrijednost. SystemDataAccessKind.Read

Funkcija samo čita podatke. IsPrecise

Zadaje ovisi li povratna vrijednost funkcije o nepreciznim izračunima koji uključuju single ili double tipove podataka (float ili real u SQL Serveru). Ovo se svojstvo upotrebljava za zadavanje mogu li se indeksirati izračunati stupci korišteni u funkciji. Podrazumijevana vrijednost je false. FillRowMethodName

Zadaje ime metode koju funkcija s tabličnim vrijednostima koristi za popunjavanje reda podataka u tablici koju vraća funkcija. Metode za popunjavanje redova obrađene su u sljedećem odjeljku, „Funkcije s tabličnim vrijednostima“. Name

Zadaje ime pod kojim se funkcija treba registrirati na SQL Serveru. TableDefinition

Zadaje raspored tablice koju vraća funkcija s tabličnim vrijednostima. 94 | Programiranje SQL Server 2005

Sljedeći primjer izrađuje, registrira i izvodi funkciju s skalarnim vrijednostima. Ova funkcija vraća ukupni iznos za specifičnu narudžbu zbrajanjem LineTotal vrijednosti u Sales.SalesOrderDetail tablici u bazi AdventureWorks za zadani identifikator narudžbe. Slijedite ove korake: 1. S pomoću Visual Studio 2005 IDE-a izradite novi SQL Server projekt i nazovite ga ScalarUdf. 2. Stvorite korisnički definiranu funkciju u projektu tako što ćete desnom tipkom miša pritisnuti projekt u Solution Exploreru te odabrati Add ➝ User-Defined Function s kontekstnog izbornika. Nazovite funkciju SumLineTotal te pritisnite gumb Add. 3. Dodajte sljedeću using direktivu za pristupanje ADO.NET imenskom prostoru: using System.Data.SqlClient;

4. Modificirajte SqlFunction atribut kako biste zadali da će funkcija čitati podatke: [SqlFunction(DataAccess = DataAccessKind.Read)]

5. Promijenite povratni tip metode SumLineTotal( ) iz SqlString u SqlMoney kako bi se slagao s tipom podataka LineTotal stupca koji se zbraja. Dodajte int argument salesOrderID metodi SumLineTotal( ). 6. Dodajte sljedeći kod metodi SumLineTotal( ) kako bi se izvelo računanje: using using using using using using

System; System.Data; System.Data.Sql; System.Data.SqlTypes; Microsoft.SqlServer.Server; System.Data.SqlClient;

public partial class UserDefinedFunctions { [SqlFunction(DataAccess = DataAccessKind.Read)] public static SqlMoney SumLineTotal(int salesOrderID) { using (SqlConnection conn = new SqlConnection("context connection=true")) { conn.Open( ); SqlCommand cmd = new SqlCommand( "SELECT SUM(LineTotal) " + "FROM Sales.SalesOrderDetail " + "WHERE SalesOrderID=" + salesOrderID, conn); return (decimal)cmd.ExecuteScalar(

);

} } }

Funkcija čita podatke iz SQL Servera pa je svojstvo DataAccess atributa SqlFunction postavljeno na DataAccessKind.Read.

Poglavlje 5: Programiranje SQL Server CLR rutina | 95

Treba uočiti da je povratna vrijednost decimalna, što se slaže sa SQL Server tipom Money. Tablica 4-16 popisuje SQL Server tipove podataka i njihove ekvivalentne CLR tipove podataka. 7. Izgradite rješenje. 8. U SQL Server Management Studiju registrirajte sklop i izradite funkciju sa skalarnim vrijednostima izvođenjem upita: USE AdventureWorks GO CREATE ASSEMBLY ScalarUdf FROM 'C:\PSS2005\ScalarUdf\ScalarUdf\bin\Debug\ScalarUdf.dll' GO CREATE FUNCTION SumLineTotal(@salesOrderID int) RETURNS MONEY AS EXTERNAL NAME ScalarUdf.UserDefinedFunctions.SumLineTotal

9. Execute the scalar-valued function with the following T-SQL statement: SELECT dbo.SumLineTotal(43660)

Rezultati su prikazani na slici 5-1.

Slika 5-1. Rezultati primjera funkcije sa skalarnim vrijednostima

Funkcije s tabličnim vrijednostima Funkcija s tabličnim vrijednostima je korisnički definirana funkcija koja vraća tablicu. Funkcija sa tabličnom vrijednošću se implementira kao metoda klase u .NET Framework sklopu koja vraća podatke kao IEnumerable ili IEnumerator objekt. Stupci vraćene tablice ne mogu uključivati timestamp stupce ili stupce podataka u obliku niza znakova koji nisu Unicode kao što su char, varchar, i text. CLR funkcije sa tabličnim vrijednostima su slične svojim T-SQL pandanima – glavna razlika je u tome što T-SQL funkcija sa tabličnim vrijednostima privremeno pohranjuje podatke u međutablicu, dok CLR funkcija sa tabličnim vrijednostima šalje rezultate natrag korisniku. Kao rezultat, T-SQL funkcija sa tabličnim vrijednostima podržava ograničenja i jedinstvene indekse na skupu rezultata dok se CLR funkcija sa tabličnim vrijednostima može konzumirati u koracima, nakon što se prvi red dobije na raspolaganje – skup rezultata ne treba biti potpuno materijaliziran prije vraćanja vrijednosti. Sljedeći primjer stvara, registrira i izvodi funkciju s tabličnim vrijednostima koja vraća tablicu sa Name, Length i ModifiedDate za svaku datoteku u zadanoj mapi. Slijedite ove korake: 96 | Programiranje SQL Server 2005

Enumeratori Sučelje IEnumerator podržava jednostavne iteracije preko negeneričke kolekcije. To je bazno sučelje za sve negeneričke enumeratore. Enumerator može čitati podatke u temeljnoj kolekciji, ali ne može se upotrijebiti za modificiranje podataka. IEnumerator ima jedno javno svojstvo, Current, i dvije javne metode, MoveNext() i Reset(). Početno se enumerator pozicionira ispred prvog elementa u kolekciji. • Svojstvo Current vraća objekt koji sadrži tekući element u kolekciji. Enumerator se mora pomaknuti s počenog položaja do prvog elementa u kolekciji pozivanjem MoveNext() prije čitanja vrijednosti svojstva Current. Čitanje svojstva Current kada enumerator nije postavljen ne element u kolekciji (prije prvog ili iza zadnjeg elementa) vraća InvalidOperationException. • Metoda MoveNext() pomiče enumerator do sljedećeg elementa u kolekciji. MoveNext() vraća true ako se enumerator uspješno pomaknuo i vraća false ako je enumerator prošao kraj kolekcije. • Metoda Reset()postavlja enumerator na početni položaj prije prvog elementa u kolekciji. IEnumerable sučelje ima jednu metodu, GetEnumerator(), koja vraća IEnumerator

objekt.

1. S pomoću Visual Studio 2005 IDE-a izradite novi SQL Server projekt i nazovite ga TableUdf. 2. Izradite stavku korisnički definirane funkcije u projektu. Nazovite funkciju ReadDirectoryFileInfo. 3. Zamijenite kod u klasi sljedećim kodom: using using using using using using using

System; System.Collections; System.Data; System.Data.Sql; System.Data.SqlTypes; Microsoft.SqlServer.Server; System.IO;

public partial class UserDefinedFunctions { [SqlFunction(FillRowMethodName = "FillRow", TableDefinition = "FileName nvarchar(256), Size int, DateModified datetime")] public static IEnumerator ReadDirectoryEntries(string path) { return new DirectoryLoader(path); } private static void FillRow(object obj, out SqlString fileName, out SqlInt64 fileLength, out SqlDateTime dateModified) {

Poglavlje 5: Programiranje SQL Server CLR rutina | 97

if (obj != null) { DirectoryEntry de = (DirectoryEntry)obj; fileName = de._fileName; fileLength = de._fileLength; dateModified = de._fileDateModified; } else { fileName = SqlString.Null; fileLength = SqlInt64.Null; dateModified = SqlDateTime.Null; } } } public partial class DirectoryLoader : IEnumerator { // Polje koje sprema mape private FileInfo[] fia; private int index = -1; public DirectoryLoader(string path) { string[] files = Directory.GetFiles(path); fia = new FileInfo[files.Length]; for (int i = 0; i < files.Length; i++) fia[i] = new FileInfo(files[i]); } public object Current { get { if (index != -1) return new DirectoryEntry(fia[index].Name, fia[index].Length, fia[index].LastWriteTime); else return null; } } public bool MoveNext( ) { if (index == fia.Length - 1) return false; index++; return true; } public void Reset( { index = -1; }

98 | Programiranje SQL Server 2005

)

} public partial class DirectoryEntry { internal string _fileName; internal long _fileLength; internal DateTime _fileDateModified; public DirectoryEntry(string fileName, long fileLength, DateTime fileDateModified) { _fileName = fileName; _fileLength = fileLength; _fileDateModified = fileDateModified; } }

Kod sadrži tri klase – UserDefinedFunctions, koje implementiraju funkcije sa tabličnim vrijednostima i dvije pomoćne klase: UserDefinedFunctions Metoda ReadDirectoryEntries() implementira funkcija sa tabličnim vrijednostima. Označava se SqlFunction atributom koji je opisan u prethodnom odjeljku. SqlFunction atribut identificira javnu metodu FillRow( ) kao metodu

koju SQL Server upotrebljava za preslikavanje elementa tekućeg enumeratora u red u tablici koji vraća funkcija sa tabličnim vrijednostima. SqlFunction atribut također zadaje svojstvo TableDefinition koje definira zapis u tablici vraćen iz funkcije sa tabličnim vrijednostima. DirectoryLoader

Enumerator koji stvara kolekciju mapa za putanju zadanu kao argument svojem konstrutoru. Sadržaj mape pohranjuje se u FileInfo polje fia. Svojstvo Current enumeratora vraća instancu DirectoryEntry koja sadrži ime i duljinu datoteke te datum modifikacije. DirectoryEntry

Definira klasu upotrebljenu za pohranjivanje tekućeg elementa u enumeratoru mape. 4. Izgradite rješenje. 5. U SQL Server Management Studiju registrirajte sklop i stvorite funkciju s tabličnim vrijednostima izvođenjem ovog upita: USE ProgrammingSqlServer2005 GO ALTER DATABASE ProgrammingSqlServer2005 SET TRUSTWORTHY ON GO CREATE ASSEMBLY TableUdf FROM 'C:\PSS2005\TableUdf\TableUdf\bin\Debug\TableUdf.dll'

Poglavlje 5: Programiranje SQL Server CLR rutina | 99

WITH PERMISSION_SET = EXTERNAL_ACCESS GO CREATE FUNCTION ReadDirectoryEntries(@path nvarchar(256)) RETURNS TABLE (FileName nvarchar(256), Length bigint, DateModified datetime) AS EXTERNAL NAME TableUdf.UserDefinedFunctions.ReadDirectoryEntries

Uočite da je sklop registriran s EXTERNAL_ACCESS dopuštenjem postavljenim tako da se dopusti pristup sustavu datoteka. 6. Izvedite funkciju s tabličnim vrijednostima s pomoću sljedeće T-SQL naredbe: SELECT * FROM ReadDirectoryEntries('c:\')

Rezultati su prikazani na slici 5-2.

Slika 5-2. Rezultati primjera funkcije sa tabličnim vrijednostima

Pohranjene procedure Pohranjene procedure su rutine koje vraćaju tablične skupove podataka, poruke i izlazne parametre klijentu i pozivaju DML i DDL naredbe. CLR pohranjena procedura se implementira kao public static metoda klase u .NET Framework sklopu. Metoda je ili void ili vraća integer koji je povratna šifra iz pohranjene procedure. Metoda deklarirana sa void implicitno vraća 0 kao povratnu šifru pohranjene procedure . Pohranjene procedure se identificiraju obilježavanjem metode koja implementira pohranjenu proceduru atributom SqlProcedure. On označava da metodu treba registrirati kao pohranjenu proceduru. Atribut SqlProcedure ima sljedeću sintaksu: SqlProcedure [ ( procedure-attribute [ ,... ] ) ] procedure-attribute::= Name = "procedure name"

100 | Programiranje SQL Server 2005

gdje: Name

Zadaje ime pohranjene procedure. Argumenti metode pohranjene procedure mogu biti bilo koji izvorni SQL Server tipovi podataka koji imaju svoj ekvivalent u upravljanom kodu. CLR pohranjene procedure mogu klijentu vraćati informaciju u obliku poruka, tabličnih skupova rezultata i izlaznih parametara. Poruke i tablični skupovi podataka šalju se s pomoću jedne od Send( ) metoda iz SqlPipe objeta ili s pomoću ExecuteAndSend( ) metode SqlPipe objekta. SqlPipe objekt je opisan u poglavlju 4. Izlazni parametri su argumenti koji se prosljeđuju na isti način kao i drugi izlazni argumenti (tj. s pomoću ključne riječi out u jeziku C#). Sljedeći primjer stvara, registrira i izvodi pohranjenu proceduru koja vraća tablični skup rezultata svih zaposlenika koji rade u smjeni zadanoj u HumanResources.Shift tablici u AdventureWorks. Pohranjena procedura uzima identifikator smjene kao jedini argument. Slijedite ove korake: 1. S pomoću Visual Studio 2005 IDE-a izradite novi SQL Server projekt i nazovite ga StoredProcedure. 2. Dodajte projektu stavku pohranjene procedure i nazovite ju EmployeesInShift. cs. 3. Zamijenite EmployeesInShiftCode.cs kod sljedećim: using using using using using using

System; System.Data; System.Data.Sql; Microsoft.SqlServer.Server; System.Data.SqlTypes; System.Data.SqlClient;

public partial class StoredProcedures { [SqlProcedure] public static void EmployeesInShift(int shiftID) { using (SqlConnection conn = new SqlConnection("context connection=true")) { conn.Open( ); SqlCommand cmd = new SqlCommand( "SELECT e.* FROM HumanResources.Employee e " + "JOIN HumanResources.EmployeeDepartmentHistory h " + "ON e.EmployeeID = h.EmployeeID " + "WHERE h.ShiftID = " + shiftID, conn); SqlContext.Pipe.ExecuteAndSend(cmd); } } };

Poglavlje 5: Programiranje SQL Server CLR rutina | 101

Metoda EmployeesInShift( ) implementira pohranjenu proceduru i obilježava se sa atributom StoredProcedure. Skup tabličnih rezultata vraća se klijentu s pomoću metode ExecuteAndSend( ) objekta SqlPipe koji izvodi naredbu i šalje skup tabličnih rezultata izravno klijentu. Metoda uzima jedan parametar koji je SqlCommand objekt povezan s kontekstnom vezom. Alternativno se može poslati skup tabličnih rezultata klijentu s pomoću Send(SqlDataReader) ili metode Send(SqlDataRecord) objekta SqlPipe. Sljedeći red koda zamjenjuje ExecuteAndSend() metodu upotrijebljenu u ovom primjeru metodom Send(SqlDataReader): SqlContext.Pipe.Send(cmd.ExecuteReader(

));

Metode Send( ) omogućavaju postupanje s podacima prije nego ih se pošalje klijentu, ali su nešto sporije zbog dodatnog opterećenja. 4. Izgradite rješenje. 5. Registrirajte sklop i izradite pohranjenu proceduru izvođenjem sljedeće T-SQL naredbe u SQL Server Management Studiju: USE AdventureWorks GO CREATE ASSEMBLY EmployeeInShift FROM 'C:\PSS2005\StoredProcedure\StoredProcedure\bin\Debug\StoredProcedure.dll' GO CREATE PROCEDURE EmployeeByShiftSP @shiftID int AS EXTERNAL NAME EmployeeInShift.StoredProcedures.EmployeesInShift

6. Izvedite pohranjenu proceduru: EXEC EmployeeByShiftSP @shiftID=1

Skup rezultata su svi zaposlenici sa zadanim identifikatorom smjene. Parcijalni rezultati prikazani su na slici 5-3.

Slika 5-3. Rezultati primjera pohranjene procedure koja vraća tablični skup podataka

102 | Programiranje SQL Server 2005

Sljedeći primjer CLR pohranjene procedure vraća izlazni parametar, poruku i povratni kod: 1. Dodajte sljedeću metodu klasi StoredProcedure izrađenoj u prethodnom primjeru: [SqlProcedure] public static int EmployeeByShift2SP(out int outputVal) { outputVal = 10; SqlContext.Pipe.Send("Test message."); return 5; }

Granica za povratni niz znakova je 8 000 znakova. Dodatni znakovi se uklanjaju. 2. Izgradite rješenje. 3. Ažurirajte registraciju sklopa u SQL Serveru i izradite novu pohranjenu proceduru izvođenjem ove T-SQL naredbe: ALTER ASSEMBLY EmployeeInShift FROM 'C:\PSS2005\StoredProcedure\StoredProcedure\bin\Debug\StoredProcedure.dll' GO CREATE PROCEDURE EmployeeByShift2SP @outputVal int OUT AS EXTERNAL NAME EmployeeInShift.StoredProcedures.EmployeeByShift2SP

4. Izvedite pohranjenu proceduru: DECLARE @returnCode int DECLARE @outputVal int EXEC @returnCode = EmployeeByShift2SP @outputVal OUTPUT PRINT 'Return code = ' + CAST(@returnCode AS CHAR(5)) PRINT 'Output value @outputVal = ' + CAST(@outputVal AS CHAR(5))

Rezultati su prikazani na slici 5-4.

Slika 5-4. Rezultati primjera pohranjene procedure koja vraća izlazni parametar, poruku i povratni kod

Sljedeći primjer CLR pohranjene procedure vraća rezultat koji sadrži jedan red podataka izrađen dinamički s pomoću pohranjene procedure, kao što je pokazano u nastavku.

Poglavlje 5: Programiranje SQL Server CLR rutina | 103

1. Dodajte sljedeću metodu StoredProcedure klasi izrađenoj u prethodnom primjeru: [SqlProcedure] public static void DynamicSingleRow( ) { SqlMetaData[] md = new SqlMetaData[2]; md[0] = new SqlMetaData("intCol", SqlDbType.Int); md[1] = new SqlMetaData("stringCol", SqlDbType.NVarChar, 50); SqlDataRecord row = new SqlDataRecord(md); row.SetSqlInt32(0, 1); row.SetSqlString(1, "Record 1"); SqlContext.Pipe.Send(row); }

Metoda upotrebljava SqlMetaData klasu za definiranje sheme reda skupa rezultata. Red se pravi kao instanca SqlDataRecord klase. Vrijednosti reda ispunjavaju se s pomoću metode Set( ) iz SqlDataRecord. Set() metode uzimaju dva argumenta – broj koji zadaje broj stupca i vrijednost. Na kraju, koristi se preopterećena inačica metode SqlPipe.Send( )za vraćanje instance klase SqlDataRecord kao reda skupa podataka. Ovaj se primjer ne može proširiti kako bi vratio skup rezultata koji sadrži više redova s obzirom da se novi skup podataka vraća svaki put kad se pozove metoda Send( ). Sljedeći primjer pokazuje kako vratiti dinamički izrađen skup rezultata koji sadrži više redova. 2. Izgradite rješenje. 3. Ažurirajte registraciju sklopa u SQL Serveru te izradite novu pohranjenu proceduru izvođenjem ove T-SQL naredbe: ALTER ASSEMBLY EmployeeInShift FROM 'C:\PSS2005\StoredProcedure\StoredProcedure\bin\Debug\StoredProcedure.dll' GO CREATE PROCEDURE DynamicSingleRow AS EXTERNAL NAME EmployeeInShift.StoredProcedures.DynamicSingleRow

4. Izvedite pohranjenu proceduru: EXEC DynamicSingleRow

Rezultati su prikazani na slici 5-5. Sljedeći primjer CLR pohranjene procedure vraća skup rezultata koji sadrži dva reda podataka, dinamički izrađena s pomoću pohranjene procedure: 1. Dodajte sljedeću metodu klasi StoredProcedure izrađenoj u prethodnom primjeru: [SqlProcedure] public static void DynamicMultiRow( ) { SqlMetaData[] md = new SqlMetaData[2];

104 | Programiranje SQL Server 2005

Slika 5-5. Rezultati primjera pohranjene procedure koja vraća dinamički izrađen skup rezultata s jednim redom md[0] = new SqlMetaData("intCol", SqlDbType.Int); md[1] = new SqlMetaData("stringCol", SqlDbType.NVarChar, 50); SqlDataRecord row = new SqlDataRecord(md); SqlContext.Pipe.SendResultsStart(row); // Stvara i šalje prvi slog row.SetSqlInt32(0, 1); row.SetSqlString(1, "Record 1"); SqlContext.Pipe.SendResultsRow(row); // Stvara i šalje drugi slog row.SetSqlInt32(0, 2); row.SetSqlString(1, "Record 2"); SqlContext.Pipe.SendResultsRow(row); SqlContext.Pipe.SendResultsEnd(

);

}

Metode SqlResultsStart( ), SqlResultsSend( ) i SqlResultsEnd( ) klase SqlPipe koriste se za slanje dinamički izrađenog skupa rezultata sa više redova. SqlResultsStart() metoda uzima SqlMetaData polje kao argument iz kojeg se izvodi shema za skup rezultata. Metoda SqlResultsRow() poziva se za svaki red koji će se vratiti u skupu rezultata. Može se pozvati bilo kada, nakon što je pozvana SqlResultsStart( ) a prije nego što se pozove SqlResultsEnd( ), čime se označava kraj skupa rezultata. 2. Izgradite rješenje. 3. Ažurirajte registraciju sklopa u SQL Serveru i izradite novu pohranjenu proceduru izvođenjem ove T-SQL naredbe: ALTER ASSEMBLY EmployeeInShift FROM 'C:\PSS2005\StoredProcedure\StoredProcedure\bin\Debug\StoredProcedure.dll' GO CREATE PROCEDURE DynamicMultiRow AS EXTERNAL NAME EmployeeInShift.StoredProcedures.DynamicMultiRow

4. Izvedite pohranjenu proceduru: EXEC DynamicMultiRow

Rezultati su prikazani na slici 5-6. Poglavlje 5: Programiranje SQL Server CLR rutina | 105

Slika 5-6. Rezultat primjera pohranjene procedure koja vraća dinamički izrađen skup rezultata s više redova

Korisnički definirane agregatne funkcije Korisnički definirana agregatna funkcija (engl. User Defined Aggregate Function, UDA) vraća skalarnu vrijednost koja je rezultat izračuna vrijednosti u skupu redova. Primjeri takve funkcije uključuju agregatne funkcije ugrađene u SQL Server kao što su SUM, AVG, MIN i MAX. CLR korisnički definirana agregatna funkcija se implementira kao struktura ili klasa u .NET Framework sklopu. CLR UDA funkcija može se pozivati u T-SQL naredbama s pomoću istih pravila koja se primjenjuju na sistemske agregatne funkcije. Za implementiranje CLR UDA funkcije treba napisati samo kod koji implementira akumulacijsku logiku, a iteracijom preko skupa rezultata i računanjem akumuliranih vrijednosti upravlja procesor upita. To specifično znači da treba implementirati agregacijski ugovor koji definira mehanizme za spremanje intermedijarnog stanja agregacije i akumuliranje novih vrijednosti. Ovaj agregacijski ugovor sastoji se od četiri metode: public void Init( ) Poziva se jedanput za svaku skupinu koju procesor upita agregira kako bi se inicijalizirala obrada agregata. Ova metoda bi trebala očistiti prethodne primjene instance zato što procesor upita može izabrati hoće li ponovno upotrijebiti instancu klase agregata kako bi izračunavao agregate za višestruke skupine. public void Accumulate(input_type value) Procesor upita poziva ovu metodu kako bi akumulirao agregatne vrijednosti. Ova metoda se poziva za svaku vrijednost u skupini koja se akumulira. Ulazni input_ type argument je upravljani SQL Server tip podataka ekvivalentan izvornom SQL Server tipu podataka zadanom argumentom. public void Merge(udagg_class value) Upotrebljava se za spajanje druge instance ove klase agregata s tekućom instancom. Procesor upita može pozvati ovu metodu za spajanje djelomičnih izračuna agregata sa skupnim particijama. public return_type Terminate( ) Završava agregaciju i vraća rezultat. return_type je upravljani SQL Server tip podataka ekvivalentan return_sqltype zadanom u T-SQL naredbi CREATE AGGREGATE koja se koristi za izradu CLR agregatne funkcije.

106 | Programiranje SQL Server 2005

UDA funkcija se identificira zapisivanjem implementirajuće klase s SqlUserDefinedAggregate attributom što označava da se klasa treba registrirati kao UDA funkcija. SqlUserDefinedAggregate atribut ima sljedeću sintaksu: SqlUserDefinedAggregate [ (aggregate-attribute [,...] ) ] aggregate-attribute::= Format = {Native | UserDefined} IsInvariantToDuplicates = {true | false} IsInvariantToNulls = {true | false} IsInvariantToOrder = {true | false} IsNullIfEmpty = {true | false} | MaxByteSize = n

gdje izrazi iz koda imaju sljedeća značenja: Format = {Native | UserDefined}

Zadaje serijalizacijski format za tip – Native ili UserDefined. Native serijalizacija koristi jednostavan algoritam za efikasnu serjializaciju tipa. Ona se preporuča za jednostavne tipove koji sadrže samo polja sljedećih tipova: bool, byte, sbyte, short, ushort, int, uint, long, ulong, float, double, SqlByte, SqlInt16, SqlInt32, SqlInt64, SqlDateTime, SqlSingle, SqlDouble, SqlMoney i SqlBoolean. Native serijalizacija može također sadržavati korisnički definirane tipove koji koriste Native serijalizaciju. Native serijalizacija ima sljedeće zahtjeve:

• Sva polja tipa moraju biti blittable – tipovi podataka koji imaju zajedničku reprezentaciju u upravljanoj i neupravljanoj memoriji te ih stoga ne treba pretvarati kada se prosljeđuju između upravljanog i neupravljanog koda. Sljedeći tipovi iz System imenskog prostora su blittable: Byte, SByte, UInt16, Int32, UInt32, Int64, IntPtr i UIntPtr. Jednodimenzionalna polja blittable tipa i formatirani tipovi vrijednosti koji sadrže samo blittable tipove također su blittable. • Tip ne smije zadati MaxByteSize svojstvo. • Tip ne smije imati polja koja nisu serijalizirana. UserDefined serijalizacija kontrolira serijalizaciju kroz kod i ima sljedeće

zahtjeve: • Treba zadati MaxByteSize svojstvo SqlUserDefinedAggregate atributa. • Klasa ili struktura koja implementira tip mora implementirati Read( ) i Write( ) metodu. IBinarySerializable sučelja za pisanje i čitanje toka bajtova. IsInvariantToDuplicates

Zadaje je li agregat nepromjenjiv (engl. invariant) za duplikate. Na primjer, MAX i MIN su nepromjenjivi za duplikate dok AVG i SUM to nisu.

Poglavlje 5: Programiranje SQL Server CLR rutina | 107

IsInvariantToNulls

Zadaje je li agregat nepromjenjiv za null vrijednsoti. Na primjer, MAX i MIN su nepromjenjivi za null vrijednosti, dok COUNT to nije (s obzirom da su null vrijednosti uključene u brojanje). IsInvariantToOrder

Zadaje je li agregat nepromjenjiv za red vrijednosti. Vrijednost true daje optimizatoru upita više fleksibilnosti prilikom biranja plana izvođenja te može dovesti do boljih performansi. IsNullIfEmpty

Zadaje vraća li agregat null referencu ako nikakve vrijednosti nisu akumulirane. U protivnom se vraća vrijednost koja je inicijalizirana vrijednost varijable koju vraća Terminate() metoda. MaxByteSize

Maksimalna veličina instance korisnički definiranog tipa. MaxByteSize se mora zadati ako je svojstvo Format postavljeno na UserDefined. Sljedeći primjer stvara, registrira i izvodi korisnički definiranu agregatnu funkciju koja vraća sumu SqlMoney stupca u tablici. Slijedite ove korake: 1. Pomoću Visual Studio 2005 IDE-a stvorite novi SQL Server projekt pod imenom Uda. 2. Stvorite agregatnu stavku u projektu. Nazovite stavku SumMoney.cs. Stvaraju se prazni blokovi koda za četiri potrebne metode. 3. Zamijenite kod u SumMoney.cs sljedećim kodom: using using using using using

System; System.Data; System.Data.Sql; System.Data.SqlTypes; Microsoft.SqlServer.Server;

[Serializable] [SqlUserDefinedAggregate(Format.Native)] public struct SumMoney { private SqlMoney sum; public void Init( { sum = 0; }

)

public void Accumulate(SqlMoney Value) { sum += Value; } public void Merge(SumMoney Group) {

108 | Programiranje SQL Server 2005

sum += Group.sum; } public SqlMoney Terminate( { return sum; }

)

}

4. Izgradite rješenje. 5. U SQL Server Management Studiju registrirajte sklop i stvorite korisnički definiranu agregatnu funkciju izvođenjem sljedeće naredbe: USE AdventureWorks GO CREATE ASSEMBLY SumMoney FROM 'C:\PSS2005\Uda\Uda\bin\Debug\Uda.dll' GO CREATE AGGREGATE SumMoneyUda ( @Value money ) RETURNS money EXTERNAL NAME SumMoney.SumMoney

6. Izvedite agregatnu funkciju na Sales.SalesOrderHeader tablici u bazi Aventure-Works: SELECT dbo.SumMoneyUda(SubTotal), dbo.SumMoneyUda(TaxAmt), dbo.SumMoneyUda(Freight), dbo.SumMoneyUda(TotalDue) FROM Sales.SalesOrderHeader

Vraćaju se rezultati prikazani na slici 5-7 (isti su kao i zbrojevi koje vraća ugrađena funkcija SUM).

Slika 5-7. Rezultati primjera korisnički definirane agregatne funkcije

Korisnički definirani tipovi podataka Osim što podržava izvorne i jednostavne tipove podataka iz prijašnjih inačica SQL Servera, SQL Server 2005 dozvoljava korisniku da definira vlastite CLR tipove. To omogućava proširivanje ugrađenih tipova podataka i definiranje kompleksnih tipova podataka. CLR korisnički definirani tipovi mogu se koristiti u svim kontekstima gdje se može upotrijebiti sistemski SQL Server tip. CLR korisnički definiran tip se implementira kao klasa u .NET Framework sklopu. CLR korisnički definiran tip treba identificirati obilježavanjem klase koja ga implementira Poglavlje 5: Programiranje SQL Server CLR rutina | 109

atributom SqlUserDefinedType koji govori da se klasa treba registrirati kao korisnički definiran tip. SqlUserDefinedType atribut ima sljedeću sintaksu: SqlUserDefinedType [ ( udt-property [,...] ) ] udt-property::= Format = { Native | UserDefined } | MaxByteSize= n | IsByteOrdered= { true | false } | ValidationMethod = string | IsFixedLength = { true | false } | Name = string

gdje su: Format = { Native | UserDefined }

Format serijalizacije za korisnički definiran tip. Za više informacija o ove dvije vrijednosti pogledajte svojstvo Format za atribut SqlUserDefinedAggregate u odjeljku „Korisnički definirane agregatne funkcije“ ranije u ovom poglavlju. Ako je korisnički tip definiran u klasi umjesto u strukturi te ako je svojstvo Format Native, mora se zadati atribut StructLayout i postaviti na LayoutKind. Sequential. To prisiljava članove klase da budu serijalizirani istim redom kojim se pojavljuju u klasi. MaxByteSize

Zadaje maksimalnu veličinu instance korisnički definiranog tipa između 1 i 8 000 bajtova. MaxByteSize treba zadati ako se svojstvo Format postavi na UserDefined. MaxByteSize ne treba zadati ako je svojstvo Format postavljeno na Native. IsByteOrdered

Zadaje kako se provode binarne usporedbe korisnički definiranih tipova s pomoću SQL Servera. Kada je When IsByteOrdered true, korisnički definiran tip je uređen na isti način kao njegova serijalizirana binarna reprezentacija te se može upotrijebiti za slaganje podataka u poredak. Sljedeće vrijednosti su podržane na UDT stupcu u tablici kada je IsByteOrdered true: • Izrada indeksa na stupcu. • Izrada primarnih i vanjskih ključeva te CHECK i UNIQUE ograničenja na stupcu. • Upotreba stupca u T-SQL ORDER BY, GROUP BY i PARTITION BY klauzulama. • Upotreba operatora za usporedbu u T-SQL naredbama u stupcu. ValidationMethod

Zadaje metodu koja se koristi za potvrđivanje instanci korisnički definiranog tipa kada se podaci deserijaliziraju iz binarne vrijednosti. Pretvorena metoda vraća Boolean čime se označava je li instanca korisnički definiranog tipa važeća. Mehanizam baze podataka automatski pretvara binarne vrijednosti u UDT vrijednosti. On sprječava nevažeće vrijednosti u bazi podataka tako što provjerava odgovaraju li vrijednosti serijalizacijskom formatu tipa te može li se vrijednost dese110 | Programiranje SQL Server 2005

rijalizirati. Podrazumijevana provjera može biti neadekvatna kada su, na primjer, vrijednosti korisnički definiranog tipa ograničee skupom vrijednosti ili rasponom. IsFixedLength

Zadaje imaju li sve instance UDT jednaku duljinu. Ako je svojstvo IsFixedLength true, sve instance korisnički definiranog tipa moraju imati duljinu u bajtovima koja je zadana svojstvom MaxByteSize. Svojstvo se koristi samo kada je svojstvo Format postavljeno na UserDefined. Name

Zadaje ime tipa. Kada se polje, metoda ili svojstvo referencira kao dio upita, T-SQL tip povratne vrijednosti se izvodi iz povratnog tipa. SqlFacet atribut može se koristiti za vraćanje dodatne informacije o povratnom tipu UDT izraza koji nije prazan – SqlFacet atribut ne ograničava specifične vrijednosti koje se mogu pohraniti u tipu. Sintaksa SqlFacet atributa je sljedeća: SqlFacet[(facet-attribute [,...])] facet-attribute::= IsFixedLength = { true | false } | MaxSize= { n } | Precision = { n } | Scale = { n } | IsNullable = { true | false }

gdje: IsFixedLength

Zadaje ima li povratni tip određenu duljinu. IsFixedLength mora se postaviti na false ako je svojstvo MaxSize postavljeno na -1. Podrazumijevana vrijednost je false. MaxSize

Zadaje maksimalnu veličinu povratnog tipa u bajtovima za binarne tipove te u znakovima za tipove polja znakova. Podrazumijevano je 4 000 Unicode tipove znakova i 8 000 za binarne tipove. Vrijednost -1 označava velike znakove ili binarni tip. Precision

Zadaje točnost (broj znamenki u broju) povratnog tipa kao vrijednost od 1 do 38. Ovo se svojstvo koristi samo uz numeričke tipove. Skala se mora zadati ako je zadan Precision. Podrazumijevana vrijednost je 38. Scale

Zadaje skalu (broj znamenki desno od decimalnog zareza) povratnog tipa kao vrijednost od 0 do 38. Ovo svojstvo se koristi samo uz numeričke tipove. Precision mora biti zadan ako je zadan Scale. Podrazumijevana vrijednost je 0. IsNullable

Označava može li vrijednost povratnog tipa biti null. Podrazumijevana vrijednost je true. Poglavlje 5: Programiranje SQL Server CLR rutina | 111

Svojstva zadana za SqlFacet atribut moraju biti u skladu s povratnim tipom. Tablica 5-1 pokazuje SqlFacet svojstva koja se mogu zadati za svaki povratni tip. Tablica 5-1. Dozvoljene SqlFacet vrijednosti za povratni tip Tip

IsFixedLength

MaxSize

Precision

Scale

IsNullable

SqlBoolean

N

N

N

N

Y

SqlByte

N

N

N

N

Y

SqlInt16

N

N

N

N

Y

SqlInt32

N

N

N

N

Y

SqlInt64

N

N

N

N

Y

SqlSingle

N

N

N

N

Y

SqlDouble

N

N

N

N

Y

SqlDateTime

N

N

N

N

Y

SqlMoney

N

N

N

N

Y

SqlGuid

N

N

N

N

Y

SqlDecimal

N

N

Y

Y

Y

SqlString

Y

Y

N

N

Y

SqlBinary

Y

Y

N

N

Y

SqlXml

N

N

N

N

Y

SqlBytes

Y

Y

N

N

Y

SqlChars

Y

Y

N

N

Y

SqlUtcDateTime

N

N

N

N

Y

SqlDate

N

N

N

N

Y

SqlTime

N

N

N

N

Y

Embedded

N

N

N

N

Y

string

Y

Y

N

N

Y

Byte[]

Y

Y

N

N

Y

Char[]

Y

Y

N

N

Y

decimal

N

N

Y

Y

N

UDT

Prilikom definiranja CLR korisnički definiranog tipa treba učiniti sljedeće: • Označiti klasu sa SqlUserDefinedType atributom. • Zadati Serializable atribut što označava da se korisnički definiran tip može serijalizirati. • Implementirati System.Data.SqlTypes.INullable sučelje tako da korisnički definiran tip može prepoznati vrijednost null. To znači da korisnički definiran tip mora implementirati statičko IsNull svojstvo koje vraća Boolean čime se označava je li instanca UDT-a null. 112 | Programiranje SQL Server 2005

• Implementirati public static svojstvo nazvano Null koje vraća null instancu korisnički definiranog tipa. • Implementirati public static metode ToString( ) i Parse() za pretvaranje reprezentacije tipa u string te izdvajanje iz njega. Metoda Parse()uzima jedan argument tipa SqlString. • Implementirati IXmlSerializable sučelje ako se sva javna polja i svojstva mogu serijalizirati u XML ili označiti XmlIgnore atributom. IXmlSerializable sučelje pruža prilagođenu XML serijalizaciju i deserijalizaciju tako što eksplicitno definira kako se objekt serijalizira i deserijalizira s pomoću XmlSerializer klase. Sučelje IXmlSerializable ima tri metode: GetSchema(), ReadXml( ) i WriteXml( ). • Implementirati metode Read( ) i Write( ) ako se serijalizacija zadaje implementiranjem IBinarySerialize sučelja. CLR korisnički definiran tip ima sljedeća ograničenja: • Javna imena ne mogu biti dulja od 128 znakova i moraju odgovarati SQL Server pravilima za nazivanje identifikatora. • Samo polja, svojstva i metode definirane u tipu moraju se moći pozivati iz T-SQL naredbi. SQL Server nije svjestan hijerarhije nasljeđivanja među korisnički definiranim tipovima. • Drugi članovi osim konstruktora klase ne mogu se preopteretiti. • Statički članovi moraju se deklarirati kao konstante ili kao članovi samo za čitanje kada je dopuštenje sklopa SAFE ili EXTERNAL_ACCESS. Atribut SqlMethod koristi se za definiranje karakteristike UDT metode ili svojstva. Sintaksa SqlMethod atributa je sljedeća: SqlMethod [ ( method-attribute [ ,... ] ) ] method-attribute::= function_attribute | IsMutator = { true | false } | OnNullCall = { true | false } | InvokeIfReceiverIsNull= { true | false }

gdje su: function_attribute Atribut SqlMethod nasljeđuje sva svojstva atributa SqlFunction opisanog ranije u

ovom poglavlju, u odjeljku „Funkcije sa skalarnim vrijednostima“. IsMutator

Zadaje može li metoda modificirati instancu korisnički definiranog tipa. SQL Server traži svojstvo IsMutator atributa SqlMethod na void public metodama u korisnički definiranom tipu. Ako je IsMutator svojstvo true na void metodi, SQL Server označava da je metoda mutator – metoda koja uzrokuje promjenu stanja u instanci.

Poglavlje 5: Programiranje SQL Server CLR rutina | 113

Mutatorske metode (engl. mutator methods) nisu dozvoljene u upitima – njihova je primjena ograničena na naredbe dodjeljivanja ili modifikacije podataka. Podrazumijevana vrijednost svojstva IsMutator je false. OnNullCall

Zadaje je li metoda evaluirana ako je zadan jedan ili više null argumenata. Ako je false, metoda vraća null bez evaluiranja je li jedan ili više argumenata null. Ako je true, metoda se evaluira neovisno o tome jesu li argumenti null. Podrazumijevana vrijednost je true. InvokeIfReceiverIsNull

Zadaje treba li poslužitelj pozvati SQL Server metodu na null referenci. Vrijednost true poziva metodu na null referencu. Podrazumijevana vrijednost je false. Sljedeći primjer stvara, registrira i upotrebljava korisnički tip koji definira mnogokut i implementira metodu koja vraća površinu mnogokuta kao double. Slijedite ove korake: 1. S pomoću Visual Studio 2005 IDE-a izradite novi SQL Server projekt i nazovite ga PolygonUdt. 2. Izradite stavku agregata u projektu. Nazovite ju Polygon.cs. Stvaraju se prazni blokovi koda za četiri potrebne metode. 3. Zamijenite kod u Polygon.cs sljedećim kodom: using using using using using

System; System.Data; System.Data.Sql; System.Data.SqlTypes; Microsoft.SqlServer.Server;

[Serializable] [SqlUserDefinedType(Format.Native)] public struct Polygon : INullable { private bool isNull; private int numberSides; private double sideLength; public override string ToString( ) { if (this.isNull) return "null"; else return string.Format("{0} sides each {1} units long", numberSides, sideLength); } public bool IsNull { get

114 | Programiranje SQL Server 2005

{ return isNull; } } public static Polygon Null { get { Polygon p = new Polygon( p.isNull = true;

);

return p; } } public static Polygon Parse(SqlString s) { if (s.IsNull || s.Value.ToLower( ).Equals("null")) return Null; string[] sa = s.ToString( if (sa.Length != 2) return Null; Polygon p = new Polygon(

).Split(',');

);

try { p.numberSides = int.Parse(sa[0]); p.sideLength = double.Parse(sa[1]); if (p.numberSides > 2 && p.sideLength > 0) return p; else return Null; } catch (Exception) { return Null; } } public int NumberSides { get { return numberSides; } set { if (value > 2) { numberSides = value; isNull = false; } else isNull = true;

Poglavlje 5: Programiranje SQL Server CLR rutina | 115

} } public double SideLength { get { return sideLength; } set { if (value > 0) { sideLength = value; isNull = false; } else isNull = true; } } [SqlMethod] public double Area( ) { if (!isNull) return .25 * numberSides * Math.Pow(sideLength, 2) * (1 / Math.Tan(Math.PI / numberSides)); else return 0; } [SqlMethod(IsMutator = true, OnNullCall = false)] public void SetValue(int numberSides, double sideLength) { if (numberSides > 2 && sideLength > 0) { this.numberSides = numberSides; this.sideLength = sideLength; this.isNull = false; } else isNull = true; } }

Korisnički definiran tip se implementira kao struct označen atributima Serializable i SqlUserDefinedType čime se zadaje Native serijalizacija. On mora podržavati XML i binarnu serijalizaciju. UDT sadrži dva privatna polja, numberSides i sideLength. Svojstva NumberSides i SideLength koriste se za uzimanje i postavljanje vrijednosti ovih polja. Korisnički definiran tip implementira INullable sučelje s pomoću metode IsNull( ) koja jednostavno vraća vrijednost privatnog polja, isNull, koje vodi računa o tome je li korisnički definiran tip za mnogokut null. On također implementira Null( ) metodu koja instancira i vraća null instancu Polygon tipa. 116 | Programiranje SQL Server 2005

Korisnički tip implementira zahtijevane metode ToString() i Parse(). Metoda ToString( ) prikazuje vrijednost mnogokuta kao niz znakova. Metoda Parse( ) pretvara niz znakova u korisnički tip mnogokuta a koriste ju i SQL Server funkcije CONVERT i CAST. Korisnički definiran tip implementira dvije metode. Metoda Area() vraća površinu mnogokuta. SetValue( ) mijenja broj stranica i njihovu duljinu u tip mnogokuta. 4. Izgradite rješenje. 5. Registrirajte sklop i izradite korisnički definiran tip mnogokuta izvođenjem sljedeće T-SQL naredbe u SQL Server Management Studiju: USE ProgrammingSqlServer2005 GO CREATE ASSEMBLY Polygon FROM 'C:\PSS2005\PolygonUdt\PolygonUdt\bin\Debug\PolygonUdt.dll' GO CREATE TYPE Polygon EXTERNAL NAME Polygon

6. Izvedite sljedeće T-SQL naredbe: DECLARE @p Polygon SET @p = CONVERT(Polygon, '5, 4.2') PRINT PRINT PRINT PRINT PRINT

@p.IsNull @p.ToString( ) @p.NumberSides @p.SideLength @p.Area( )

SET @p.SetValue(7, 3) PRINT @p.ToString( ) PRINT @p.Area( )

Rezultati su prikazani na slici 5-8.

Okidači Okidač (engl. trigger) je tip pohranjene procedure koja se automatski izvodi kada se dogodi događaj. SQL Server ima dva tipa okidača: Data Manipulation Language (DML) okidač Izvodi se kada INSERT, UPDATE i DELETE naredbe modificiraju podatke u tablici ili pogledu.

Poglavlje 5: Programiranje SQL Server CLR rutina | 117

Slika 5-8. Rezultati primjera UDT funkcije

Data Definition Language (DDL) okidač Izvodi se kao odgovor na DDL naredbu koja se često upotrebljava za provođenje promjena u shemi baze podataka. Primjeri uključuju CREATE, ALTER i DROP naredbe. CLR okidač se implementira kao metoda klase u .NET Framework sklopu. Sljedeća dva odjeljka obrađuju izradu CLR DML i DDL okidača.

DML okidači CLR okidač se implementira kao public static void metoda u .NET Framework sklopu. CLR DML okidač se identificira označavanjem metode koja implementira okidač atributom SqlTrigger, što govori da se metoda treba registrirati kao DML okidač. Atribut SqlTrigger ima sljedeću sintaksu: SqlTrigger [ ( trigger-attribute [ ,... ] ) ] trigger-attribute::= Target = "table-name" | Event = "trigger-type update-action [, ...]"

trigger-type::= FOR | AFTER | INSTEAD OF update-action::= UPDATE | DELETE | INSERT

gdje: Target = "table-name"

Zadaje tablicu na koju se okidač primjenjuje. trigger-type

Zadaje tip okidača. update-action

Zadaje DML akciju koja aktivira okidač – to su naredbe UPDATE, DELETE ili INSERT. 118 | Programiranje SQL Server 2005

Svojstvo triggerAction klase SqlTriggerContext može se koristiti umjesto atributa SqlTrigger. Taj je postupak obrađen kasnije u ovom odjeljku. Sljedeći primjer pravi DML okidače za ažuriranje, umetanje i brisanje koji bilježi ažuriranje, umetanje i brisanje u tablicu Volume koja služi kao dnevnik događaja. Događaji se zapisuju u tablicu VolumeAudit. Primjer zatim registrira okidače i pokazuje rezultate izvođenja DML naredbi u tablici Volume. Slijedite ove korake: 1. Izvedite sljedeće T-SQL naredbe kako biste izradili tablice Volume i VolumeAudit koje su odredište za okidače: USE ProgrammingSqlServer2005 GO CREATE TABLE Volume ( ID int NOT NULL, Length float NOT NULL, Width float NOT NULL, Height float NOT NULL, Volume float NOT NULL CONSTRAINT DF_Area_Area DEFAULT ((0)), CONSTRAINT PK_Volume PRIMARY KEY CLUSTERED ( ID ASC ) ) GO CREATE TABLE VolumeAudit ( Action varchar(50) NOT NULL, Description varchar(max) NOT NULL )

2. U Visual Studio 2005 IDE-u izradite novi SQL Server projekt i nazovite ga DmlTrigger. 3. Stvorite stavku okidača u projektu. Nazovite ju VolumeTriggers.cs. 4. Zamijenite kod u VolumeTriggers.cs sa sljedećim kodom: using using using using using using

System; System.Data; System.Data.Sql; Microsoft.SqlServer.Server; System.Data.SqlClient; System.Collections;

public partial class Triggers { [SqlTrigger (Target="Volume", Event="FOR INSERT")] public static void InsertTrigger( ) { using (SqlConnection conn = new SqlConnection("context connection=true"))

Poglavlje 5: Programiranje SQL Server CLR rutina | 119

{ SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM INSERTED", conn); DataTable dt = new DataTable( ); da.Fill(dt); SqlCommand cmd = new SqlCommand( ); cmd.Connection = conn; conn.Open( ); foreach (DataRow row in dt.Rows) { int id = (int)row[0]; double length = (double)row[1]; double width = (double)row[2]; double height = (double)row[3]; double volume = length * width * height; string audit = string.Format("ID = {0}, Length = {1}, " + "Width = {2}, Height = {3}", id, length, width, height); cmd.CommandText = "INSERT INTO VolumeAudit VALUES ('INSERTED', '" + audit + "')"; cmd.ExecuteNonQuery( ); cmd.CommandText = "UPDATE Volume SET Volume = " + volume + " WHERE ID = " + id; cmd.ExecuteNonQuery( ); SqlPipe pipe = SqlContext.Pipe; pipe.Send("Row inserted: " + audit); } } } [SqlTrigger(Target = "Volume", Event = "FOR UPDATE")] public static void UpdateTrigger( ) { using (SqlConnection conn = new SqlConnection("context connection=true")) { SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM DELETED", conn); DataTable dtDel = new DataTable( ); da.Fill(dtDel); da = new SqlDataAdapter("SELECT * FROM INSERTED", conn); DataTable dtIns = new DataTable( ); da.Fill(dtIns); SqlCommand cmd = new SqlCommand( ); cmd.Connection = conn; conn.Open( ); for (int i = 0; i < dtDel.Rows.Count; i++) { DataRow rowDel = dtDel.Rows[i];

120 | Programiranje SQL Server 2005

int delId = (int)rowDel[0]; double delLength = (double)rowDel[1]; double delWidth = (double)rowDel[2]; double delHeight = (double)rowDel[3]; double delVolume = (double)rowDel[4]; string delAudit = string.Format("ID = {0}, Length = {1}, " + "Width = {2}, Height = {3}, Volume = {4}", delId, delLength, delWidth, delHeight, delVolume); DataRow rowIns = dtIns.Rows[i]; int insId = (int)rowIns[0]; double insLength = (double)rowIns[1]; double insWidth = (double)rowIns[2]; double insHeight = (double)rowIns[3]; double insVolume = insLength * insWidth * insHeight; string insAudit = string.Format("ID = {0}, Length = {1}, " + "Width = {2}, Height = {3}, Volume = {4}", insId, insLength, insWidth, insHeight, insVolume); cmd.CommandText = "UPDATE Volume SET Volume = " + insVolume + " WHERE ID = " + insId; cmd.ExecuteNonQuery( ); cmd.CommandText = "INSERT INTO VolumeAudit VALUES " + "('UPDATED', 'Original: " + delAudit + "; " + "New: " + insAudit + "')"; cmd.ExecuteNonQuery( ); SqlPipe pipe = SqlContext.Pipe; pipe.Send("Row updated: Original: " + delAudit + "; " + "New: " + insAudit); } } } [SqlTrigger(Target = "Volume", Event = "FOR DELETE")] public static void DeleteTrigger( ) { using (SqlConnection conn = new SqlConnection("context connection=true")) { SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM DELETED", conn); DataTable dt = new DataTable( ); da.Fill(dt); SqlCommand cmd = new SqlCommand( ); cmd.Connection = conn; conn.Open( ); foreach(DataRow row in dt.Rows) { int id = (int)row[0]; double length = (double)row[1];

Poglavlje 5: Programiranje SQL Server CLR rutina | 121

double width = (double)row[2]; double height = (double)row[3]; double volume = (double)row[4]; string audit = string.Format("ID = {0}, Length = {1}, " + "Width = {2}, Height = {3}, Volume = {4}", id, length, width, height, volume); cmd.CommandText = "INSERT INTO VolumeAudit VALUES ('DELETED', '" + audit + "');"; cmd.ExecuteNonQuery( ); SqlPipe pipe = SqlContext.Pipe; pipe.Send("Row deleted: " + audit); } } } }

5. Izgradite rješenje. Svaki od ova tri okidača označen je atributom SqlTrigger koji zadaje da je tablica Volume cilj okidača zajedno s događajem koji uzrokuje izvođenje svakog okidača. 6. U SQL Server Management Studiju registrirajte sklop i izradite DML okidače za umetanje, ažuriranje i brisanje izvođenjem sljedećeg upita: USE ProgrammingSqlServer2005 GO CREATE ASSEMBLY VolumeTriggers FROM 'C:\PSS2005\DmlTrigger\DmlTrigger\bin\Debug\DmlTrigger.dll' GO CREATE TRIGGER VolumeInsertTrigger ON Volume FOR INSERT AS EXTERNAL NAME VolumeTriggers.Triggers.InsertTrigger GO CREATE TRIGGER VolumeUpdateTrigger ON Volume FOR UPDATE AS EXTERNAL NAME VolumeTriggers.Triggers.UpdateTrigger GO CREATE TRIGGER VolumeDeleteTrigger ON Volume FOR DELETE AS EXTERNAL NAME VolumeTriggers.Triggers.DeleteTrigger GO

122 | Programiranje SQL Server 2005

7. Izvedite sljedeće T-SQL naredbe za umetanje dva reda u tablicu Volume: INSERT INTO Volume (ID, Length, Width, Height) VALUES (1, 2.2, 3.4, 5.7) INSERT INTO Volume (ID, Length, Width, Height) VALUES (2, 6, 2, 5.4)

Rezultati su prikazani na slici 5-9.

Slika 5-9. Rezultati primjera DML okidača

Sljedeći kod u DML okidaču za umetanje generira rezultat: pipe.Send("Row inserted: " + audit);

Tablica VolumeAudit sada sadrži sljedeće zapise: Action INSERTED UPDATED INSERTED UPDATED

Description ID = 1, Length = 2.2, Width = 3.4, Height = 5.7 Original: ID = 1, Length = 2.2, Width = 3.4, Height = 5.7, Volume = 0; New: ID = 1, Length = 2.2, Width = 3.4, Height = 5.7, Volume = 42.636 ID = 2, Length = 6, Width = 2, Height = 5.4 Original: ID = 2, Length = 6, Width = 2, Height = 5.4, Volume = 0; New: ID = 2, Length = 6, Width = 2, Height = 5.4, Volume = 64.8

Iako okidač za ažuriranje u tablici Volume ažurira navedenu tablicu, upit nije rekurzivan sve dok je opcija baze podataka RECURSIVE_TRIGGERS postavljena na OFF, što je podrazumijevana vrijednost. Status svih opcija baze podataka može se provjeriti izvođenjem sljedeće T-SQL naredbe: SELECT * FROM sys.databases

Stupac is_recursive_triggers_on sadrži postavljanje opcije RECURSIVE_ TRIGGERS za svaku bazu podataka. Vrijednost opcije baze podataka može se promijeniti s pomoću naredbe ALTER DATABASE. Na primjer, izvedite sljedeću T-SQL naredbu kako bi se ponašanje rekurzivnog okidača za bazu podataka ProgrammingSqlServer2005 promijenilo na ON: ALTER DATABASE ProgrammingSqlServer2005 SET RECURSIVE_TRIGGERS ON

Postoje četiri zapisa – dva umetnuta DML okidačem za umetanje i dva umetnuta DML okidačem za ažuriranje nastala kada je DML okidač za umetanje ažurirao Volume polje.

Poglavlje 5: Programiranje SQL Server CLR rutina | 123

Izvedite sljedeću T-SQL naredbu za ažuriranje prvog od dva prethodno umetnuta reda u tablici Volume: UPDATE Volume SET Length = 1, Width = 4, Height = 7.2 WHERE ID = 1

Rezultat je sljedeći: Row updated: Original: ID = 1, Length = 2.2, Width = 3.4, Height = 5.7, Volume = 42.636; New: ID = 1, Length = 1, Width = 4, Height = 7.2, Volume = 28.8 (1 row(s) affected)

Tablica VolumeAudit sada sadrži novi zapis kojeg je umetnuo DML okidač za ažuriranje: Action UPDATED

Description Original: ID = 1, Length = 2.2, Width = 3.4, Height = 5.7, Volume = 42.636; New: ID = 1, Length = 1, Width = 4, Height = 7.2, Volume = 28.8

Izvedite sljedeću T-SQL naredbu za brisanje dva reda iz tablice Volume: DELETE FROM Volume

Rezultat je sljedeći: Row deleted: ID = 2, Length = 6, Width = 2, Height = 5.4, Volume = 64.8 Row deleted: ID = 1, Length = 1, Width = 4, Height = 7.2, Volume = 28.8 (2 row(s) affected)

Tablica VolumeAudit sada sadrži dva nova zapisa koje je umetnuo DML okidač za brisanje: Action DELETED DELETED

Description ID = 2, Length = 6, Width = 2, Height = 5.4, Volume = 64.8 ID = 1, Length = 1, Width = 4, Height = 7.2, Volume = 28.8

DDL okidači CLR okidač se implementira kao public static void metoda u .NET Framework sklopu. Umjesto korištenja atributa SqlTrigger za definiranje događaja koje DDL okidač izvodi, upotrebljava se SqlTriggerContext za dobivanje informacije o okidaču. Klasa SqlTriggerContext ne može se direktno instancirati. U tu svrhu mora se pozvati svojstvo TriggerContext klase SqlContext kako bi se dobila instanca. Klasa SqlTriggerContext ima svojstvo TriggerAction za označavanje akcije koja je uzrokovala okidanje okidača. Za DML okidače ta vrijednost može biti triggerAction. Update, triggerAction.Insert ili triggerAction.Delete. Postoji puno akcija DDL okidača – pogledajte Microsoft SQL Server 2005 Books Online za potpuni popis.

124 | Programiranje SQL Server 2005

Sljedeći primjer stvara, registrira i pokazuje CLR DDL okidač koji u dnevnik zapisuje događaje CREATE_TABLE i DROP_TABLE i to u tablicu Log. Slijedite ove korake: 1. Stvorite tablicu Log za pohranjivanje informacije o DDL događaju: USE ProgrammingSqlServer2005 GO CREATE TABLE Log ( LogID int IDENTITY(1,1) NOT NULL, LogEntry varchar(max) NOT NULL, CONSTRAINT PK_Log PRIMARY KEY CLUSTERED ( LogID ASC ) )

2. U Visual Studiju 2005 izradite novi SQL Server projekt nazvan DdlTrigger. 3. Stvorite stavku okidača u projektu. Nazovite ju LogTableActivityTrigger.cs. 4. Zamijenite kod u LogTableActivityTrigger.cs sa sljedećim kodom: using using using using using

System; System.Data; System.Data.Sql; Microsoft.SqlServer.Server; System.Data.SqlClient;

public partial class Triggers { public static void LogTableActivityTrigger( ) { SqlTriggerContext tc = SqlContext.TriggerContext; using (SqlConnection conn = new SqlConnection("context connection=true")) { conn.Open( ); SqlCommand cmd = new SqlCommand( ); cmd.Connection = conn; if (tc.TriggerAction == TriggerAction.CreateTable || tc.TriggerAction == TriggerAction.DropTable) { cmd.CommandText = "INSERT INTO Log VALUES " + "('" + tc.EventData.Value + "')"; cmd.ExecuteNonQuery( ); } } } }

U klasi okidača definiran je samo jedan DDL okidač. Okidač provjerava triggerAction svojstvo SqlTriggerContext i nakon toga zapisuje u dnevnik EventData

Poglavlje 5: Programiranje SQL Server CLR rutina | 125

za događaj koji je uzrokovao okidanje ovog okidača. U primjeru nije potrebno provjeravati kontekst okidača jer svi događaji za koje je okidač registriran u koraku 6 izvode isti kod za upisivanje događaja u dnevnik. Moglo bi se upotrijebiti triggerAction svojstvo za izvođenje različitih akcija za svaki od različitih događaja za čiju obradu je registriran DDL okidač. 5. Izgradite rješenje. 6. Registriraje sklop i izradite DDL okidač izvođenjem ove naredbe u SQL Server Management Studiju: USE ProgrammingSqlServer2005 GO CREATE ASSEMBLY DdlTrigger FROM 'C:\PSS2005\DdlTrigger\DdlTrigger\bin\Debug\DdlTrigger.dll' GO CREATE TRIGGER LogTableActivity ON DATABASE FOR CREATE_TABLE, DROP_TABLE AS EXTERNAL NAME DdlTrigger.Triggers.LogTableActivityTrigger

Naredba CREATE TRIGGER stvara DDL koji se izvodi prilikom izvođenja DDL naredbi CREATE TABLE i DROP TABLE. 7. Izvedite sljedeću T-SQL naredbu za izradu i zatim za uklanjanje tablice TestTable: USE ProgrammingSqlServer2005 GO CREATE TABLE TestTable ( TestID int NOT NULL, CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED ( TestID ASC ) ) GO DROP TABLE TestTable GO

Tablica Log sadrži dva reda koji sadrže detalje o događajima CREATE_TABLE i DROP_ TABLE: CREATE_TABLE 2005-06-15T13:57:10.733 54 BILLHAMILTON1 BILLHAMILTON1\whamilton

126 | Programiranje SQL Server 2005

dbo ProgrammingSqlServer2005 dbo TestTable TABLE CREATE TABLE TestTable ( TestID int NOT NULL, CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED ( TestID ASC ) ) DROP_TABLE 2005-06-15T13:57:10.937 54 BILLHAMILTON1 BILLHAMILTON1\whamilton dbo ProgrammingSqlServer2005 dbo TestTable TABLE DROP TABLE TestTable

Poglavlje 5: Programiranje SQL Server CLR rutina | 127

POGLAVLJE 6

.NET klijentsko programiranje

Ovo poglavlje opisuje tehnologije klijentskog programiranja SQL Servera 2005. One uključuju: Programiranje SQL Native Clienta Zamjenjuje SQL OLE DB i SQL ODBC upravljačke programe. Upotrebljava Microsoft Data Access Components (MDAC) i implementira funkcionalnost koja podržava nove značajke u SQL Serveru 2005. SQLXML 4.0 Ažurira SQLXML 3.0 za prilagodbu novim značajkama u SQL Serveru 2005. Programiranje Exception Message Boxa Proširuje funkcionalnost uobičajenog okvira s porukom u klasi System.Windows. Forms.MessageBox kako biste ga lakše kontrolirali i pružili podrobnije informacije korisnicima.

Programiranje SQL Native Clienta Microsoftov SQL Server 2005 uvodi SQL Native Client koji je projektiran za pojednostavljivanje izvornog pristupa podacima u SQL Serveru 7.0 ili novijem, koristeći OLE DB ili ODBC. SQL Native Client zamjenjuje SQL OLE DB pružatelj i SQL ODBC upravljački program sa samostalnim API-jem koji spaja funkcionalnosti SQL OLE DB pružatelja i SQL ODBC upravljačkog programa u jednom jedinom DLL-u. Na pojedine tehnologije za pristupanje podacima sada se upućuje kao na SQL Native Client (OLE DB) i SQL Native Client (ODBC). Pored toga, SQL Native Client podržava nove značajke SQL Servera 2005, opisane u tablici 6-1. Tablica 6-1. Podrška SQL Native Clienta za nove funkcionalnosti u SQL Serveru 2005 Funkcija

Opis

xml tip podataka

Podržava xml tip podataka SQL Servera 2005 za stupce, varijable, parametre i povratne tipove.

Tipovi velikih vrijednosti

Podržava tipove podataka za velike objekte SQL Servera – varchar(max), nvar-

char(max), i varbinary(max).

128

Tablica 6-1. Podrška SQL Native Clienta za nove funkcionalnosti u SQL Serveru 2005 (nastavak) Funkcija

Opis

Korisnički definirani tipovi

Podržava upotrebu korisnički definiranih tipova u SQL Server bazi podataka.

Multiple Active Result Sets (MARS)

Podržava višestruke skupove rezultata upotrebom jedne veze SQL Servera.

Izolacija snimaka

Podržava razinu izolacije snimaka u SQL Serveru 2005.

Asinkrone operacije

Omogućuje metodama trenutno vraćanje, bez blokiranja pozivajuće dretve.

Dupliciranje baze podataka

Podržava duplicirane baze podataka SQL Servera.

Obavijesti upita

Podržava obavještavanje klijenta kad se skupovi rezultata modificiraju.

Skupno kopiranje

Podržava prijenos velike količine podataka na SQL Poslužitelj i sa njega.

Istjecanje roka trajanja lozinke

Podržava obradu lozinki kojima je istekao rok u SQL Serveru 2005, bez intervencije administratora.

Ukoliko razvijate novu aplikaciju ili modificirate postojeću, napisanu u upravljanom programskom jeziku kao što je C# ili VB.NET, trebali biste upotrijebiti .NET Framework pružatelj podataka za bazu podataka. Upotrijebite SQL Native Client za pristupanje novim značajkama SQL Servera 2005 te također za pristupanje izvorima podataka koji koriste OLE DB ili ODBC iz drugih aplikacija, poput aplikacija temeljenih na COM komponentama.

SQL Native Client je proizvod zaseban od MDAC-a, ali dopušta razvijanje nove funkcionalnosti z pristup podacima u aplikacijama, bez mijenjanja postojećih MDAC komponenti. Iako SQL Native Client koristi MDAC, on ne ovisi o određenoj inačici MDAC-a te se može upotrijebiti s bilo kojom inačicom instaliranom s Windowsima 2000 SP3 ili novijima. SQL Native Client ne uključuje funkcionalnost kojoj mogu pristupiti korisnici, a koja već postoji u osnovnim MDAC komponentama, poput prozivanja veza, ADO podrške, upravljanja memorijom ili podrške za klijentski kursor – on koristi MDAC kako bi pružio tu funkcionalnost. MDAC ne podržava poboljšanja u SQL Serveru 2005. SQL Native Client komponente podrazumijevano su instalirane sa SQL Serverom 2005. Te su komponente opisane u tablici 6-2. Tablica 6-2. SQL Native Client komponente Komponenta

Opis

Mapa

SQLNCLI.dll

Sadrži svu funkcionalnost SQL Native Clienta, uključujući OLE DB pružatelja i ODBC pružatelja.

\system32

SQLNCLIR.rll

Datoteka resursa za SQLNCLI.dll

\system32

SQLNCLI.h

Sadrži sve definicije potrebne za upotrebu SQL Native Clienta. Zamjenjuje datoteke zaglavlja ODBCSS.h i SQLOLEDB.h.

Program Files\Microsoft SQL Server\90\SDK\Include

SQLNCLI.lib

Datoteka biblioteke potrebna za pozivanje ODBC Bulk Copy Program (BCP) funkcija u SQL Native Clientu.

Program Files\Microsoft SQL Server\90\SDK\Lib

Poglavlje 6: .NET klijentsko programiranje | 129

Trebate redistribuirati SQL Native Client s vašom aplikacijom, tako da se instalira na klijentskim računalima. Instalacijski paket pod imenom SQLNCLI.msi uključen je na instalacijski CD SQL Servera 2005, u mapi Tools\Setup. Datoteka ReadmeSQL2005. htm u mapi Tools instalacijskog CD-a raspravlja klijentske i poslužiteljske preduvjete te pruža upute za instaliranje. Pogledajte Microsoft SQL Server 2005 Books Online za više informacija o SQL Native Client (OLE DB) i SQL Native Client (ODBC) programiranju.

SQLXML 4.0 SQL Server 2005 uvodi SQLXML 4.0 koji pruža funkcionalnosti iz prethodnih inačica i dodaje podršku za funkcionalnosti novog SQL Server 2005 XML-a i Web usluge. SQLXML 4.0 instalira se automatski sa SQL Serverom 2005. Također možete instalirati SQLXML na računala klijenata iz instalacijskog programa sqlxml4.msi – također ćete morati instalirati MSXML 6.0 iz instalacijskog programa msxml6.msi. Ovi se instalacijski programi nalaze na instalacijskom disku SQL Servera 2005 u podmapi Tools\Setup. SQLSQL 4.0 pruža klijentsku XML funkcionalnost za pisanje aplikacija koje pristupaju XML podacima s SQL Servera, obrađuju ih, a ažurirane podatke šalju natrag poslužitelju. SQLXML spaja relacijske podatke s XML podacima u SQL Serveru. SQLXML služi za postavljanje upita na relacijskim podacima koristeći T-SQL i vraćanje XML rezultata, postavljanje upita relacijskim podacima s XPath te ažuriranje relacijskih podataka uporebom XML-a. Pored olakšavanja rada s relacijskim podacima kao XML-om, SQLXML omogućuje izvođenje upita XML predložaka – upita ugrađenih u dinamički XML dokument – te poslužiteljskih XPath upita u SQL Serveru 2005. SQL Server .NET pružatelj podataka, bez SQLXML-a, ne pruža ovu mogućnost. SQLXML 4.0 podržava i SQL Native Client i SQLOLEDB pružatelje. Preporuča se SQL Native Client pružatelj jer podržava nove značajke SQL Servera 2005, poput xml tipa podataka.

SQLXML upravljane klase SQLXML upravljane klase izlažu SQLXML 4.0 funkcionalnost unutar .NET aplikacija. SQLXML upravljane klase pružaju metode za izvođenje naredbi (SqlXmlCommand), stvaranje parametara za naredbe (SqlXmlParameter) i međudjelovanje s klasom DataSet (SqlXmlAdapter). Ove su klase opisane u sljedećim odjeljcima.

130 | Programiranje SQL Server 2005

SqlXmlCommand Klasa SqlXmlCommand izvodi T-SQL naredbu, pohranjenu proceduru, XPath naredbu, datoteku XML predloška, UpdateGram ili DiffGram prema bazi podataka. (UpdateGrami i DiffGrami bit će raspravljeni kasnije u ovom poglavlju.) Konstruktor za SqlXmlCommand objekt je: SqlXmlCommand(string connectionString)

gdje je connectionString OLE DB niz znakova za povezivanje koji raspoznaje informacije o pružatelju, poslužitelju, bazi podataka i korisničkom računu. Na primjer: Provider=SQLNCLI;Server=(local);database=AdventureWorks;Integrated Security=SSPI

Trebali biste normalno postaviti svojstvo Provider veze na SQLNCLI jer SQL Native Client pružatelj podataka podržava nove značajke SQL Servera 2005, kao što je xml tip podataka. Klasa SqlXmlCommand ima javne metode opisane u tablici 6-3. Tablica 6-3. Javne metode klase SqlXmlCommand Metoda

Opis

ClearParameters()

Uklanja SqlXmlParameter objekte stvorene za naredbeni objekt.

CreateParameter()

Stvara i vraća SqlXmlParameter objekt za naredbeni objekt.

ExecuteNonQuery()

Izvodi naredbu i ništa ne vraća.

ExecuteStream()

Vraća novi Stream objekt koji sadrži rezultate upita.

ExecuteToStream(Stream)

Vraća rezultate postojećem Stream objektu.

ExecuteXmlReader()

Vraća XmlReader objekt koji sadrži rezultate upita.

Klasa SqlXmlCommand ima javna svojstva opisana u tablici 6-4. Tablica 6-4. Javna svojstva klase SqlXmlCommand Svojstvo

Opis

BasePath

Putanja mape koja se koristi za otkrivanje relativne putanje sheme preslikavanja (zadane svojstvom SchemaPath), relativne putanje XSL datoteke (zadane svojstvom XslPath) ili referencom vanjske sheme u XML predlošku (zadanom upotrebom atributa mapping-schema).

ClientSideXml

Zadaje pretvara li se skup rezultata u XML na klijentskoj strani (srednji sloj).

CommandStream

Datoteka koja sadrži tekst naredbe koju treba izvesti. Ako je upotrijebljena datoteka CommandStream, dopuštene su samo CommandType vrijednosti ažuriranja DiffGram, Template i UpdateGram.

CommandText

Tekst naredbe koji treba izvesti. Možete izvesti pohranjene procedure s SqlXmlCommand objektom zadavanjem teksta naredbe kako slijedi: EXEC storedProcedureName [ ? [ , ... n] ]

gdje upitnik (?) predstavlja jedan ili više parametara: instance klase SqlXmlParameter, raspravljene u sljedećem odlomku.

Poglavlje 6: .NET klijentsko programiranje | 131

Tablica 6-4. Javna svojstva klase SqlXmlCommand (nastavak) Svojstvo

Opis

CommandType

Tip naredbe koju treba izvesti. To je jedna od sljedećih vrijednosti iz enumeracije SqlXmlCommandType: Sql

T-Sql naredba (tekst ili pohranjena procedura).

XPath

XPath naredba.

Template

XML predložak.

TemplateFile

XML predložak na zadanoj putanji.

UpdateGram

UpdateGram.

Diffgram

DiffGram.

Namespaces

Imenski prostori za XPath upit.

OutputEncoding

Način kodiranja za vraćeni tok. Podrazumijeva se UTF-8.

RootTag

Oznaka na korijenskoj razini za vraćene XML rezultate. Ako su rezultati naredbe u XML fragmentu, ovim ga se svojstvom može učiniti valjanim XML dokumentom.

SchemaPath

Ime sheme preslikavanja za XPath upit, uključujući putanju mape. Putanja može biti apsolutna ili relativna. Ako je relativna, svojstvo BasePath se koristi za otkrivanje relativne putanje.

XslPath

Ime datoteke XML transformacije, uključujući putanju mape koju treba primijeniti na XML skup rezultata. Putanja može biti apsolutna ili relativna. Ako je relativna, svojstvo BasePath se koristi za otkrivanje relativne putanje.

SqlXmlParameter SqlXmlCommand objekti podržavaju parametrizirane upite s tekstom naredbe i pohranjene procedure. Pozovite metodu CreateParameter() klase SqlXmlCommand da napravi parametar. Klasa SqlXmlParameter ima javna svojstva opisana u tablici 6-5. Tablica 6-5. Javna svojstva klase SqlXmlParameter Svojstvo

Opis

Name

Uzima ili postavlja ime parametra.

Value

Uzima ili postavlja vrijednost parametra.

SqlXmlAdapter Klasa SqlXmlAdapter slična je klasi DataAdapter. Ona pruža mehanizam za učitavanje XML podataka u DataSet i nakon toga ažuriranje baze podataka s promjenama koje su učinjene offline nad podacima u DataSet-u. SqlXmlAdapter ima sljedeće javne konstruktore:

132 | Programiranje SQL Server 2005

SqlXmlAdapter(SqlXmlCommand command) SqlXmlAdapter(string commandText, SqlXmlCommandType commandType, string connectionString) SqlXmlAdapter(Stream commandStream, SqlXmlCommandType commandType, string connectionString)

SqlXmlAdapter ima javne metode opisane u tablici 6-6. Tablica 6-6. Javna svojstva klase SqlXmlAdapter Metoda

Opis

Fill()

Izvodi SqlXmlCommand objekt i u DataSet objekt učitava skup rezultata koji je vratila ta naredba.

Update()

Prenosi promjene učinjene u DataSet objektu natrag na poslužitelj baze podataka.

Upotreba SQLXML upravljanih klasa Ovaj odlomak sadrži primjere koji pokazuju kako upotrijebiti SQLXML upravljane klase za dobivanje, obradu, izlaz i ažuriranje podataka. Visual Studio 2005 projekti zahtijevaju referencu na imenski prostor Microsoft.Data.SqlXml kako bi koristili SQLXML upravljane klase.

Izvođenje upita Sljedeći primjer čita prva dva zaposlenika iz tablice HumanResources.Employee iz baze AdventureWorks i smješta ih u Stream objekt. using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT TOP 2 * FROM HumanResources.Employee " + "FOR XML AUTO"; Stream stream = cmd.ExecuteStream( ); StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd( ); Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 6: .NET klijentsko programiranje | 133

Primjer upotrebljava klasu StreamReader da pročita Stream u niz znakova koji je tada izlaz na konzoli. Slijede rezultati:

Upotreba parametara u upitu Sljedeći primjer koristi parametrizirani upit da pročita podatke za zaposlenika: using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT * FROM HumanResources.Employee " + "WHERE EmployeeID=? FOR XML AUTO"; // Stvara parametar za čitanje podataka za EmployeeID = 5 SqlXmlParameter parm = cmd.CreateParameter( ); parm.Value = "5"; Stream stream = cmd.ExecuteStream( ); StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd( ); Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

OLE DB upiti koriste upitnik (?) kao zamjenski znak kako bi prepoznali parametre u upitu. Parametri u nizu znakova upita zamjenjuju se istim redoslijedom kojim su stvoreni iz SqlXmlCommand objekta upotrebom metode CreateParameter().

134 | Programiranje SQL Server 2005

Oblikovanje s klauzulom FOR XML SQL Server 2005 omogućuje oblikovanje rezultata T-SQL upita u XML dokument, bilo na poslužiteljskoj ili klijentskoj strani. To ćete postići upotrebom klauzule FOR XML iskaza SELECT. Možete zadati jedan od tri FOR XML režima za poslužiteljsko oblikovanje XML-a: RAW

Jedan element vraća se u XML dokumentu za svaki red u skupu rezultata. AUTO

Vraćen je XML dokument s automatski stvorenom hijerarhijom na temelju načina zadavanja iskaza SELECT. Ugniježđeni FOR XML upiti mogu prevladati ograničenja za hijerarhiju koja je automatski generirana. EXPLICIT

XML dokument vraćen je na temelju informacija o obliku (engl. shape information) upitu. Informacije o obliku dopuštaju podešavanje redova skupa rezultata u hijerarhije. EXPLICIT režim omogućuje izradu složenih, prilagođenih XML struktura za skup rezultata. Klijentsko oblikovanje XML-a oblikuje skup rezultata SQL upita u XML na klijentu umjesto na SQL Serveru. Postoje tri klijentska FOR XML režima: RAW

Identičan poslužiteljskom RAW režimu. NESTED

Sličan poslužiteljskom AUTO režimu, sa sljedećim iznimkama: Upit prema pogledu vraća ime osnovne tablice kao ime elementa kad se upotrebljava klijentsko oblikovanje. Kad se upotrebljava poslužiteljsko oblikovanje, ime pogleda se vraća kao ime elementa. Upit prema tablici pod pseudonimom vraća ime osnovne tablice kao ime elementa kad se upotrebljava klijentsko oblikovanje. Kad se upotrebljava poslužiteljsko oblikovanje, pseudonim tablice se vraća kao ime elementa. EXPLICIT

Sličan poslužiteljskom EXPLICIT režimu. Ne možete koristiti klijentsko oblikovanje s upitima koji vraćaju višestruke skupove rezultata. Međutim, u XML predlošku, možete zadati više od jednog bloka, od kojih će svaki sadržavati upit koji vraća samo jedan skup rezultata. Ako u upitu zadate FOR XML AUTO režim, oblikovanje XML-a dogodit će se na poslužitelju čak i ako je klijentsko oblikovanje drugačije zadano.

Slijede rezultati:

Obrađivanje iznimki Sljedeći primjer pokazuje kako obraditi iznimku SqlXmlException. On modificira primjer iz prethodnog odlomka – parametar koji se očekuje u nizu znakova upita nije sada stvoren pa, kao rezultat, pri izvedbi kod izbacuje iznimku. using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT * FROM HumanResources.Employee " + "WHERE EmployeeID=? FOR XML AUTO"; try { stream = cmd.ExecuteStream(

);

StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd( ); Console.WriteLine(s); } catch (SqlXmlException ex) { Console.WriteLine(ex.Message); } Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 6-1.

Slika 6-1. Rezultati primjera obrade iznimke

136 | Programiranje SQL Server 2005

Dobivanje XmlReader objekta Sljedeći primjer čita podatke za prva dva zaposlenika iz tablice HumanResources. Employee u bazi AdventureWorks, u XmlTextReader objekt: using System; using Microsoft.Data.SqlXml; using System.Xml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT TOP 2 * FROM HumanResources.Employee " + "FOR XML AUTO"; XmlReader xr = cmd.ExecuteXmlReader( ); using (XmlTextWriter xtw = new XmlTextWriter(Console.Out)) { xtw.WriteNode(xr, false); xtw.Flush( ); } Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Primjer koristi XmlTextWriter objekt da na konzolu prikaže rezultate u XmlReader objektu. Rezultati su sljedeći:

Obrađivanje XML skupa rezultata na klijentu Sljedeći primjer vraća skup rezultata i koristi svojstvo ClientSideXml objekta SqlXmlCommand kako bi obradio rezultate na klijentskoj strani. On stvara XML dokument oblikovan upotrebom FOR XML NESTED režima.

Poglavlje 6: .NET klijentsko programiranje | 137

using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { Stream stream; SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT TOP 2 * FROM HumanResources.Employee " + "FOR XML NESTED"; cmd.ClientSideXml = true; stream = cmd.ExecuteStream( ); StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd( ); Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Možete također zadati pohranjenu proceduru koja vraća regularni skup rezultata koji nije XML. Slijede rezultati:

Popunjavanje DataSeta Sljedeći primjer koristi XmlDataAdapter objekt kako bi popunio DataSet objekt: using System; using Microsoft.Data.SqlXml; using System.Data; class Program { static void Main(string[] args)

138 | Programiranje SQL Server 2005

{ SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT TOP 2 * FROM HumanResources.Employee " + "FOR XML AUTO"; DataSet ds = new DataSet( ); SqlXmlAdapter da = new SqlXmlAdapter(cmd); da.Fill(ds); foreach (DataRow row in ds.Tables[0].Rows) Console.WriteLine("{0} {1}", row["EmployeeID"], row["Title"]); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 6-2.

Slika 6-2. Rezultati primjera popunjavanja DataSet-a

Primjena XSLT transformacije na XML skup rezultata Sljedeći primjer primjenjuje XSLT transformaciju na XML skup rezultata koji sadrži prvih deset zaposlenika iz tablice HumanResources.Employee u bazi AdventureWorks. Slijedi XSL datoteka pod imenom C:\PSS2005\Employee.xsl: Employee ID

Poglavlje 6: .NET klijentsko programiranje | 139

Title

Slijedi kod koji generira HTML datoteku primjenom XSLT datoteke Employee.xsl (pohranjene u mapi C:\PSS2005): using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = "SELECT TOP 10 * FROM HumanResources.Employee " + "FOR XML AUTO"; cmd.CommandType = SqlXmlCommandType.Sql; cmd.RootTag = "ROOT"; cmd.XslPath = @"C:\PSS2005\Employee.xsl"; Stream s = cmd.ExecuteStream( ); byte[] b = new byte[s.Length]; s.Read(b, 0, b.Length); FileStream fs = new FileStream(@"C:\PSS2005\Employee.html", FileMode.OpenOrCreate); fs.Write(b, 0, b.Length); fs.Flush( ); } }

Svojstvo CommandType objekta SqmXmlCommand postavljeno je na SqlXmlCommandType.Sql iz vrijednosti opisanih u tablici 6-4. Ono zadaje da se obrađuje SQL naredba iz svojstva CommandText. Metoda ExecuteStream() objekta SqlXmlCommand vraća rezultate izvođenja naredbe – u ovom slučaju SQL upita – kao Stream objekt. Svojstvo RootTag objekta SqlXmlCommand objekta zadaje korijenski element za XML kojeg je generirao upit – u ovom slučaju ROOT, koji se podudara s elementom xsl: applytemplates select u datoteci XSLT transformacije. Svojstvo XslPath zadaje puno ime datoteke

XSLT transformacije koju treba upotrijebiti – putanja prema datoteci može biti apsolutna ili relativna. Slijedi izvadak iz rezultirajuće HTML datoteke, nazvane C:\PSS2005\Employee.html:

140 | Programiranje SQL Server 2005

Employee ID Title 1 Production Technician - WC60 2 Marketing Assistant ... 10 Production Technician - WC10

Slika 6-3 prikazuje datoteku u Internet Exploreru.

Anotirane sheme preslikavanja XML shema definira strukturu XML dokumenta i bilo kakva ograničenja na podatke u dokumentu. U XML shemi, element obuhvaća shemu. Element također sadrži atribute koji definiraju imenski prostor u kojem se shema nalazi, kao i imenske prostore upotrijebljene u shemi. Valjana XSD shema izvedena je iz imenskog prostora XML sheme na http://www.w3.org/2001/XMLSchema, a element mora biti definiran na sljedeći način:

Anotacije su atributi koji se koriste za preslikavanje XML podataka u tablice i stupce baze podataka u relacijskoj bazi podataka te za zadavanje relacija između višestrukih tablica i ograničenja na njih, unutar XSD sheme. Ove sheme preslikavanja omogućuju sljedeće: • Upotrebu upita XML predloška prema XML pogledima koje je vratila XSD shema i vraćanje rezultata kao XML dokumenta. Upiti predloška raspravljeni su kasnije u ovom poglavlju, u odlomku „Upiti XML predloška“. Poglavlje 6: .NET klijentsko programiranje | 141

Slika 6-3. Rezultati primjera primjene XSLT transformacije

• Upotrebu UpdateGram predložaka za modificiranje podataka u bazi podataka SQL Servera. UpdateGram predlošci raspravljeni su kasnije u ovom poglavlju, u odlomku „UpdateGram predlošci“ • Skupno učitavanje XML podataka u bazu podataka SQL Servera. Skupno učitavanje podataka raspravljeno je u poglavlju 7. Anotacije su definirane u imenskom prostoru urn:schemas-microsoft-com:mappingschema. Dodavanje ovog imenskog prostora elementu najlakši je način zadavanja imenskog prostora:

Možete zadati bilo koji prefiks (umjesto sql) za imenski prostor. XSD shemu možete lako izraditi upotrebom XML Schema Designera u Visual Studiju 2005. Na primjer, za izradu sheme za tablicu HumanResources.Employee u bazi AdventureWorks, slijedite ove korake: 1. Izradite novi projekt u Visual Studiju 2005. 2. Desnom tipkom miša pritisnite projekt u Solution Exploreru i izaberite Add ➝ New Item iz kontekstnog izbornika kako biste otvorili dijaloški okvir Add New Item. 142 | Programiranje SQL Server 2005

3. Izaberite predložak za XML shemu, nazovite je Vendor.xsd i pritisnite gumb Add. Površina XML Schema Designera otvorit će se prazna. 4. Otvorite prozor Server Explorer odabirom View izbornika.



Server Explorer iz glavnog

5. Dodajte vezu podataka na bazu podataka AdventureWorks, ukoliko ne postoji, pritiskanjem čvora Data Connections desnom tipkom miša i odabirom Add Connection u Server Exploreru. Dovršite dijaloški okvir Add Connection i pritisnite gumb OK. 6. Povucite tablicu Employee (HumanResources) u Server Exploreru na površinu Employee.xsd XML Schema Designera. 7. Desnom tipkom miša pritisnite površinu XML Schema Designera i iz kontekstnog izbornika izaberite View Code kako biste vidjeli XSD shemu koja slijedi:

Poglavlje 6: .NET klijentsko programiranje | 143



Ovoj XSD shemi možete dodati anotacije te ukloniti informacije o shemi koje vam nisu potrebne. Sljedeći primjer pokazuje istu shemu s dodanim preslikavanjima sql: relation i sql:field te uklonjenim nepotrebnim informacijama. Uočite dodatak podebljanog imenskog prostora mapping-schema u elementu xs:schema.

Ako nije zadan sql:field atribut za element ili atribut polja, taj se element automatski preslikava na stupac koji nosi isto ime, ako takav postoji. Anotacije u primjeru zapravo nisu nužne jer elementi polja i stupci imaju isto ime. Razlikovanje velikih i malih slova imena tablica i polja definiranih sql:relation i sql: field atributima određena je ovisno o tome koristi li SQL Server način sortiranja koji razlikuje veličinu slova. Tablica 6-7 opisuje najuobičajenije anotacije sheme preslikavanja.

144 | Programiranje SQL Server 2005

Tablica 6-7. SQL Server 2005 anotacije sheme preslikavanja Anotacija

Opis

sql:encode

Navodi da je element ili atribut preslikan na stupac tipa BLOB vraćen polju kao URL, umjesto kao podaci kodirani s Base64 unutar XML dokumenta.

sql:field

Preslikava element na polje u tablici koju je zadao sql:relation atribut za roditeljski element.

sql:guid

Navodi da je vrijednost stupca tipa GUID upotrijebljena u UpdateGramu za taj stupac, umjesto vrijednosti pružene u UpdateGramu.

sql:hide

Skriva element ili atribut zadan u shemi u ishodišnom XML dokumentu.

sql:identity

Za stupac tipa identiteta zadaje način na koji se stupac ažurira koristeći UpdateGram.

sql:inverse

Navodi da bi UpdateGram trebao obrnuti redoslijed ažuriranja relacije roditelj – potomak zadan u elementu sql:relationship. Ovo prevladava prijestupe primarni ključ/vanjski ključ kad se koristi s UpdateGramom ili operacijim skupnog učitavanja.

sql:is-constant

Zadaje element koji se ne preslikava na stupac u tablici, već se uključuje u izlaz XML dokumenta.

sql:key-fields

Zadaje stupce koji jedinstveno identificiraju redove unutar tablice.

sql:limit-field

Navodi da atribut ili element sadrži vrijednost ograničenja zadanu upotrebom anotacije sql:limit-value.

sql:limit-value

Zadaje vrijednost ograničenja u stupcu kojeg je navela anotacija sql:limit-field.

sql:mapped

Navodi jesu li elementi preslikani na tablicu ili stupac te pojavljuju li se u izlazu XML dokumenta. Anotacija uzima vrijednost 0 za netočno ili 1 za točno.

sql:max-depth

Zadaje maksimalnu dubinu u rekurzivnim relacijama zadanim u shemi.

sql:overflow-field

Zadaje stupac koji sadrži višak podataka – neiskorištene podatke iz izvornog XML stupca.

sql:prefix

Ispred ID, IDREF i IDREFS stavlja prefiks niza znakova kako bi se zajamčila jedinstvenost unutar XML dokumenta.

sql:relation

Preslikava XML stavku na zadanu tablicu u bazi podataka.

sql:relationship

Zadaje relaciju za element (sql:relation) tablice upotrebom parent, child, parent-key i child-key atributa za zadavanje relacije.

Anotacije se koriste za definiranje relacijske hijerarhije podataka s temeljem na relacijama pozadinskih tablica. Zadajte element za svaku relaciju u elementu unutar elementa u XSD shemi. Sljedeći odlomak koda određuje relaciju roditelj – potomak između tablica Sales.Customer i Sales. SalesOrderHeader u bazi AdventureWorks:

Poglavlje 6: .NET klijentsko programiranje | 145

Dodajte element odmah nakon elementa . Tablica 6-8 opisuje atribute anotacije koji se koriste za zadavanje XSD relacije. Tablica 6-8. Atributi anotacije sql:relationship Atributi anotacije sql:relationship

Opis

Name

Jedinstveno ime unutar XSD sheme za relaciju.

Parent

Zadaje roditeljsku tablicu. Ovaj je element neobavezan – na roditelja će ukazati hijerarhija ako atribut parent nedostaje.

parent-key

Zadaje roditeljski ključ. Ako ključ ima više od jednog polja, odvojite imena polja razmakom.

Child

Zadaje tablicu potomka.

child-key

Zadaje ključ potomka koji se preslikava na roditeljski ključ. Ako ključ ima više od jednog polja, odvojite imena polja razmakom.

Za više informacija o XSD shemama, pogledajte Microsoft SQL Server 2005 Books Online.

Upiti XML predloška Upit XML predloška je XML dokument s jednim ili više T-SQL ili XPath upita unutar njega. Upiti XML predloška omogućuju postavljanje upita XML dokumentu koristeći T-SQL ili XPath. Sintaksa je: [ [ paramValue [ ... n ] ] ] > tsqlQuery [ ... n ] [ ... n ] xpathQuery

gdje: rootName

Navodi ime elementa najviše razine. stylesheet

Navodi ime XSLT opisa stila koji treba primijeniti na skup rezultata prije vraćanja oblikovanih rezultata klijentu. Ako je XSLT opis stila zadan, rezultati se transformiraju prije no što se vrate klijentu kao oblikovani rezultati. 146 | Programiranje SQL Server 2005

paramValue

Zadaje neobavezne parametarske vrijednosti za parametrizirane T-SQL upite i pohranjene procedure. tsqlQuery

Zadaje jedan ili više T-SQL iskaza koji čine paket. Možete također zadati jedan ili više elemenata (tj. jedan ili više paketa T-SQL iskaza). annotatedSchemaFile

Zadaje referencu na anotiranu XSD shemu. Anotirane XML-Data Reduced (XDR) sheme također su podržane radi kompatibilnosti sa starijim inačicama. xpathQuery

Zadaje XPath upit. Rasprava o XPath upitima izvan je dosega ove knjige. Za informacije o XPath upitima, pogledajte knjigu XPath and XPointer (O’Reilly, 2002) ili W3C XPath specifikaciju na http://www.w3.org/TR/1999/PR-xpath-19991008.html. Sljedeći primjer upotrebljava datoteku XML predloška koja sadrži T-SQL upit za vraćanjem XML dokumenta koji sadrži prva dva zaposlenika iz tablice HumanResources. Employee u AdventureWorks. Slijedi XML predložak koji sadrži T-SQL upit: SELECT TOP 2 * FROM HumanResources.Employee FOR XML AUTO

Slijedi kod koji izvodi upit iz datoteke XML predloška (pohranjene u mapi C:\PSS2005): using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandType = SqlXmlCommandType.TemplateFile; cmd.CommandText = @"C:\PSS2005\TopTwoEmployeesTemplate.xml"; Stream stream = cmd.ExecuteStream(

);

StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd( ); Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue.");

Poglavlje 6: .NET klijentsko programiranje | 147

Console.ReadKey(

);

} }

Slijede rezultati:

Svojstvo CommandType objekta SqmXmlCommand postavljeno je na SqlXmlCommandType.TemplateFile iz vrijednosti opisanih u tablici 6-4. Ovo zadaje da se izvodi datoteka predloška na lokaciji koja je navedena svojstvom CommandText. Metoda ExecuteStream() SqlXmlCommand objekta vraća rezultate izvedbe naredbe – u ovom slučaju upita iz datoteke XML predloška – kao Stream objekt. Sljedeći primjer pokazuje kako izvesti XPath upit prema shemi preslikavanja za tablicu HumanResources.Employee u bazi podataka AdventureWorks. Slijedi shema preslikavanja:

148 | Programiranje SQL Server 2005



Kod koji vraća XML dokument koji sadrži podatke za zaposlenika s EmployeeID = 2 upotrebljava XPath upit i prethodnu datoteku preslikavanja (pohranjenu u mapi C:\PSS2005): using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=AdventureWorks;Integrated Security=SSPI"); cmd.CommandText = @"Employee[EmployeeID=2]"; cmd.CommandType = SqlXmlCommandType.XPath; cmd.RootTag = "ROOT"; cmd.SchemaPath = @"C:\PSS2005\Employee.xsd"; Stream stream = cmd.ExecuteStream(

);

StreamReader sr = new StreamReader(stream); string s = sr.ReadToEnd( ); Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Slijede rezultati: 2 253022876 1030 adventure-works\kevin0 6 Marketing Assistant

Poglavlje 6: .NET klijentsko programiranje | 149

1977-06-03 S M 1997-02-26 0 42 41 1 1B480240-95C0-410F-A717-EB29943C8886 2004-07-31

Svojstvo CommandType SqmXmlCommand objekta postavljeno je na SqlXmlCommandType.Xpath iz vrijednosti opisanih u tablici 6-4. Ono zadaje da se izvodi XPath naredba iz svojstva CommandText. Metoda ExecuteStream() objekta SqlXmlCommand vraća rezultate izvedbe naredbe – u ovom slučaju XPath upita – kao Stream objekt.

UpdateGram predlošci UpdateGram je XML predložak koji se upotrebljava za umetanje, ažuriranje ili brisanje podataka u bazi podataka. UpdateGram koristi informacije o preslikavanju pružene u anotiranoj XML (XSD ili XDR) shemi. Format UpdateGram predloška je: ... ...

gdje su sljedeći elementi definirani u imenskom prostoru urn:schemas-microsoft-com: xmlupdategram:

Sadrži jedan ili više parova i blokova. Ovi blokovi moraju biti zadani kao parovi, čak i ako su prazni. UpdateGram može sadržavati višestruke blokove, a sa svakim se od njih postupa kao s transakcijskom jedinicom. mapping-schema= "AnnotatedSchemaFile.xml"

Neobavezno zadaje datoteku anotirane XSD ili XDR sheme preslikavanja koja se upotrebljava za preslikavanje elemenata i atributa u i blokovima na tablice i stupce u bazi podataka.

Sadrži izvornu inačicu (stanje prije) instance zapisa.

150 | Programiranje SQL Server 2005



Sadrži ažuriranu inačicu (stanje poslije) instance zapisa. UpdateGram koristi operacije opisane u tablici 6-9. Tablica 6-9. UpdateGram operacije Operacija

Opis

Insert

Zapis se umeće ako se pojavljuje samo u bloku.

Update

Zapis se ažurira ako se pojavljuje u bloku s odgovarajućim zapisom u bloku. Zapis se ažurira do vrijednosti zadanih u bloku.

Delete

Zapis se briše ako se pojavljuje samo u bloku.

UpgradeGram preslikavanje na bazu podataka može biti zadano implicitno ili eksplicitno, upotrebom XSD ili XDR sheme. Implicitno preslikavanje preslikava svaki element u i elementima u tablicu, a svaki atribut i elemenata u stupac u tablici. Eksplicitno preslikavanje upotrebljava datoteku anotirane sheme zadanu mappingschema atributom elementa za preslikavanje elemente i atribute u i elementima u tablice i stupce u bazi podataka. Putanja datoteke sheme preslikavanja zadana je u odnosu na lokaciju UpdateGram predloška. Primjeri u ovom odlomku upotrebljavaju tablicu pod imenom UpdateGramTable. Izradite tablicu upotrebom sljedećeg T-SQL iskaza: USE ProgrammingSqlServer2005 CREATE TABLE UpdateGramTable ( ID int, Name varchar(50) )

Sljedeći kod izvodi UpdateGram. Kako biste obradili tri UpdateGram predloška koji slijede kod, zamijenite puno ime datoteke za datoteku UpdateGram predloška proslijeđenu u konstruktor StreamReader s imenima svake od tri datoteke UpdateGram predložaka, redoslijedom kojim se pojavljuju. using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { StreamReader sr = new StreamReader(@"C:\PSS2005\UpdateGram.xml"); string s = sr.ReadToEnd( ); sr.Close( );

Poglavlje 6: .NET klijentsko programiranje | 151

SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=ProgrammingSqlServer2005;Integrated Security=SSPI"); cmd.CommandType = SqlXmlCommandType.UpdateGram; cmd.CommandText = s; cmd.ExecuteNonQuery(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Svojstvo CommandType SqmXmlCommand objekta postavljeno je na SqlXmlCommandType.UpdateGram iz vrijednosti opisanih u tablici 6-4. Ono zadaje obradu UpdateGram u svojstvu CommandText. Metoda ExecuteNonQuery() objekta SqlXmlCommand izvodi naredbu – u ovom slučaju obrađuje UpdateGram – i ne vraća ništa. Sljedeći UpdateGram umeće tri zapisa u tablicu UpdateGramTable:

Sljedeći UpdateGram briše zapis s ID = 2 iz tablice UpdateGramTable:

Sljedeći UpdateGram ažurira zapis s ID = 3 u tablici UpdateGramTable:

152 | Programiranje SQL Server 2005

DiffGram formati DiffGram je format XML dokumenta uveden s DataSet u Visual Studiju .NET 1.0 i koristi se za sinkroniziranje promjena učinjenih izvan mreže na podacima s poslužiteljem baze podataka ili drugom spremištu ustaljenja upotrebom DataAdapter. DiffGram format je: ... [ ... ]

gdje:

Sadrži najnoviju inačicu svih podataka, uključujući nepromijenjene podatke i bilo kakve promjene koje je klijent učinio dok je bio isključen (engl. offline).

Sadrži izvorne instance podataka (slogova) za podatke koji su bili ažurirani ili izbrisani. DiffGram koristi sljedeće XML anotacije koje su definirane u imenskom prostoru urn: schemas-microsoft-com:xml-diffgram-v1: id Asocira elemente instance podataka u i blokovima. hasChanges Zadan kao inserted ili modified na elementima u bloku za umetnute ili ažurirane zapise. parentID Određuje relacije roditelj-potomak unutar bloka, a upotrebljava se za utvrđivanje redoslijeda kojim se ažuriranja obrađuju. DiffGram prepoznaje jesu li zapisi nepromijenjeni, izbrisani, ažurirani ili umetnuti, u skladu s pravilima opisanim u tablici 6-10.

Poglavlje 6: .NET klijentsko programiranje | 153

Tablica 6-10. Pravila DiffGram formata za stanja zapisa Stanje zapisa

Opis

unchanged

Element postoji u bloku, ali ne i u bloku.

inserted

Element postoji u bloku, ali ne i u bloku. Element u bloku ima atribut hasChanges postavljen na inserted.

updated

Element postoji i u bloku i u bloku. Zapisi su asocirani upotrebom anotacije id, a atribut hasChanges postavljen je na modified na elementu u bloku.

Deleted

Element postoji samo u bloku.

Slijede primjeri upotrebe Diffgrama iz SQLXML 4.0 upravljanih klasa za modificiranje podataka u bazi podataka. Primjeri koriste tablicu pod imenom DiffGramTable. Napravite tablicu upotrebom sljedećeg T-SQL iskaza: USE ProgrammingSqlServer2005 CREATE TABLE DiffGramTable ( ID int, Name varchar(50) )

Primjeri u ovom odlomku također upotrebljavaju XSD anotiranu shemu preslikavanja pod imenom DiffGramTable.xsd za tablicu DiffGramTable:

Sljedeći kod izvodi DiffGram. Kako biste obradili tri DiffGram formata koji slijede kod, zamijenite puno ime datoteke za datoteku DiffGram formata proslijeđenu u konstruktor StreamReader s imenima svake od tri datoteke DiffGram formata, redoslijedom kojim se pojavljuju. using System; using System.IO; using Microsoft.Data.SqlXml; class Program { static void Main(string[] args) { StreamReader sr = new StreamReader(@"C:\PSS2005\DiffGram.xml");

154 | Programiranje SQL Server 2005

string s = sr.ReadToEnd( sr.Close( );

);

SqlXmlCommand cmd = new SqlXmlCommand("Provider=SQLNCLI;Server=(local);" + "database=ProgrammingSqlServer2005;Integrated Security=SSPI"); cmd.CommandType = SqlXmlCommandType.DiffGram; cmd.CommandText = s; cmd.ExecuteNonQuery(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Svojstvo CommandType SqmXmlCommand objekta postavljeno je na SqlXmlCommandType.DiffGram iz vrijednosti opisanih u tablici 6-4. Ono zadaje da se obrađuje DiffGram u svojstvu CommandText. Metoda ExecuteNonQuery() objekta SqlXmlCommand izvodi naredbu – u ovom slučaju obrađuje DiffGram – i ne vraća ništa. Sljedeći DiffGram umeće tri zapisa u tablicu DiffGramTable. Uočite kako je atribut hasChanges postavljen na "inserted". 1 Record 1 2 Record 2 3 Record 3

Sljedeći DiffGram briše zapis s ID = 2 iz tablice DiffGramTable. U ovom slučaju, hasChanges nije upotrijebljen. 2 Record 2

Sljedeći DiffGram ažurira zapis s ID = 3 u tablici DiffGramTable. Ovdje je hasChanges postavljen na ="modified". 3 Updated Record 3 3 Record 3

Okvir s porukom o iznimci API okvira s porukom iznimke instaliran je s grafičkim komponentama SQL Servera 2005. Implementiran je u klasi ExceptionMessageBox u imenskom prostoru Microsoft. SqlServer.MessageBox, a poboljšava standardni okvir s porukom implementiran u klasu System.Windows.Forms.MessageBox. Klasa ExceptionMessageBox uključuje sljedeću poboljšanu funkcionalnost: • Možete prikazati do pet prilagođenih gumba. • Možete prikazati prilagođeni tekst i simbole u okviru s porukom. • Korisnik može kopirati sve informacije iz okvira s porukom na Clipboard. • Možete prikazati pozadinske informacije o pogrešci u hijerarhijskom stablastom pogledu, kroz koji se korisnik može kretati.

156 | Programiranje SQL Server 2005

• Korisnik može odlučiti treba li poruka biti prikazana za sljedeća pojavljivanja iste iznimke. • Korisnik može pristupiti pomoći za iznimku upotrebom hiperveze za pomoć asocirane s iznimkom. Sljedeći primjer pokazuje kako upotrijebiti okvir s porukom iznimke unutar .NET aplikacije. Primjer izvodi T-SQL naredbu RAISERROR kao izvor pogreške. 1. Iz glavnog izbornika Visual Studija 2005 odaberite File ➝ New ➝ Project i izradite novi Windows Application projekt. Nazovite ga ExceptionMessageBoxProject. 2. Dodajte referencu na sklop Microsoft.ExceptionMessageBox.dll. Možda ćete ga morati potražiti – podrazumijevana instalacijska mapa je C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies. 3. Dodajte direktivu using za imenski prostor okvira s porukom u Form1.cs: using Microsoft.SqlServer.MessageBox;

4. U Form1 dodajte gumb i nazovite ga raiseExceptionButton. U metodu za obradu događaja pritiska na taj gumb, dodajte kod za izazivanje pogreške SQL poslužitelja upotrebom T-SQL naredbe RAISERROR u bloku try te kod za prikazivanje okvira s porukom iznimke u bloku catch. Slijedi cjelokupan kod za ovaj primjer: using using using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Text; System.Windows.Forms;

using Microsoft.SqlServer.MessageBox; using System.Data.SqlClient; namespace ExceptionMesageBoxProject { public partial class Form1 : Form { public Form1( ) { InitializeComponent( ); } private void raiseExceptionButton_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection("Data Source=(local);" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks"); conn.Open( ); SqlCommand cmd = new SqlCommand( "RAISEERROR('Test error', 15, 1)", conn);

Poglavlje 6: .NET klijentsko programiranje | 157

try { cmd.ExecuteNonQuery( ); } catch (Exception ex) { // Stvara okvir s porukom iznimke i postavlja dio opcija ExceptionMessageBox emb = new ExceptionMessageBox(ex); emb.Buttons = ExceptionMessageBoxButtons.Custom; emb.SetButtonText("Custom Button 1", "Custom Button 2", "Custom Button 3"); emb.DefaultButton = ExceptionMessageBoxDefaultButton.Button2; emb.Symbol = ExceptionMessageBoxSymbol.Question; emb.ShowCheckBox = true; emb.Show(this); // Prikazuje gumb koji je pritisnut MessageBox.Show("You clicked " + emb.CustomDialogResult.ToString( } finally { conn.Close( }

));

);

} } }

5. Pokrenite primjer. Kad pritisnete gumb, prikazat će se okvir s porukom iznimke, kao na slici 6-4.

Slika 6-4. Okvir s porukom iznimke

Metoda Show() klase ExceptionMessageBox uzima roditeljski prozor (tipa IWin32Window) kao jedini argument. Prosljeđivanje this kao roditelja čini okvir s porukom iznimke potomkom aktivnog prozora – obično je ovo željeno ponašanje.

158 | Programiranje SQL Server 2005

Možete postaviti do pet prilagođenih gumba koristeći preopterećeni konstruktor ExceptionMessageBox ili preopterećenu metodu SetButtonText() – oboje uzimaju tekstove gumba za do pet prilagođenih gumba kao argumente. Svojstvo CustomDialogResult ukazuje na to koji je prilagođeni gumb bio pritisnut. Ovaj primjer prikazuje neobavezno polje za potvrdu u okviru s porukom iznimke. Polje za potvrdu omogućuje korisniku da zada hoće li okvir s porukom biti prikazan za sljedeća pojavljivanja iste iznimke. Pritiskanje ikone Show Technical Details (ikona na desnom kraju alatne vrpce, na dnu okvira s porukom) otvara dijaloški okvir Advanced Information koji sadrži hijerarhiju informacija o pogrešci, kao što je prikazano na slici 6-5.

Slika 6-5. Napredne informacije za okvir s porukom iznimke

Instanca ExceptionMessageBox ima javna svojstva koja omogućuju kontrolu njezinog izgleda i funkcionalnosti, kao što je opisano u tablici 6-11.

Poglavlje 6: .NET klijentsko programiranje | 159

Tablica 6-11. Svojstva instance ExceptionMessageBox Svojstvo

Opis

Beep

Uzima ili postavlja vrijednost treba li dati zvučni signal kad se prikaže okvir s porukom.

Buttons

Uzima ili postavlja vrijednost gumba koji će se prikazati u okviru s porukom. Vrijednost iz enumeracije ExceptionMessageBoxButtons.

Caption

Uzima ili postavlja naslov za okvir s porukom iznimke.

CheckBoxRegistryKey

Uzima ili postavlja ključ baze Registry koji zadaje početnu vrijednost polja za potvrdu ako je svojstvo ShowCheckBox true. Ovo se svojstvo koristi zajedno sa svojstvom CheckBoxRegistryValue.

CheckBoxRegistryMeansDo NotShowDialog

Uzima ili postavlja da vrijednost baze Registry na koju upućuju svojstva CheckBoxRegistryKey i CheckBoxRegistryValue pokazuje da je korisnik odlučio ne

CheckBoxRegistryValue

Uzima ili postavlja vrijednost baze Registry koja zadaje početnu vrijednost polja za potvrdu ako je svojstvo ShowCheckBox true. Ovo se svojstvo koristi zajedno sa svojstvom CheckBoxRegistryKey.

CheckBoxText

Uzima ili postavlja tekst koji će se prikazati u polju za potvrdu u okviru s porukom kada je svojstvo ShowCheckBox true.

CustomDialogResult

Uzima prilagođeni gumb okvira s porukom koji je bio pritisnut. Ovo je vrijednost iz enumeracije ExceptionMessageBoxDialogResult. Vraća se None ako svojstvo Buttons nije postavljeno na ExceptionMessageBoxButtons.Custom.

CustomSymbol

Uzima ili postavlja Bitmap koji će se upotrijebiti kao simbol u okviru s porukom.

Data

Uzima sučelje IDictionary za hipervezu pomoći i detalje naprednih informacija asocirane s porukom najviše razine.

DefaultButton

Uzima ili postavlja podrazumijevani gumb u okviru s porukom kad je Buttons ExceptionMessageBoxButtons.Custom. Vrijednost iz enumeracije ExceptionMessageBoxDefaultButton.

DefaultDialogResult

Uzima ili postavlja vrijednost kao član enumeracije DialogResult koju je vratila metoda Show() kada je korisnik zadao da se ne pokazuje dijaloški okvir za sljedeća pojavljivanja iste poruke.

Font

Uzima ili postavlja vrstu pisma za upotrebu u okviru s porukom.

HelpLink

Uzima ili postavlja hipervezu prema datoteci pomoći ili Web stranici kao dodatnu pomoć u poruci najviše razine.

InnerException

Uzima ili postavlja unutarnju iznimku okvira s porukom kao instancu Exception.

IsCheckBoxChecked

Uzima ili postavlja je li polje za potvrdu u okviru s porukom iznimke označeno kad je ShowCheckboxProperty true.

Message

Uzima ili postavlja iznimku (kao instancu Exception) za okvir s porukom.

MessageLevelDefault

Uzima ili postavlja broj razina poruke za prikaz u okviru s porukom.

Options

Uzima ili postavlja opcije prikazivanja za okvir s porukom koristeći vrijednosti iz enumeracije ExceptionMessageBoxOptions.

pogledati poruku.

160 | Programiranje SQL Server 2005

Tablica 6-11. Svojstva instance ExceptionMessageBox (nastavak) Svojstvo

Opis

ShowCheckBox

Uzima ili postavlja treba li prikazati polje za potvrdu u okviru s porukom iznimke – polje za potvrdu omogućuje korisniku da zada hoće li okvir s porukom biti prikazan za sljedeća pojavljivanja iste iznimke.

ShowToolbar

Uzima ili postavlja treba li prikazati alatnu vrpcu s gumbima za pomoć, kopiranje i prikaz naprednih informacija.

Symbol

Uzima ili postavlja simbol koji će se prikazati u okviru s porukom koristeći vrijednost iz enumeracije ExceptionMessageBoxSymbol.

Text

Uzima ili postavlja tekst koji će se prikazati u okviru s porukom.

UseOwnerFont

Uzima ili postavlja treba li dobiti i upotrijebiti vrstu pisma roditeljskog prozora kao pismo za okvir s porukom.

Poglavlje 6: .NET klijentsko programiranje | 161

POGLAVLJE 7

XML podaci

SQL Server 2005 pruža opsežnu podršku za pohranu i obradu XML podataka. XML dokumente i fragmente možete pohranjivati na izvorni način kao stupce i T-SQL varijable novog xml tipa podataka. Stupci xml tipa podataka mogu biti indeksirani, tipizirani u skladu s XML shemom te manipulirani upotrebom XQuery i XML Data Manipulation Language (DML). Relacijski model posebno je pogodan za podatke koji su visoko strukturirani s dobro poznatom, dobro definiranom shemom. XML podaci, u drugu ruku, pogodni su za obradu podataka s fleksibilnom, razvijajućom ili nepoznatom strukturom. XML je također vrlo pogodan za pohranjivanje podataka koji predstavljaju hijerarhiju okruženja. Neki razlozi za pohranjivanje podataka kao XML-a uključuju sljedeće: • Upotreba administrativnih mogućnosti SQL Servera za rad sa XML podacima. • Učinkovito dijeljenje, postavljanje upita i pravljenje finih modifikacija na XML podacima. • Osiguravanje da su podaci potvrđeni prema postojećoj XML shemi. Pored izvornog pohranjivanja podataka, SQL Server 2005 dopušta preslikavanje relacijskih podataka u XML podatke upotrebom produženih XQuery funkcija te preslikavanje XML podataka u relacijske podatke upotrebom klauzule FOR XML. SQL Server 2005 uključuje SQLXML 4.0. Ovo proširuje i povećava klijentsku XML funkcionalnost uvedenu u SQLXML 3.0, koji se isporučivao kao Web izdanje nakon izdavanja SQL Servera 2000.

xml tip podataka Novi xml tip podataka podržava pohranu XML dokumenata i fragmenata u bazu podataka. XML fragment je XML instanca koja nema jedinstveni element najviše razine (korijen). Možete napraviti stupce, parametre i varijable novog xml tipa i u njih pohraniti XML instance. Instance xml tipa podataka imaju maksimalnu veličinu od 2 GB. 162

Kolekcija XML sheme može biti asocirana sa stupcem, parametrom ili varijablom xml tipa podataka. O xml tipu podataka s asociranom shemom kaže se da je tipiziran (engl. typed). XML shema potvrđuje instance xml tipa podataka prema ograničenjima i pruža informacije tipa podataka o elementima i atributima u instanci. Shema također pomaže SQL Serveru da optimizira pohranu podataka. Kolekcija XML shema mora biti registrirana u SQL Serveru prije no što može biti upotrijebljena za stvaranje tipiziranih xml instanci. Registracija je opisana u odlomku „Upravljanje kolekcijama XML shema“, kasnije u ovom poglavlju. Ukoliko želite upotrijebiti metode upita xml tipa podataka za stupce ili varijable xml tipa podataka, ili želite stvoriti ili prepraviti indekse na stupcima XML tipa podataka, morate postaviti konfiguracijske opcije baze podataka SQL Servera 2005, popisane u tablici 7-1. Podrazumijevano, vrijednosti su postavljene prema potrebama. One mogu biti promijenjene upotrebom naredbe SET. Možete provjeriti vrijednosti za svaku bazu podataka izvođenjem sljedećeg T-SQL upita: SELECT * FROM sys.databases

Tablica 7-1. Postavke konfiguracijskih opcija baze podataka SQL Servera 2005 za upotrebu metoda upita xml tipa podataka SET opcija

Potrebna vrijednost

ANSI_NULLS

ON

ANSI_PADDING

ON

ANSI_WARNINGS

ON

ARITHABORT

ON

CONCAT_NULL_YIELDS_NULL

ON

NUMERIC_ROUNDABORT

OFF

QUOTED_IDENTIFIER

ON

Izrada stupaca i varijabli xml tipa podataka Sljedeći pododlomci opisuju kako izraditi stupce i T-SQL varijable xml tipa podataka.

Stupci Upotrijebite naredbu CREATE TABLE kako biste izradili tablicu koja sadrži jedan ili više stupaca xml tipa podataka. Sintaksa za izradu tablice sa stupcem xml tipa podataka je: CREATE TABLE table_name ( ... xml_column_name xml [ [DOCUMENT | CONTENT] (schema_name.xml_schema_collection_name ) ], ... )

Poglavlje 7: XML podaci | 163

gdje je: table_name

Ime tablice u bazi podataka. xml_column_name Ime stupca xml tipa podataka u tablici. [ DOCUMENT | CONTENT ] DOCUMENT ograničava instancu xml tipa podataka kako bi dopustila samo jedan

element najviše razine. CONTENT eksplicitno dopušta tipiziranoj instanci xml tipa podataka da ima nula ili više elemenata najviše razine i tekstualnih čvorova u elementima najviše razine. Podrazumijeva se CONTENT. schema_name

XML shema u kolekciji XML shema koju treba asocirati sa stupcem xml tipa podataka. xml_schema_collection_name

Ime postojeće kolekcije XML shema. Sljedeći primjer izrađuje tablicu pod imenom xmlTest koja ima netipizirani stupac xml tipa podataka pod imenom xmlCol. Primjer također stvara klaster primarni ključ na stupcu ID za upotrebu u kasnijim primjerima. USE ProgrammingSqlServer2005 CREATE TABLE xmlTable ( ID int NOT NULL, xmlCol xml, CONSTRAINT PK_xmlTable PRIMARY KEY CLUSTERED (ID) )

Možete postaviti upit kataloškom pogledu sys.columns kako biste dobili informacije o stupcima xml tipa podataka u bazi podataka. Sljedeći upit vraća stupce xml tipa podataka u bazi podataka: USE AdventureWorks SELECT o.name, c.* FROM sys.columns c JOIN sys.objects o ON c.object_id = o.object_id WHERE EXISTS (SELECT * FROM sys.types t WHERE c.system_type_id = t.system_type_id AND name='xml')

Djelomični rezultati izvođenja upita za bazu podataka AdventureWorks prikazani su na slici 7-1.

164 | Programiranje SQL Server 2005

Slika 7-1. Rezultati primjera upita u kataloški pogled sys.columns

Ovaj upit udružuje kataloški pogled sys.columns s kataloškim pogledom sys.objects kako bi vratio tablicu ili pogled kojem pripada stupac xml tipa podataka kao prvi stupac u skupu rezultata. Klauzula EXISTS filtrira rezultate kako bi uključivali samo xml tipove podataka.

Varijable Naredba DECLARE koristi se za stvaranje T-SQL varijabli. Sintaksa za stvaranje varijable xml tipa podataka je: DECLARE variable_name [AS] xml [ ( [ DOCUMENT | CONTENT] schema_name.xml_schema_collection_name ) ]

gdje je: variable_name

Ime varijable xml tipa podataka. Ime varijable mora imati znak @ kao prefiks. Ostali su parametri jednaki onima opisanim u prethodnom odlomku „Stupci“. Sljedeći primjer koristi varijablu xml tipa podataka za umetanje reda u xmlTable izrađenu u prethodnom odlomku „Stupci“: USE ProgrammingSqlServer2005 DECLARE @xmlVar xml SET @xmlVar = '' INSERT INTO xmlTable (ID, xmlCol) VALUES (1, @xmlVar)

Sljedeći primjer stvara pohranjenu proceduru za modificiranje reda u tablici xmlTable: USE ProgrammingSqlServer2005 GO

Poglavlje 7: XML podaci | 165

CREATE PROCEDURE updateXmlTable @ID int, @xmlCol xml AS BEGIN UPDATE xmlTable SET xmlCol = @xmlCol WHERE ID = @ID END

Izvedite pohranjenu proceduru upotrebom sljedećeg koda kako biste ažurirali vrijednost xmlCol za red s ID = 1: USE ProgrammingSqlServer2005 SELECT * FROM xmlTable EXEC updateXmlTable 1, '' SELECT * FROM xmlTable

Skupovi rezultata koje je vratio upit za stanje prije i poslije prikazani su na slici 7-2.

Slika 7-2. Skupovi rezultata primjera pohranjene procedure koja koristi xml tip podataka

Ograničenja xml tip podataka ima sljedeća ograničenja:

• Ne može biti pohranjen u instancu sql_variant. • Ne može biti pretvoren u text ili ntext tipove podataka. • Ne podržava PRIMARY KEY, FOREIGN KEY, UNIQUE, COLLATE ili RULE ograničenja. • Samo string tipovi podataka mogu biti pretvoreni u xml tip podataka. • Ne može se uspoređivati ili sortirati i, kao rezultat toga, ne može se upotrijebiti u klauzuli GROUP BY. • Ne može se upotrijebiti u distribuiranim particioniranim pogledima. Particionirani pogledi spajaju vodoravno particionirane podatke iz skupa tablica članica, čineći da one izgledaju kao jedna tablica. U distribuiranom particioniranom pogledu barem se jedna od tablica nalazi na instanci udaljenog poslužitelja.

166 | Programiranje SQL Server 2005

• Ne može se upotrijebiti kao parametar za ijednu ugrađenu skalarnu funkciju, osim ISNULL, COALESCE ili DATALENGTH. • Ne može se upotrijebiti kao ključni stupac u indeksu. • Instrukcije za obradu (engl. processing instructions, PI) XML deklaracije () neće se sačuvati kad se XML instanca pohrani u bazu podataka. Sve druge instrukcije za obradu u XML instanci bit će sačuvane. • Redoslijed atributa u XML instancama pohranjenim u stupce xml tipa neće biti sačuvan. • Podrazumijevano, nevažne praznine neće biti sačuvane. Praznine mogu biti sačuvane za instancu xml tipa podataka zadavanjem neobaveznog style argumenta funkciji CONVERT. • Jednostruki navodnici (') i dvostruki navodnici (") oko vrijednosti atributa neće biti sačuvani jer se podaci pohranjuju kao parovi ime/vrijednost u bazu podataka. • Prefiksi imenskih prostora neće biti sačuvani i mogu se promijeniti kad se ponovno dobiju instance xml tipa podataka.

Stvaranje instanci xml tipa podataka Instance XML podataka možete stvoriti pretvorbom ili konvertiranjem iz nizova znakova. Možete čak iskoristiti prednost implicitne pretvorbe, jednostavno koristeći string umjesto vrijednosti xml tipa. Iduća dva pododlomka podrobnije opisuju ove teme, a treći pokazuje kako skupno učitati XML podatke. Četvrti način stvaranja vrijednosti xml tipa izdavanje je naredbe SELECT s klauzulom FOR XML. Ovu ćete metodu naći podrobno raspravljenu u odjeljku „XML rezultati upotrebom klauzule FOR XML“, kasnije u ovom poglavlju.

Pretvaranje tipa i konvertiranje nizova znakova Možete pretvoriti tip ili konvertirati (funkcija CONVERT) bilo koju instancu string tipa podataka – [n][var]char, [n]text, varbinary i image – u instancu xml tipa podataka. Netipizirani podaci provjeravaju se kako bi se osiguralo da su dobro oblikovani. Instance tipiziranih XML podataka evaluiraju se prema asociranoj shemi. XML analizator odbacuje nevažne praznine kad konvertira string tipove podataka u xml tipove podataka kad je točno jedno od sljedećeg: • Atribut xml:space nije definiran na elementu ili njegovim precima. • Atribut xml:space definiran na elementu ili jednom od njegovih predaka ima vrijednost default. Podrazumijevano ponašanje pri obradi praznina možete premostiti postavljanjem neobaveznog parametra style (trećeg) funkcije CONVERT na 1. Ne možete premostiti

Poglavlje 7: XML podaci | 167

podrazumijevano ponašanje pri obradi praznina kad koristite funkciju CAST za pretvaranje instance string tipa podataka u instancu xml tipa podataka. Sljedeći primjer umeće red u tablicu xmlTable izrađenu u odlomku „Izrada stupaca i varijabli xml tipa podataka“, ranije u ovom poglavlju. Primjer postavlja atribut style (treći argument) funkcije CONVERT tako da sačuva praznine kad konvertira string u instancu xml tipa podataka. USE ProgrammingSqlServer2005 INSERT INTO xmlTable (ID, xmlCol) VALUES (2, CONVERT(xml, '



', 1))

Ako argument style nije zadan ili je postavljen na 0, instanca xml tipa podataka bit će lišena praznina i pohranjena kako slijedi:

Prijenos konstante Konstanta string može se upotrijebiti tamo gdje se očekuje instanca xml tipa podataka. Izvodi se implicitna pretvorba u xml tip podataka. Ako je xml tip podataka tipiziran, XML koji se nalazi u string potvrđen je prema asociranoj XML shemi. Sljedeći primjer implicitno pretvara string u varijablu xml tipa podataka: DECLARE @xmlVar xml SET @xmlVar = '' SELECT @xmlVar

Vraćena je instanca xml tipa podataka, kao što je prikazano na slici 7-3.

Slika 7-3. Rezultati primjera dodjeljivanja xml konstante

Skupno učitavanje podataka s OPENROWSET Povećana OPENROWSET funkcionalnost u SQL Serveru 2005 omogućuje skupno učitavanje XML-a iz datoteka u stupce xml tipa podataka. Sintaksa za naredbu OPENROWSET za skupno učitavanje podataka je sljedeća: OPENROWSET (BULK 'data_file', { FORMATFILE = 'format_file_path' [ ] | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB } } ) ::=

168 | Programiranje SQL Server 2005

[ [ [ [ [ [

, , , , , ,

CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }] ERRORFILE = 'file_name' ] FIRSTROW = first_row ] LASTROW = last_row ] MAXERRORS = maximum_errors ] ROWS_PER_BATCH = rows_per_batch ]

gdje: BULK 'data_file'

Upotrebljava BULK pružatelj skupa redova iz datoteke podataka s potpunom putanjom koju zadaje data_file. FORMATFILE

Zadaje potpunu putanju datoteke formata – datoteke koja definira tipove stupaca u skupu rezultata. Podržani su XML i ne-XML tipovi datoteka formata. Ne-XML datoteka formata jednaka je onoj koja se koristi s bcp.exe ili naredbom BULK INSERT. Za više informacija pogledajte Microsoft SQL Server 2005 Books Online. Datoteka formata nije potrebna kad je zadan SINGLE_BLOB, SINGLE_CLOB ili SINGLE_ NCLOB.

Zadaje jednu ili više sljedećih opcija za opciju BULK: CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } Kodna stranica podataka u datoteci podataka. CODEPAGE je relevantna samo ako podaci sadrže char, varchar ili text stupce s vrijednostima znakova manjim od 32 ili većim od 127. ERRORFILE

Potpuna putanja do datoteke koja se koristi za zapisivanje neodgovarajućih redova u dnevnik – redova koji nisu učitani. FIRSTROW

Broj prvog reda koji treba učitati. Podrazumijevana vrijednost je 1, što znači prvi red u datoteci podataka. LASTROW

Broj zadnjeg reda koji treba učitati. Podrazumijevana vrijednost je 0, što znači zadnji red u datoteci podataka. MAXERRORS

Maksimalan broj pogrešaka u sintaksi ili neodgovarajućih redova prije no što OPENROWSET vrati pogrešku. Podrazumijevana vrijednost je 10. ROWS_PER_BATCH OPENROWSET uvijek skupno učitava datoteku podataka kao jedinstveni paket. ROWS_PER_BATCH zadaje približan broj redova u datoteci podataka, a koristi ga

obrađivač upita kao naznaku za alociranje resursa u planu upita. Podrazumijevana vrijednost je 0, što znači da ROWS_PER_BATCH nije poznat. Poglavlje 7: XML podaci | 169

SINGLE_BLOB

Vraća sadržaj datoteke podataka kao skup rezultata s jednim stupcem i jednim redom varbinary(max) tipa podataka. SINGLE_CLOB

Datoteka podataka čita se kao ASCII i vraća se kao skup rezultata s jednim stupcem i jednim redom varchar(max) tipa podataka. SINGLE_CLOB

Datoteka podataka čita se kao UNICODE i vraća se kao skup rezultata sa jednim stupcem i jednim redom nvarchar(max) tipa podataka. Idući primjer skupno učitava podatke iz tabulatorom ograničene datoteke OpenRowSetData.txt. Budite sigurni da su vrijednosti ID i ValueCol odvojene tabulatorom. 1 2 3 4

Value Value Value Value

1 2 3 4

Prvo stvorite tablicu, OpenRowSetTable, koja će biti odredište za skupno učitane podatke, izvođenjem sljedeće naredbe: CREATE TABLE OpenRowSetTable ( ID int, ValueCol varchar(50) )

Stvorite ne-XML datoteku formata pod imenom OpenRowSetData.fmt koja opisuje podatke koji se skupno učitavaju: 9.0 2 1 SQLCHAR 2 SQLCHAR

0 0

12 50

"\t" "\r\n"

1 2

ID ValueCol

"" SQL_Latin1_General_CP1_CI_AS

Izvođenje sljedeće OPENROWSET naredbe učitava podatke upotrebom ne-XML datoteke formata u tablicu OpenRowSetTable: INSERT INTO OpenRowSetTable(ID, ValueCol) SELECT rs.ID, rs.ValueCol FROM OPENROWSET( BULK N'C:\PSS2005\OpenRowSet\OpenRowSetData.txt', FORMATFILE = N'C:\PSS2005\OpenRowSet\OpenRowSetData.fmt') AS rs

Proučavanje tablice OpenRowSetTable otkriva četiri reda, kao što je prikazano na slici 7-4. U nastavku, skupno ćete učitati podatke iz tekstualne datoteke u tablicu OpenRowSetTable upotrebom XML datoteke formata. Izradite sljedeću XML datoteku formata i nazovite je OpenRowSetData.xml:

170 | Programiranje SQL Server 2005

Datoteke formata skupnog kopiranja Potrebna vam je datoteka formata skupnog kopiranja kako biste skupno učitali podatke iz datoteke u stupce u tablici. Datoteka formata definira raspored datoteke i ostale značajke podataka u datoteci. Postoje dva stila datoteka formata: ne-XML i XML. Možete upotrijebiti pomoćni program bcp kako biste generirali ne-XML ili XML datoteku formata. Sljedeća naredba generira ne-XML datoteku formata za tablicu OpenRowSetTable izrađenu u ovom odlomku: bcp.exe ProgrammingSqlServer2005.dbo.OpenRowSetTable format nul -f OpenRowSetData.fmt -T -c

gdje su opcije sljedeće: Zadaje potpuno kvalificiranu tablicu iz koje se generira datoteka formata. format nul –f Nalaže pomoćnom programu bcp da generira ne-XML datoteku formata. -T

Navodi da se pomoćni program bcp povezuje s SQL Serverom upotrebom pouzdane veze. Ako -T nije zadano, morate zadati -U ili -P (korisničko ime i lozinka) za prijavu.

-c

Navodi da su podaci u datoteci skupnog učitavanja znakovni podaci. -n se koristi za zadavanje izvornih tipova.

Dodaje oznake -x prethodnoj naredbi bcp.exe generira XML datoteku formata: bcp.exe ProgrammingSqlServer2005.dbo.OpenRowSetTable format nul -f OpenRowSetData.fmt -x -T -c

Za više informacija o upotrebi pomoćnog programa bcp za generiranje datoteka formata, pogledajte Microsoft SQL Server 2005 Books Online.

Skupno učitajte podatke upotrebom XML datoteke formata u tablicu OpenRowSetTable koristeći istu naredbu kao i prije, ali zadajući XML datoteku formata: INSERT INTO OpenRowSetTable(ID, ValueCol) SELECT rs.ID, rs.ValueCol FROM OPENROWSET( BULK N'C:\PSS2005\OpenRowSet\OpenRowSetData.txt', FORMATFILE = N'C:\PSS2005\OpenRowSet\OpenRowSetData.xml') AS rs

OpenRowSetTable sada sadrži osam redova. Poglavlje 7: XML podaci | 171

Slika 7-4. Rezultati primjera skupnog učitavanja

Metode XML tipa podataka xml tip podataka pruža pomoćne metode za postavljanje upita stupcima i varijablama xml tipa podataka. Interno, s metodama xml tipa podataka postupa se kao s podupitima. Kao rezultat toga, metoda xml tipa podataka ne može biti upotrijebljena u naredbi PRINT ili u klauzuli GROUP BY.

Primjeri u ovom odlomku koriste tablicu pod imenom xmldtmTable. Izradite ovu tablicu i dodajte joj dva reda izvođenjem sljedećih naredbi: USE ProgrammingSqlServer2005 CREATE TABLE xmldtmTable ( ID int, xmlCol xml, CONSTRAINT PK_xmldtmTable PRIMARY KEY CLUSTERED (ID) ) INSERT INTO xmldtmTable (ID, xmlCol) VALUES (1, '') INSERT INTO xmldtmTable (ID, xmlCol) VALUES (2, '')

T-SQL naredbe izrađuju tablicu s dva reda, prikazanu na slici 7-5.

Slika 7-5. Rezultati primjera metoda XML tipa podataka

172 | Programiranje SQL Server 2005

Metode xml tipa podataka opisane su u sljedećim pododlomcima.

query() Metoda query() xml tipa podataka postavlja upite instanci xml tipa podataka i vraća netipiziranu instancu xml tipa podataka. Sintaksa za query() je: query(XQuery)

gdje je: XQuery

XQuery izraz koji postavlja upite za XML čvorove u instanci xml tipa podataka Sljedeći primjer upotrebljava metodu query() kako bi izdvojio element childElement2 iz instance xml tipa podataka u stupcu xmlCol za ID = 1: SELECT xmlCol.query('/root/childElement2') FROM xmldtmTable WHERE ID = 1

Skup rezultata prikazan je na slici 7-6.

Slika 7-6. Skup rezultata primjera metode query()

value() Metoda value() xml tipa podataka izvodi upit u instanci xml tipa podataka i vraća skalarnu vrijednost SQL tipa podataka. Sintaksa metode value() je: value(XQuery, SQLType)

gdje je: XQuery

XQuery izraz koji čita podatke iz instance xml tipa podataka. Vraća se pogreška ako izraz ne vrati barem jednu vrijednost. SQLType

Slovni niz string SQL tipa podataka koji treba vratiti. SQLType ne može biti xml, CLR UDT, image, text, ntext ili sql_variant tip podataka. Metoda value() upotrebljava T-SQL funkciju CONVERT implicitno kako bi konvertirala rezultat XQuery izraza u SQL tip podataka.

Poglavlje 7: XML podaci | 173

Sljedeći primjer koristi metodu value() kako bi izdvojio vrijednost atributa iz instance xml tipa podataka u stupcu xmlCol za ID = 1: SELECT xmlCol.value('(/root/childElement2/@value)[1]', 'int') Value FROM xmldtmTable WHERE ID = 1

Skup rezultata prikazan je na slici 7-7.

Slika 7-7. Skup rezultata primjera metode value()

Operator value() zahtijeva samo jedan operand, tako da je [1] potreban da bi se zadao prvi childElement2. Atributima value može se pristupiti za druge childElement2 elemente, ako postoje, upotrebom odgovarajućeg indeksa.

exist() Metoda exist() xml tipa podataka vraća vrijednost koja pokazuje vraća li XQuery izraz za instancu xml tipa podataka skup rezultata koji nije prazan. Povratna vrijednost jedna je od sljedećih: 1 XQuery izraz vraća barem jedan XML čvor. 0 XQuery izraz vraća prazan skup rezultata. NULL Instanca xml tipa podataka prema kojoj se izveo upit jest NULL. Sintaksa metode exist() je: exist (XQuery)

gdje je: XQuery

XQuery izraz. Sljedeći primjer koristi metodu exist() za utvrđivanje je li vrijednost atributa iz instance xml tipa podataka u stupcu xmlCol zadana vrijednost za ID = 1: SELECT xmlCol.exist('/root/childElement2[@value=1]') FROM xmldtmTable WHERE ID = 1

Rezultat je prikazan na slici 7-8. 174 | Programiranje SQL Server 2005

Slika 7-8. Rezultat primjera metode exist()

Vrijednost 0 znači da vrijednost atributa nema vrijednost 1. Ako je metoda exist() promijenjena u exist('/root/childElement2[@value=2]'), rezultat je 1.

modify() Metoda modify() xml tipa podataka mijenja sadržaj instance xml tipa podataka. Slijedi sintaksa metode modify(): modify (XML_DML)

gdje je: XML_DML

XML Data Manipulation Language naredba. XML DML naredba umeće, ažurira ili briše čvorove iz instance xml tipa podataka. Metoda modify() može biti upotrijebljena samo u klauzuli SET naredbe UPDATE. XML DML i metoda modify() podrobnije su raspravljeni u odlomku „XML Data Manipulation Language“, kasnije u ovom poglavlju.

nodes() Metoda nodes() xml tipa podataka kida instancu xml tipa podataka na relacijske podatke identificiranjem čvorova koji će biti preslikani u novi red. Sintaksa za nodes() je: nodes (XQuery) as Table(Column)

gdje je: XQuery

XQuery izraz koji izgrađuje čvorove koji će zatim biti izloženi kao skup rezultata. Table

Ime tablice za skup rezultata. Column

Ime stupca za skup rezultata. Sljedeći primjer koristi metodu nodes() za vraćanje vrijednosti atributa za svaki element potomak childElement kao int: SELECT T.C.value('@value', 'int') AS Value FROM xmldtmTable

Poglavlje 7: XML podaci | 175

CROSS APPLY xmlCol.nodes('/root/childElement') AS T(C) WHERE ID = 2

Slika 7-9. Skup rezultata primjera metode nodes()

Operator CROSS APPLY omogućuje pozivanje metode nodes() za svaki red kojeg je vratio upit.

Pregled XML podataka kao relacijskih podataka OPENXML je T-SQL funkcija koja pruža pristup unutarmemorijskim XML dokumentima putem mehanizma sličnog relacijskom skupu rezultata. OPENXML može biti upotrijebljen u naredbama SELECT i SELECT INTO kad se mogu pojaviti pružatelji skupa redova poput tablice, pogleda, ili OPENROWSET funcije.

Prije no što možete upotrijebiti OPENXML, morate pozvati sistemsku pohranjenu proceduru sp_xml_preparedocument da analizira XML dokument i vrati identifikator analiziranog unutarnjeg prikaza dokumenta. Identifikator dokumenta prosljeđuje se u OPENXML, koji pruža relacijski pogled skupa redova na dokument. Sintaksa ključne riječi OPENXML je: OPENXML( idoc, rowpattern, [flags] ) [ WITH ( [ ,...n ] | tableName ) ] ::= colName colType [colPattern | metaProperty]

gdje je: idoc

Identifikator dokumenta unutarnjeg prikaza XML dokumenta. Identifikator je dobiven upotrebom sistemske pohranjene procedure sp_xml_preparedocument. rowpattern

XPath predložak koji identificira čvorove u XML dokumentu koji će biti obrađeni kao redovi. flags

Neobavezno zadaje preslikavanje između XML podataka i skupa redova te način na koji bi stupac za prihvat viška sadržaja trebao biti popunjen. Opcija flags je bajt stvoren od vrijednosti opisanih u tablici 7-2.

176 | Programiranje SQL Server 2005

Tablica 7-2. Vrijednosti OPENXML opcije flags Vrijednost

Opis

0

Podrazumijeva preslikavanje orijentirano prema atributu. 0 je podrazumijevana vrijednost ako opcija flags nije zadana.

1

Preslikavanje orijentirano prema atributu – XML atributi se preslikavaju u stupce definirane u schemaDeclaration. Kad je kombinirano s XML_ELEMENTS, prvo se koristi preslikavanje orijentirano prema atributu, nakon čega slijedi preslikavanje orijentirano prema elementu za sve nepreslikane stupce.

2

Preslikavanje orijentirano prema elementu – XML elementi se preslikavaju u stupce definirane u schemaDeclaration. Kad je kombinirano s XML_ATTRIBUTES, prvo se koristi preslikavanje orijentirano

8

U kontekstu pronalaženja ukazuje da iskorišteni podaci ne trebaju biti kopirani na već popunjeno svojstvo @mp:xmltext. Ova oznaka može biti kombinirana s XML_ATTRIBUTES ili XML_ELEMENTS.

prema elementu, nakon čega slijedi preslikavanje orijentirano prema atributu za sve nepreslikane stupce.

schemaDeclaration

Definicija sheme u obliku gdje je: colName

Ime stupca u skupu redova. colType

SQL tip podataka stupca u skupu redova. colPattern

XPath predložak koji zadaje način na koji su XML čvorovi preslikani u stupce u skupu redova. colPattern preslikavanje premošćuje preslikavanje zadano opcijom flags. metaProperty OPENXML metasvojstvo koje omogućuje dobivanje informacija o XML čvoro-

vima, uključujući relativnu poziciju i informacije o imenskom prostoru. tableName

Ime tablice može biti zadano umjesto definicije sheme ako tablica sa željenom shemom postoji, a predlošci stupaca nisu potrebni. Ako klauzula WITH nije zadana, rezultati se vraćaju u formatu rubne tablice (engl. edge table format), umjesto u formatu skupa redova. Rubna tablica predstavlja XML dokument u jedinstvenoj tablici sa strukturom opisanom u tablici 7-3. Tablica 7-3. Shema rubne tablice Ime stupca

Tip podataka

Opis

id

bigint

Jedinstveni identifikator čvora XML dokumenta. Korijenski čvor ima id vrijednost 0. Negativne su vrijednosti rezervirane.

parentid

bigint

Identifikator roditeljskog čvora. Vrijednost parentid korijenskog čvora je NULL.

nodetype

int

Tip čvora temeljen na brojčanim oznakama tipa XML DOM čvora, gdje je 1 = čvor elementa; 2 = čvor atributa; 3 = čvor teksta.

Poglavlje 7: XML podaci | 177

Tablica 7-3. Shema rubne tablice (nastavak) Ime stupca

Tip podataka

Opis

localname

nvarchar

Lokalno ime elementa ili atributa. Vrijednost localname je NULL ako DOM objekt nema imena.

prefix

nvarchar

Prefiks imenskog prostora imena čvora.

namespaceuri

nvarchar

URI imenskog prostora čvora. Vrijednost namespaceuri je NULL ako imenski prostor nije prisutan.

datatype

nvarchar

Stvarni tip podataka elementa ili atributa, u suprotnom NULL. Tip podataka je utvrđen iz izravno upisanog DTD-a ili sheme.

prev

bigint

Identifikator čvora elementa koji je prethodni potomak istog roditelja. Vrijednost prev je NULL ako nema izravnog prethodnog potomka istog roditelja.

text

ntext

Sadržaj elementa ili vrijednost atributa u obliku teksta. Vrijednost text je NULL ako rubna tablica ne treba vrijednost za unos.

Sintaksa sistemske pohranjene procedure sp_xml_preparedocument je: sp_xml_preparedocument hDoc OUTPUT [ , xmlText ] [ , xpathNamespaces ]

gdje je: hDoc

Identifikator za analizirani unutarnji prikaz XML dokumenta. xmlText

Izvorni XML dokument. xPathNamespaces

Imenski prostori upotrijebljeni u XPath izrazima redova i stupaca u OPENXML. Nakon što ste završili s upotrebom unutarnjeg prikaza dokumenta, pozovite sistemsku pohranjenu proceduru sp_xml_removedocument da ga ukloni i da identifikator dokumenta učini nevažećim. Sintaksa za sp_xml_removedocument je: sp_xml_removedocument hDoc

gdje je: hDoc

Identifikator za analizirani unutarnji prikaz XML dokumenta Sljedeći primjer koristi OPENXML za dobivanje informacija o mjestu proizvodnje za proizvodni model 7 iz stupca xml tipa podataka Instructions iz tablice Production.ProductModel u bazi AdventureWorks. Slijedi izvadak podataka: Adventure Works CyclesFR-210B Instructions for Manufacturing HL Touring FrameSummaryThis document contains manufacturing instructions for manufacturing the HL Touring Frame, Product Model 7. Instructions are

178 | Programiranje SQL Server 2005

... Work Center - 10 Frame FormingThe following instructions pertain to Work Center 10. (Setup hours = .5, Labor Hours = 2.5, Machine Hours = 3, Lot Sizing = 100) Insert aluminum sheet MS-2341 into the T-85A framing tool . ... Work Center 20 - Frame WeldingThe following instructions pertain to Work Center 20. (Setup hours = .15, Labor Hours = 1.75, . ...

Izvedite sljedeće naredbe da dobijete informacije o mjestu proizvodnje za proizvodni model 7 kao tabelarni skup rezultata. Obratite pažnju na to da morate unijeti istaknuti red iz primjera u jednom redu umjesto u dva reda, kako je učinjeno ovdje samo zato da bi odgovarao širini stranice. USE AdventureWorks DECLARE @idoc int DECLARE @instructions xml SET @instructions = (SELECT Instructions FROM Production.ProductModel WHERE ProductModelID = 7) EXEC sp_xml_preparedocument @idoc OUTPUT, @instructions, N'' SELECT * FROM OPENXML(@idoc, N'/ns:root/ns:Location') WITH ( LaborHours float N'@LaborHours', LotSize float '@LotSize', MachineHours float '@MachineHours', SetupHours float '@SetupHours', LocationID int '@LocationID' ) EXEC sp_xml_removedocument @idoc

Skup rezultata prikazan je na slici 7-10.

Poglavlje 7: XML podaci | 179

Slika 7-10. Skup rezultata primjera OPENXML

Indeksiranje XML podataka Instance xml tipa podataka pohranjene su kao binarni veliki objekti (engl. binary large objects, BLOB) u stupce xml tipa podataka. Ako ovi stupci nisu indeksirani, oni moraju biti iskidani u vrijeme izvođenja za svaki red u tablici kako bi se procijenio upit. To može biti skupo, posebno kod velikih instanci xml tipa podataka ili velikog broja redova u tablici. Izrada primarnih i sekundarnih XML indeksa na stupcima xml tipa podataka može znatno poboljšati izvedbu upita. Kidanje (engl. shredding) proces je preslikavanja i konvertiranja XML dokumenta u tablice u relacijskoj bazi podataka.

Stupac xml tipa podataka može imati jedan primarni XML indeks i više sekundarnih XML indeksa, gdje je: Primarni XML indeks Relacijski indeks na iskidanom i ustaljenom prikazu svih oznaka, vrijednosti i putanja XML instanci u stupcu xml tipa podataka. Indeks stvara nekoliko redova podataka za svaku instancu u stupcu. Primarni XML indeks zahtijeva klaster indeks na primarnom ključu tablice koja sadrži xml tip podataka koji se indeksira. Sekundarni XML indeks Dodatno poboljšava izvedbu za specifične tipove upita. Primarni XML indeks mora postojati na stupcu xml tipa podataka prije no što može biti stvoren sekundarni XML indeks. Postoje tri tipa sekundarnih XML indeksa: PATH indeks Optimizira upite koji se temelje na izrazima putanje. VALUE indeks Optimizira upite temeljene na vrijednosti, za putanje koje uključuju zamjenske znakove ili nisu potpuno navedene. 180 | Programiranje SQL Server 2005

PROPERTY indeks Optimizira upite temeljene na svojstvima u specifičnoj XML instanci pohranjenoj u stupcu. XML indeks može biti stvoren samo na jednom stupcu xml tipa podataka. XML indeksi ne mogu biti stvoreni na sljedećem: • Stupcu koji nije xml tipa podataka. • Stupcu xml tipa podataka u pogledu. • Varijabli tablične vrijednosti sa stupcima xml tipa podataka. • Varijabli xml tipa podataka. • Izračunatom stupcu xml tipa podataka. Relacijski indeks ne može biti stvoren na stupcu xml tipa podataka. Morate postaviti opcije SQL Servera 2005 popisane u tablici 7-4 kad stvarate ili prepravljate XML indeks na stupcu xml tipa podataka. Ako ove opcije nisu postavljene, nećete moći stvoriti ili prepraviti XML indeks i nećete moći umetnuti vrijednosti ili modificirati vrijednosti u indeksiranim stupcima xml tipa podataka. Tablica 7-4. Postavke opcija SQL Servera 2005 za stvaranje i prepravljanje indeksa na XML stupcu SET opcija

Potrebna vrijednost

ANSI_NULLS

ON

ANSI_PADDING

ON

ANSI_WARNINGS

ON

ARITHABORT

ON

CONCAT_NULL_YIELDS_NULL

ON

NUMERIC_ROUNDABORT

OFF

QUOTED_IDENTIFIER

ON

Primarni i sekundarni indeksi na stupcima xml tipa podataka stvaraju se, mijenjaju i uklanjaju slično indeksima na stupcima koji nisu xml tipa podataka. Sljedeći odjeljci opisuju upravljanje indeksima na stupcima xml tipa podataka.

Stvaranje XML indeksa Naredba CREATE INDEX koristi se za stvaranje novog primarnog ili sekundarnog XML indeksa na stupcu xml tipa podataka. Sintaksa je: CREATE [ PRIMARY ] XML INDEX index_name ON ( xml_column_name ) [ USING XML INDEX xml_index_name [ FOR { VALUE | PATH | PROPERTY } ] [ WITH ( [ ,...n ] ) ]

Poglavlje 7: XML podaci | 181

[ ; ] ::= { [ database_name . [ schema_name ] . | schema_name . ] table_name } ::= { PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | DROP_EXISTING = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism }

gdje je: [PRIMARY] XML INDEX Stupac xml tipa podataka na kojem treba stvoriti indeks. Ako je zadano PRIMARY, na stupcu se stvara klaster indeks. Svaki stupac xml tipa podataka može imati jedan

primarni i više sekundarnih indeksa. Primarni indeks mora postojati na stupcu xml tipa podataka prije no što može biti stvoren sekundarni indeks na stupcu. index_name

Ime indeksa, koje mora biti jedinstveno unutar tablice. Ime primarnog XML indeksa ne može započinjati sa sljedećim znakovima: #, ##, @ ili @@. :: = { [ database_name. [ schema_name ] . | schema_name . ] table_name }

Objekt koji treba indeksirati, potpuno kvalificiran ili ne, gdje je: database_name

Ime baze podataka. schema_name

Ime sheme kojoj pripada tablica. table_name

Ime tablice koju treba indeksirati. xml_column_name Stupac xml tipa podataka na kojem treba stvoriti indeks. USING XML INDEX xml_index_name

Primarni XML indeks upotrijebljen za stvaranje sekundarnog XML indeksa. FOR { VALUE | PATH | PROPERTY }

Tip sekundarnog XML indeksa kojeg treba stvoriti, gdje: VALUE

Stvara VALUE sekundarni XML indeks na VALUE, HID, PK i XID stupcima primarnog XML indeksa.

182 | Programiranje SQL Server 2005

PATH

Stvara PATH sekundarni XML indeks na HID, VALUE, PK i XID stupcima primarnog XML indeksa. PROPERTY

Stvara PROPERTY sekundarni XML indeks na PK, HID, VALUE i XID stupcima primarnog XML indeksa te uključuje stupce LVALUE i LVALUEBIN. ::=

Opcije koje se koriste za stvaranje XML indeksa, gdje: PAD_INDEX = { ON | OFF }

Postavlja dopunjavanje indeksa. Ako je PAD_INDEX postavljen na ON, FILLFACTOR se koristi za izračunavanje dopunjavanja (slobodnog prostora) primijenjenog na stranice srednje razine indeksa. Podrazumijevano je OFF. FILLFACTOR

Zadaje postotak slobodnog prostora, kao cjelobrojnu vrijednost od 1 do 100, koji bi trebao biti ostavljen na razini svake stranice indeksa tijekom stvaranja ili mijenjanja indeksa. SORT_IN_TEMPDB = { ON | OFF }

Navodi treba li rezultate sortiranja pohraniti u tempdb, Podrazumijevano je OFF, što znači da se rezultati međusortiranja pohranjuju u istu bazu podataka kao i indeks. STATISTICS_NORECOMPUTE = { ON | OFF }

Navodi da li se zastarjele statistike distribucije automatski preračunavaju. Podrazumijevano je OFF, omogućujući automatsko ažuriranje statistike. DROP_EXISTING = { ON | OFF }

Navodi da li se postojeći XML indeks automatski odbacuje i ponovno izrađuje. Podrazumijevano je OFF, što znači da se vraća pogreška ako zadano ime indeksa već postoji. ALLOW_ROW_LOCKS = { ON | OFF }

Navodi jesu li dopuštena zaključavanja redova kad se pristupa indeksu. Podrazumijevano je ON, što znači da su zaključavanja redova dopuštena. ALLOW_PAGE_LOCKS = { ON | OFF }

Navodi jesu li dopuštena zaključavanja stranica kad se pristupa indeksu. Podrazumijevano je ON, što znači da su zaključavanja stranica dopuštena. MAX_DOP

Premošćuje maksimalni stupanj usporednosti za vrijeme trajanja operacije indeksa, ograničujući broj procesora upotrijebljenih u izvedbi usporednih planova. Usporedne operacije indeksiranja i usporedna obrada upita na raspolaganju su samo u SQL Server 2005 Enterprise Edition. Tablica mora imati klaster primarni ključ s manje od 16 stupaca u sebi prije no što primarni XML indeks može biti stvoren. Poglavlje 7: XML podaci | 183

Sljedeći primjer stvara primarni XML indeks na stupcu xml tipa podataka xmlCol u tablici xmlTable, izrađenoj u odlomku „Izrada stupaca i varijabli xml tipa podataka“, ranije u ovom poglavlju: CREATE PRIMARY XML INDEX xmlColIndex ON xmlTable(xmlCol)

Sljedeći primjer stvara sekundarni VALUE indeks na stupcu xmlCol: CREATE XML INDEX xmlColValueIndex ON xmlTable(xmlCol) USING XML INDEX xmlColIndex FOR VALUE

Mijenjanje XML indeksa Naredba ALTER INDEX upotrebljava se za modificiranje postojećeg XML indeksa, stvorenog upotrebom naredbe CREATE INDEX. Sintaksa je: ALTER INDEX { index_name | ALL } ON { REBUILD [ WITH ( [ ,...n ] ) ] | DISABLE | SET ( [ ,...n ] ) } [ ; ] ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name } ::= { PAD_INDEX = { ON | OFF } | FILLFACTOR = fillfactor | SORT_IN_TEMPDB = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } | ALLOW_ROW_LOCKS = { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | MAXDOP = max_degree_of_parallelism } ::= { ALLOW_ROW_LOCKS= { ON | OFF } | ALLOW_PAGE_LOCKS = { ON | OFF } | STATISTICS_NORECOMPUTE = { ON | OFF } }

184 | Programiranje SQL Server 2005

Argumenti su opisani u odjeljku „Stvaranje XML indeksa“, ranije u ovom odlomku. Trebate pružiti argumente samo za značajke indeksa koje mijenjate.

Uklanjanje XML indeksa Naredba DROP INDEX koristi se za uklanjanje jednog ili više XML indeksa iz baze podataka. Sintaksa je: DROP INDEX { index_name ON [ ,...n ] } ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name }

Argumenti su opisani u odjeljku „Stvaranje XML indeksa“, ranije u ovom odlomku. Sljedeći primjer uklanja indeks sekundarne vrijednosti stvoren na tablici xmlTable u odjeljku „Stvaranje XML indeksa“, ranije u ovom odlomku: DROP INDEX xmlColValueIndex ON xmlTable

Pregledavanje XML indeksa Kataloški pogled xml_indexes vraća informacije o primarnim i sekundarnim XML indeksima u bazi podataka. Sljedeći upit vraća XML indekse na tablici Individual u bazi AdventureWorks: USE AdventureWorks SELECT o.name TableName, xi.* FROM sys.xml_indexes xi JOIN sys.objects o ON xi.object_id = o.object_id WHERE o.name = 'Individual'

Djelomični su rezultati prikazani na slici 7-11.

Slika 7-11. Rezultati primjera pregledavanja XML indeksa

Poglavlje 7: XML podaci | 185

U primjeru, kataloški pogled sys.xml_indexes spojen je na kataloški pogled sys.objects kako bi vratio tablicu kojoj indeks pripada kao prvi stupac u skupu rezultata.

Upravljanje kolekcijama XML shema Kolekcija XML shema je objekt metapodataka u bazi podataka koji sadrži jednu ili više XML Schema Definition (XSD) jezičnih shema. Koristi za validaciju instanci xml tipa podataka. Kolekcije XML shema možete asocirati s instancama xml tipa podataka u stupcima ili varijablama. Kolekcija XML shema asocirana sa stupcem xml tipa podataka potvrđuje podatke instance stupca prema shemi – podaci su pohranjeni u bazu podataka ako su u skladu s njom. Kolekcijama XML shema upravlja se slično kao i s drugim objektima baze podataka, upotrebom T-SQL naredbi CREATE, ALTER i DROP. Sljedeći odjeljci opisuju naredbe za izradu, modificiranje, brisanje i ispitivanje kolekcija XML shema.

Izrada kolekcija XML shema Naredba CREATE XML SCHEMA COLLECTION koristi se za unošenje XML shema u bazu podataka. Sintaksa je: CREATE XML SCHEMA COLLECTION [.]sql_identifier AS expression

gdje je: relational_schema

Ime relacijske sheme. Ako nije zadano, upotrebljava se podrazumijevana relacijska shema – podrazumijevani dbo. sql_identifier

Ime kolekcije XML shema. expression

XML shema zadana kao string konstanta ili skalarna varijabla tipa [n]varchar, [n]varbinary ili xml. Sljedeći primjer izrađuje kolekciju XML shema za Contact xml tip podataka. Shema navodi da kontakt ima element pod imenom Contact s tri atributa: FirstName, LastName i PhoneNumber. USE ProgrammingSqlServer2005 CREATE XML SCHEMA COLLECTION ContactSchemaCollection AS N' '

Novu kolekciju XML shema možete pogledati u Object Exploreru, u SQL Server Management Studiju odabirom Databases ➝ ProgrammingSqlServer2005 ➝ Programmability ➝ Types ➝ XML Schema Collections. Sljedeći primjer izrađuje tablicu sa samo jednim stupcem xml tipa podataka, nazvanim Contact. Stupac Contact tipiziran je upotrebom kolekcije XML shema ContactSchemaCollection. USE ProgrammingSqlServer2005 CREATE TABLE Contacts ( Contact xml (ContactSchemaCollection) )

Podatke umećete u tipizirani stupac xml tipa podataka na isti način kao i u netipizirani stupac xml tipa podataka. Sljedeća naredba dodaje kontakt: INSERT INTO Contacts (Contact) VALUES ('')

Doći će do pogreške ako podaci koje pokušavate umetnuti ili ažurirati u stupcu nisu u skladu s XML shemom. Na primjer, sljedeća naredba netočno zadaje atribut s imenom Phone, umjesto PhoneNumber: INSERT INTO Contacts (Contact) VALUES ('')

Izvođenje naredbe vraća poruku prikazanu na slici 7-12.

Slika 7-12. Primjer poruke o nepoštivanju XML sheme

Poglavlje 7: XML podaci | 187

Modificiranje kolekcija XML shema Naredba ALTER XML SCHEMA COLLECTION omogućuje dodavanje nove sheme postojećoj kolekciji XML shema prethodno stvorenoj s pomoću naredbe CREATE XML SCHEMA COLLECTION. Sintaksa je: ALTER XML SCHEMA COLLECTION [relational_schema.]sql_identifier ADD 'Schema Component'

gdje je: relational_schema

Ime relacijske sheme. Ako nije zadano, upotrebljava se podrazumijevana relacijska shema – podrazumijevani dbo. sql_identifier

Ime kolekcije XML shema kojoj treba dodati XML shemu. Schema Component

XML shema koju treba umetnuti u kolekciju shema, zadana kao string konstanta ili skalarna varijabla tipa [n]varchar, [n]varbinary ili xml.

Uklanjanje kolekcija XML shema Naredba DROP XML SCHEMA COLLECTION briše cjelokupnu kolekciju XML shema prethodno stvorenu upotrebom naredbe CREATE XML SCHEMA COLLECTION. Uklanjaju se sve komponente kolekcije XML shema. Sintaksa je: DROP XML SCHEMA COLLECTION [relational_schema.]sql_identifier

gdje je: relational_schema

Ime relacijske sheme. Ako nije zadano, upotrebljava se podrazumijevana relacijska shema – podrazumijevani dbo. sql_identifier

Ime kolekcije XML shema koju treba ukloniti. Naredba DROP XML SCHEMA COLLECTION transakcijska je operacija koja se može vratiti unazad ako se izvodi unutar transakcije. Ne možete odbaciti kolekciju XML shema koja je u upotrebi – to jest, ako je ijedno od sljedećeg točno: • Asocirana je sa stupcem ili parametrom xml tipa podataka. • Zadana je u ograničenju tablice. • Referencirana je u funciji ili pohranjenoj proceduri vezanoj za shemu. Kolekciju XML shema ContactSchemaCollection upotrebljava tablica Contacts, stoga morate stupac Contact učiniti netipiziranim izvođenjem T-SQL naredbe ALTER TABLE, 188 | Programiranje SQL Server 2005

prije no što možete ukloniti kolekciju XML shema. Sljedeći primjer koda koristi naredbu ALTER TABLE kako bi stupac Contact u tablici Contacts učinio netipiziranim: ALTER TABLE Contacts ALTER COLUMN Contact xml

Možete također odbaciti stupac Contact ili tablicu Contacts kako bi uklonili asocijaciju s kolekcijom XML shema. Nakon što kolekcija XML shema više nije asocirana sa stupcem Contact, možete ukloniti kolekciju XML shema izvođenjem T-SQL naredbe DROP XML SCHEMA COLLECTION, kako je prikazano u sljedećem primjeru: DROP XML SCHEMA COLLECTION ContactSchemaCollection

Pregledavanje kolekcija XML shema Kataloški pogled xml_schema_collections enumerira kolekcije XML shema u bazi podataka, kao što je prikazano u sljedećem primjeru: USE AdventureWorks SELECT s.name SchemaName, xsc.name XmlSchemaCollectionName FROM sys.xml_schema_collections xsc JOIN sys.schemas s ON xsc.schema_id = s.schema_id

Skup rezultata prikazan je na slici 7-13.

Slika 7-13. Skup rezultata primjera kolekcija XML shema

Ugrađena (engl. intrinsic) funkcija xml_schema_namespace rekonstruira kolekciju XML shema od komponenti shema pohranjenih u bazi podataka i vraća instancu xml tipa podataka. Sintaksa funkcije xml_schema_namespace je: xml_schema_namespace ( schemaName, xmlSchemaCollectionName, [ targetNamespace ] )

gdje je: schemaName

Ime XML sheme u xmlSchemaCollection. xmlSchemaCollectionName

Ime kolekcije XML shema.

Poglavlje 7: XML podaci | 189

targetNamespace

URI imenskog prostora unutar kolekcije XML shema. Možete izvesti ovu funkciju za bilo koji red koji je vratio prethodni upit, osim za red koji predstavlja sys.sys kolekciju shema. Na primjer: SELECT xml_schema_namespace('Person', 'AdditionalContactInfoSchemaCollection')

Skup rezultata je instanca xml tipa podataka koja sadrži shemu Person u kolekciji XML shema AdditionalContactInfoSchemaCollection. Fragment skupa rezultata prikazan je na slici 7-14.

Slika 7-14. Fragment rezultata primjera pogleda kolekcije XML shema

Upravljanje dopuštenjima kolekcije XML shema Model dopuštenja kolekcije XML shema omogućuje sljedeće: • Odobriti, opozvati i odbiti korisniku (principalu) dopuštenje da izrađuje i koristi kolekcije XML shema. • Prenijeti vlasništvo nad kolekcijama XML shema. • Koristiti objekte kolekcija XML shema za tipiziranje stupaca, varijabli i parametara xml tipa podataka ili za ograničavanje tablica ili stupaca.

Odobravanje dopuštenja Možete odobriti korisničko dopuštenje za izradu kolekcije XML shema odobravajući korisniku dopuštenje CREATE XML SCHEMA COLLECTION na bazi podataka zajedno s dopuštenjem ALTER, na shemi ili na bazi podataka. Za postojeće objekte kolekcije XML shema možete odobriti dopuštenja CONTROL, TAKE OWNERSHIP, ALTER, EXECUTE, REFERENCES ili VIEW DEFINITION upotrebom T-SQL naredbe GRANT.

190 | Programiranje SQL Server 2005

Za više informacija o T-SQL naredbi GRANT, pogledajte Microsoft SQL Server 2005 Books Online.

Opozivanje dopuštenja Dopuštenje za izradu kolekcije XML shema možete opozvati na jedan od sljedećih načina: • Opozivanjem korisnikovog dopuštenja ALTER na shemi. Korisnik više neće moći stvoriti kolekciju XML shema u relacijskoj shemi. • Opozivanjem korisnikovog dopuštenja ALTER na bazi podataka. Korisnik više neće moći stvoriti kolekciju XML shema bilo gdje u bazi podataka. • Opozivanjem korisniku CREATE XML SCHEMA COLLECTION ili ALTER ANY XML SCHEMA COLLECTION. Ovo će spriječiti korisnika da unese kolekciju XML shema u bazu podataka. Za postojeće objekte kolekcije XML shema možete opozvati dopuštenja CONTROL, TAKE OWNERSHIP, ALTER, EXECUTE, REFERENCES ili VIEW DEFINITION upotrebom T-SQL naredbe REVOKE. Za više informacija o T-SQL naredbi REVOKE pogledajte Microsoft SQL Server 2005 Books Online.

Odbijanje dopuštenja Dopuštenje za izradu kolekcije XML shema možete odbiti na jedan od sljedećih načina: • Odbijanjem korisnikovog dopuštenja ALTER na shemi. Korisnik više neće moći stvoriti kolekciju XML shema bilo gdje u relacijskoj shemi. • Odbijanjem korisnikovog dopuštenja CONTROL na shemi. • Odbijanjem korisnikovog dopuštenja ALTER ANY SCHEMA na bazi podataka. Korisnik više neće moći stvoriti kolekciju XML shema bilo gdje u bazi podataka. Za postojeće objekte kolekcije XML shema možete odbiti dopuštenja kolekcije XML shema CONTROL, TAKE OWNERSHIP, ALTER, EXECUTE, REFERENCES ili VIEW DEFINITION upotrebom T-SQL naredbe DENY. Za više informacija o T-SQL naredbi DENY, pogledajte Microsoft SQL Server 2005 Books Online.

Poglavlje 7: XML podaci | 191

Ograničenja kolekcija XML shema Potvrđivanje XLM sheme stupaca xml tipa podataka podložno je nekim ograničenjima: • Ignoriraju se vrijednosti atributa xsi:schemaLocation i xsi:noNamespaceSchemaLocation. • Element nije dopušten. • Nisu podržana ograničenja , i . • Kanonski prikazi vrijednosti u XML dokumentu ne smiju prekršiti ograničenja predloška za svoj tip. • Atribut processContents zamjenskih elemenata ( i ) ne podržava lax – ta vrijednost mora biti postavljena na skip ili strict. • Nije podržan element . • Nisu podržani tipovi izvedeni iz xs:QName upotrebom elementa ograničenja XML sheme. • Nisu podržane sheme koje sadrže tipove popisa sa stavkama udruženog tipa. • tipovi ograničeni su kako je opisano u tablici 7-5. Tablica 7-5. tipovi Jednostavni tip

Ograničenje

duration

Dio s godinom mora biti u rasponu od -231 do 231 – 1. Dijelovi s mjesecom, danom, satom, minutama i sekundama svi moraju biti u rasponu 0 do 9999. Dio sa sekundama ima nakon decimalnog zareza dodatne tri znamenke za preciznost.

dateTime

Dio s godinom mora biti u rasponu -9999 do 9999. Dio s mjesecom mora biti u rasponu 1 do 12. Dio s danom mora biti u rasponu 1 do 31 i mora biti valjani kalendarski datum. Dio sa satom mora biti u rasponu -14 do 14.

date

Dio s godinom mora biti u rasponu -9999 do 9999. Dio s mjesecom mora biti u rasponu 1 do 12. Dio s danom mora biti u rasponu 1 do 31 i mora biti valjani kalendarski datum.

gYearMonth

Dio s godinom mora biti u rasponu -9999 do 9999.

gYear

Dio s godinom mora biti u rasponu -9999 do 9999.

gMonthDay

Dio s mjesecom mora biti u rasponu 1 do 12. Dio s danom mora biti u rasponu 1 do 31.

gDay

Dio s danom mora biti u rasponu 1 do 31.

gMonth

Dio s mjesecom mora biti u rasponu 1 do 12.

decimal

Mora udovoljavati formatu numeric tipa podataka SQL Servera – dopušteno je do 38 znamenki preciznosti, od kojih je do 10 razlomačkih. Nisu podržane varijabilne decimalne vrijednosti preciznosti.

192 | Programiranje SQL Server 2005

Tablica 7-5. tipovi (nastavak) Jednostavni tip

Ograničenje

float

Mora udovoljavati formatu real tipa podataka SQL Servera.

double

Mora udovoljavati formatu float tipa podataka SQL Servera.

string

Mora udovoljavati formatu nvarchar(max) tipa podataka SQL Servera.

anyURI

Ne može biti duži od 4000 Unicode znakova.

• xs:decimal instancirane vrijednosti SQL poslužitelj prikazuje interno kao numeric (38, 10) tip podataka. Varijabilne decimale preciznosti nisu podržane. • Informacije o vremenskoj zoni za jednostavne tipove date, time i dateTime normalizirane su na srednje vrijeme po Greenwichu (GMT). GMT zona dodaje se podacima koji nemaju vremensku zonu. • length, minLength i maxLength značajke pohranjene su kao long tip podataka. • Atributi minOccurs i maxOccurs moraju pristajati u četverobajtne cjelobrojne vrijednosti. • Identifikatori komponenti sheme ograničeni su na dužinu od 1 000 Unicode znakova. Dopunski parovi znakova koji se koriste u nekim jezicima nisu podržani unutar identifikatora. • Nije podržana NaN vrijednost jednostavnog tipa. • Odbacuju se XML sheme s tipovima koji imaju značajke predložaka ili enumeracije koje prekršuju te značajke. • Shema koja ima dio mora imati potomke ili mora eksplicitno definirati svoj atribut minOccurs s vrijednošću 0. • Atributi block i final ne mogu imati ponovljene vrijednosti. • Atribut imenskog prostora za ne može biti prazan niz znakova. Eksplicitno zadajte imenski prostor kao ##local kako bi ukazao na nekvalificirani element ili atribut. • Jedinstvenost atributa ID nametnuta je samo za komponentu, a ne za komponentu. Atribut ID za mora biti jedinstven unutar kolekcije shema. • Nije podržan tip NOTATION.

Podrška za XQuery XQuery je jezik za postavljanje upita XML podacima. SQL Server 2005 podržava podskup jezika XQuery za postavljanje upita xml tipu podataka. Implementacija je usklađena s nacrtom za XQuery od srpnja 2004. Za više informacija o upotrebi jezika XQuery, pogledajte Web stranicu World Wide Web Consortiuma (W3C) na http://www.w3.org/ TR/2004/WD-xquery-20040723/ i Microsoft SQL Server 2005 Books Online.

Poglavlje 7: XML podaci | 193

Funkcije xml tipa podataka XQuery funkcije opisane u tablici 7-6 mogu biti upotrijebljene s jezikom XQuery za xml tip podataka. Ove su funkcije dio imenskog prostora http://www.w3.org/2004/07/ xpath-functions. W3C specifikacija za ove funkcije koristi prefiks imenskog prostora fn:. Međutim, upotreba fn: nije potrebna u implementaciji SQL Servera 2005. Tablica 7-6. XQuery funkcije Kategorija

XQuery funkcija

Opis

Numeričke

ceiling

Vraća najmanju cjelobrojnu vrijednost koja nije manja od argumenta. Vraća najveću cjelobrojnu vrijednost koja nije veća od argumenta. Vraća cjelobrojnu vrijednost najbližu argumentu.

floor round

Za nizove znakova

string-length

Vraća ulančavanje niza znakova nula ili više argumenata niza znakova. Vraća xs:boolean vrijednost koja kazuje sadrži li argument niza znakova niz znakova koji je zadao drugi argument. Vraća zadani dio argumenta niza znakova. Vraća dužinu argumenta niza znakova.

Logičke

not

Vraća Boolean vrijednost za logički NOT Boolean argumenta.

Za čvorove

number

Vraća numeričku vrijednost zadanog čvora.

Kontekstne

last

Vraća nepotpisanu cjelobrojnu vrijednost koja ukazuje na broj stavki u slijedu koji se trenutno obrađuje. Vraća nepotpisanu cjelobrojnu vrijednost koja ukazuje na poziciju broja kontekstne stavke u slijedu koji se trenutno obrađuje.

concat contains substring

position

Za slijedove

empty distinct-values

Agregatne

count avg min max sum

Vraća Boolean vrijednost koja kazuje je li zadani slijed prazan slijed. Vraća slijed koji sadrži posebne pojedine vrijednosti u zadanom slijedu. Vraća broj stavki u zadanom slijedu. Vraća prosjek vrijednosti u zadanom slijedu. Vraća najmanju vrijednost u zadanom slijedu. Vraća najveću vrijednost u zadanom slijedu. Vraća zbroj vrijednosti u zadanom slijedu.

Konstruktori

Funkcije konstruktora

Stvara instancu bilo kojeg XSD ugrađenog ili korisnički definiranog nedjeljivog tipa.

Za pristup podacima

string

Vraća prikaz niza zanakova argumenta čvora ili nedjeljive vrijednosti. Vraća tipiziranu vrijednost zadanog čvora.

data

Sljedeći upit upotrebljava XQuery za uzimanje radnog centra s najviše radnih sati za svaki proizvod iz stupca xml tipa podataka Instructions u tablici Production.ProductModel u AdventureWorks. Obratite pažnju na to da morate unijeti istaknuti red iz primjera u samo jednom redu.

194 | Programiranje SQL Server 2005

SELECT ProductModelID, Name, Instructions.query(' declare namespace AWMI= "http://schemas.microsoft.com/sqlserver/2004/07/ adventure-works/ProductModelManuInstructions"; for $Location in /AWMI:root/AWMI:Location where $Location/@LaborHours = max(/AWMI:root/AWMI:Location/@LaborHours) return ') Result FROM Production.ProductModel WHERE Instructions IS NOT NULL

Djelomični su rezultati prikazani na slici 7-15.

Slika 7-15. Rezultati primjera jezika XQuery

Operatori xml tipa podataka XQuery operatori opisani u tablici 7-7 mogu biti upotrijebljeni u upitima koji se izvode za instance xml tipa podataka. Tablica 7-7. XQuery operatori Kategorija

Operatori

Numerički

+, -, *, div, mod

Usporedni

eq, ne, lt, gt, le, ge

Opći usporedni

=, !=, , =

Upotreba proširenih XQuery funkcija za povezivanje relacijskih podataka unutar XML podataka Pored metoda xml tipa podataka, SQL Server pruža dvije proširene XQuery funkcije - sql:column( ) i sql:variable( ) – za povezivanje relacijskih podataka unutar XML podataka. Ove funkcije unose podatke iz stupca ne-xml tipa podataka ili iz T-SQL varijable, tako da možete istraživati ili manipulirati relacijskim podacima kao s bilo kojom instancom xml tipa podataka. Povezani relacijski podaci su samo za čitanje.

Poglavlje 7: XML podaci | 195

Proširene XQuery funkcije ne mogu biti upotrijebljene za referenciranje podataka u stupcima ili varijablama xml, CLR UDT, timestamp, text, ntext, sql_variant ili image tipa podataka.

Funkcija sql:column() Funkcija sql:column() izlaže relacijske podatke iz stupca ne-xml tipa podataka, omogućavajući vraćanje relacijskih podataka kao dio XML skupa rezultata. Sintaksa je: sql:column(columnName)

gdje je: columnName

Ime stupca u redu koji se obrađuje. Sljedeći primjer dodaje stupce ProductionModelID i Name te SQL varijablu @laborHourTarget XML rezultatu koji sadrži maksimalni broj radnih sati za svaki model proizvoda iz stupca xml tipa podataka Instructions. Obratite pažnju na to da morate istaknuti red iz primjera unijeti u samo jednom redu. USE AdventureWorks DECLARE @laborHourTarget int; SET @laborHourTarget = 2.5; SELECT Instructions.query(' declare namespace pmmi="http://schemas.microsoft.com/sqlserver/ 2004/07/adventure-works/ProductModelManuInstructions"; { attribute MaxLaborHours {max(/pmmi:root/pmmi:Location/@LaborHours)} } ') AS Result FROM Production.ProductModel pm WHERE Instructions IS NOT NULL

Djelomični su rezultati prikazani na slici 7-16.

Slika 7-16. Rezultati primjera funkcije sql:column() 196 | Programiranje SQL Server 2005

Funkcija sql:variable() Funkcija sql:variable() upotrijebljena u prethodnom primjeru izlaže podatke u TSQL varijabli ne-xml tipa podataka unutar XML-a. Sintaksa je: sql:variable(variableName)

gdje je: variableName

Ime T-SQL varijable.

XML Data Manipulation Language XML DML proširuje jezik XQuery tako da podržava izmjene podataka u instancama xml tipa podataka. XML DML dodaje jeziku XQuery ključne riječi insert, delete i replace value of. Primjeri u odjeljcima koji slijede koriste tablicu pod imenom xmldmlTable. Izradite ovu tablicu izvođenjem sljedeće naredbe: USE ProgrammingSqlServer2005 CREATE TABLE xmldmlTable ( ID int, xmlCol xml, CONSTRAINT PK_xmldmlTable PRIMARY KEY CLUSTERED (ID) )

Dodane XML DML ključne riječi upotrijebljene su za modificiranje instanci xml tipa podataka, kako je podrobnije opisano u sljedeća tri odjeljka.

insert XML DML naredba insert umeće jedan ili više čvorova kao čvorove potomke ili potomke istog roditelja (engl. siblings) zadanog čvora u instanci xml tipa podataka. Slijedi sintaksa za ključnu riječ insert: insert Expression1 ( {as first | as last} into | after | before Expression2 )

gdje je: Expression1

Konstantna XML instanca ili XQuery izraz koji identificira jedan ili više čvorova za umetanje. Ona ne može razlučivati do korijenskog (/) čvora. Ako je konstantna XML instanca zadala više čvorova, oni moraju biti okruženi zagradama i odvojeni zarezima.

Poglavlje 7: XML podaci | 197

into

Čvorovi koje je identificirao Expression1 umeću se kao čvorovi potomci čvora kojeg je identificirao Expression2. { as first | as last }

Ako čvor kojeg je identificirao Expression2 već ima jedan ili više čvorova potomaka, morate upotrijebiti ključne riječi as first ili as last kako biste zadali lokaciju u koju treba umetnuti nove čvorove potomke – ili na početak ili na kraj popisa potomaka. Ključne riječi as first i as last ignoriraju se kad se umeću atributi. after

Čvorovi koje je identificirao Expression1 umeću se kao potomci istog roditelja neposredno nakon čvora kojeg je identificirao Expression2. Ključna riječ after ne može biti upotrijebljena za umetanje atributa. before

Čvorovi koje je identificirao Expression1 umeću se neposredno prije čvora kojeg je identificirao Expression2. Ključna riječ before ne može biti upotrijebljena za umetanje atributa. Expression2

Konstantna XML instanca ili XQuery izraz koji identificira samo jedan postojeći čvor. Čvorovi koje je identificirao Expression1 umeću se u odnosu na ovaj čvor. Umetanje ne uspijeva ako Expression2 identificira više od jednog čvora. Sljedeći primjer stvara zapis u xmldmlTable s ID = 1 i stupac xml tipa podataka xmlCol postavljen na jednostavni XML dokument. Primjer zatim dodaje element potomak pod imenom childElement0 kao prvi potomak čvora root upotrebom XML DML naredbe insert. INSERT INTO xmldmlTable (ID, xmlCol) VALUES (1, '') SELECT xmlCol FROM xmldmlTable WHERE ID = 1 UPDATE xmldmlTable SET xmlCol.modify('insert as first into (/root)[1]') WHERE ID = 1 SELECT xmlCol FROM xmldmlTable WHERE ID = 1

Vraćena su dva skupa rezultata, kao što je prikazano na slici 7-17. Prvi skup rezultata pokazuje xmlCol vrijednost prije insert. Drugi skup rezultata nakon naredbe insert pokazuje novi element childElement0 kao prvi potomak root elementa.

198 | Programiranje SQL Server 2005

Slika 7-17. Rezultati primjera XML DML insert

delete XML DML naredba delete briše jedan ili više čvorova iz instance xml tipa podataka. Sintaksa ključne riječi delete je: delete Expression

gdje je: Expression

XQuery izraz koji zadaje jedan ili više čvorova koje treba izbrisati. Brišu se svi čvorovi koje je zadao XQuery izraz i svi sadržani čvorovi (potomci). Izraz ne može biti korijenski (/) čvor. Sljedeći primjer stvara zapis u xmldmlTable s ID = 2. On dodjeljuje elemente childElement1 i childElement2 stupcu xmlCol, a zatim briše childElement1. INSERT INTO xmldmlTable (ID, xmlCol) VALUES (2, ' ') SELECT xmlCol FROM xmldmlTable WHERE ID = 2 UPDATE xmldmlTable SET xmlCol.modify('delete (/root/childElement1)') WHERE ID = 2 SELECT xmlCol FROM xmldmlTable WHERE ID = 2

Vraćena su dva rezultata, kao što je prikazano na slici 7-18.

Slika 7-18. Rezultati primjera XML DML naredbe delete

Poglavlje 7: XML podaci | 199

Prvi skup rezultata pokazuje xmlCol vrijednost prije delete. Drugi skup rezultata nakon naredbe delete pokazuje uklanjanje elementa childElement1 iz root elementa.

replace value of XML DML naredba replace value of ažurira vrijednost čvora u instanci xml tipa podataka. Sintaksa za replace value of je: replace value of Expression1 with Expression2

gdje je: Expression1

Konstantna XML instanca ili XQuery izraz koji identificira samo jedan čvor koji treba ažurirati. Doći će do pogreške ako se zada više čvorova. Expression1 mora identificirati element s jednostavno tipiziranim sadržajem, tekstualni čvor ili čvor atributa – zadavanje udruženog tipa, složenog tipa, instrukcije za obradu, čvora dokumenta ili čvora komentara vratit će pogrešku. Expression2

Nova vrijednost čvora. Kad se ažurira tip instance xml tipa podataka, Expression2 mora imati isti podtip kao Expression1. Sljedeći primjer ažurira atribut vrijednosti za element childElement1: INSERT INTO xmldmlTable (ID, xmlCol) VALUES (3, '') SELECT xmlCol FROM xmldmlTable WHERE ID = 3 UPDATE xmldmlTable SET xmlCol.modify('replace value of (/root/childElement1/@value)[1] with "100"') WHERE ID = 3 SELECT xmlCol FROM xmldmlTable WHERE ID = 3

Vraćena su dva skupa rezultata, kao što je prikazano na slici 7-19. Prvi skup rezultata prikazuje xmlCol vrijednost prije replace value of. Drugi skup rezultata nakon naredbe replace value of prikazuje value atribut elementa childElement1 promijenjen s 1 na 100.

Slika 7-19. Rezultati primjera XML DML naredbe replace value of

200 | Programiranje SQL Server 2005

XML DML ograničenja i restrikcije XML DML ne može se upotrijebiti za umetanje, brisanje ili izmjenu sljedećeg: • Atributa xmlns, xmlns.* ili xml:base u tipiziranim ili netipiziranim instancama xml tipa podataka. • Atributa xsi:nil ili xsi:type u tipiziranim instancama xml tipa podataka Pored toga, XML DML ima sljedeće ograničenje: • Atribut xml:base ne može biti umetnut bilo u tipizirane ili u netipizirane instance xml tipa podataka.

XML rezultati upotrebom klauzule FOR XML Skup rezultata naredbe SELECT možete vratiti kao XML zadajući klauzulu FOR XML u upitu. Klauzula FOR XML bila je uvedena u SQL Serveru 2000. SQL Server 2005 poboljšava funkcionalnost, kao što će biti raspravljeno u odjeljku „Ažuriranja i poboljšanja klauzule FOR XML“, kasnije u ovom poglavlju. Sintaksa klauzule FOR XML je: [ FOR { BROWSE | } ] ::= XML { { RAW [ ('ElementName') ] | AUTO } [ [ , { XMLDATA | XMLSCHEMA [ ( TargetNameSpaceURI ) ]} ] [ , ELEMENTS [ XSINIL | ABSENT ] ] | EXPLICIT [ [ , XMLDATA ] ] | PATH [ ('ElementName') ] [ [ , ELEMENTS [ XSINIL | ABSENT ] ] ] } ::= [ , BINARY BASE64 ] [ , TYPE ] [ , ROOT [ ('RootName') ] ]

gdje:

Poglavlje 7: XML podaci | 201

RAW[('ElementName')]

Transformira svaki red u skupu rezultata u XML element s imenom zadanim u parametru ElementName. Identifikator podrazumijevano postaje ako parametar ElementName nije zadan. AUTO

Vraća rezultate upita kao jednostavnu, ugniježđenu XML hijerarhiju. Svaka tablica u klauzuli FROM s najmanje jednim izabranim stupcem vraća se kao XML element. XMLDATA

Vraća izravno upisanu XML-Data Reduced (XDR) shemu u vraćenom XML-u. XMLSCHEMA [ ( TargetNameSpaceURI ) ]

Vraća izravno upisanu XSD shemu pripojenu ispred ishodnog XML dokumenta. Ako je zadan argument TargetNameSpaceURI, u shemi se vraća zadani imenski prostor. Ne možete upotrijebiti direktivu XMLSCHEMA s direktivom ROOT ili kad je zadano ime oznake reda. ELEMENTS [ XSINIL | ABSENT ]

Navodi da se stupci vraćaju kao podelementi, umjesto da budu preslikani na atribute. Opcija ELEMENTS podržana je samo za RAW, AUTO i PATH režime. Opcija XSINIL navodi da se element s atributom xsi:nil postavljenim na true stvara za stupac s vrijednošću NULL. Ako nije zadan, ili je zadana opcija ABSENT, za stupac s vrijednošću NULL ne stvara se nikakav element. EXPLICIT

Eksplicitno zadaje XML hijerarhiju za rezultat upita. PATH

Jednostavniji način od EXPLICIT režima za zadavanje XML hijerarhije za skup rezultata. PATH upotrebljava ugniježđene FOR XML upite za miješanje elemenata i atributa te za zadavanje ugnježđivanja koje se koristi za predstavljanje složenih svojstava. Atributi se moraju pojaviti prije drugih tipova čvorova na istoj razini. BINARY BASE64

Navodi da su bilo koji podaci koje vrati upit predstavljeni u Base64 kodiranom formatu. Ova opcija mora biti postavljena kad se vraćaju binarni podaci upotrebom RAW ili EXPLICIT režima. Podrazumijevano, binarni se podaci vraćaju kao referenca u AUTO režimu. TYPE

Navodi da se rezultati upita vraćaju kao instanca xml tipa podataka. ROOT[('RootName')]

Dodaje jedan element najviše razine (korijen) vraćenom XML rezultatu s imenom koje je zadao argument RootName. Ako argument RootName nije zadan, ime elementa najviše razine podrazumijevano postaje root.

202 | Programiranje SQL Server 2005

Nekoliko primjera klauzule FOR XML Primjeri u ovom odjeljku pokazuju učinak klauzule FOR XML na skup rezultata koje je vratila sljedeća naredba SELECT: USE AdventureWorks SELECT TOP 2 DepartmentID, Name FROM HumanResources.Department

Naredba SELECT bez klauzule FOR XML vraća identifikator i ime prva dva odjela, kao što je prikazano na slici 7-20.

Slika 7-20. Rezultati primjera za SELECT

Sada naredbi dodajte klauzulu FOR XML RAW: SELECT TOP 2 DepartmentID, Name FROM HumanResources.Department FOR XML RAW

Skup rezultata samo je jedan red s jednim stupcem xml tipa podataka koji sadrži XML fragment prikazan na slici 7-21.

Slika 7-21. Rezultati primjera za FOR XML

Dodajte direktivu ROOT klauzuli FOR XML kako biste dodali korijenski čvor Departments i pretvorili XML fragment u XML dokument: SELECT TOP 2 DepartmentID, Name FROM HumanResources.Department FOR XML RAW, ROOT ('Departments')

Rezultati su prikazani na slici 7-22. Zadavanje direktive XMLSCHEMA vraća izravno upisanu XSD shemu u skupu rezultata: SELECT TOP 2 DepartmentID, Name FROM HumanResources.Department FOR XML RAW, XMLSCHEMA

Poglavlje 7: XML podaci | 203

Slika 7-22. Rezultati primjera klauzule FOR XML s direktivom ROOT

Rezultati su prikazani na slici 7-23.

Slika 7-23. Rezultati primjera klauzule FOR XML s direktivom XMLSCHEMA

Sljedeći primjer koristi AUTO režim za vraćanje informacija o narudžbama: SELECT soh.SalesOrderID, soh.OrderDate, soh.CustomerID, sod.ProductID, sod.OrderQty FROM Sales.SalesOrderHeader soh, Sales.SalesOrderDetail sod WHERE soh.SalesOrderID = sod.SalesOrderID FOR XML AUTO

Djelomični su rezultati prikazani na slici 7-24. Stvoren je jedan element za svaku tablicu zadanu u klauzuli FROM s pseudonimima tablica koji su navedeni u klauzuli FROM upotrijebljenim kao imena elemenata. AUTO režim koristi redoslijed stupaca u naredbi SELECT kako bi ugnijezdio elemente u hijerarhiju XML dokumenta. Vrijednosti odabranih stupaca dodane su elementima kao atributi. Klauzula ORDER BY potrebna je kako bi se osiguralo da su svi elementi potomci ugniježđeni pod jednim roditeljskim elementom. Sljedeći primjer koristi PATH režim za vraćanje informacija za kontakt s prodavačima: SELECT v.VendorID "@ID", v.Name "@Name", c.FirstName "Contact/First", c.LastName "Contact/Last"

204 | Programiranje SQL Server 2005

Slika 7-24. Rezultati primjera klauzule FOR XML s AUTO režimom FROM Purchasing.Vendor v, Purchasing.VendorContact vc, Person.Contact c WHERE v.VendorID = vc.VendorID AND vc.ContactID = c.ContactID ORDER BY v.Name FOR XML PATH ('Vendor')

Djelomični su rezultati prikazani na slici 7-25.

Slika 7-25. Rezultati primjera klauzule FOR XML s PATH režimom

Znak @ koji prethodi imenima stupaca VendorID i Name rezultira izlazom atributa u XML dokumentu. Kosa crta (/) u imenima stupaca FirstName i LastName rezultira izlazom XML podelemenata u XML dokumentu. Sljedeći primjer koristi EXPLICIT režim za vraćanje informacija za kontakt s prodavačima: SELECT DISTINCT 1 AS Tag, NULL AS Parent,

Poglavlje 7: XML podaci | 205

v.VendorID AS [Vendor!1!ID], v.Name AS [Vendor!1!Name], NULL AS [Contact!2!FirstName], NULL AS [Contact!2!LastName] FROM Purchasing.Vendor v, Purchasing.VendorContact vc, Person.Contact c WHERE v.VendorID = vc.VendorID AND vc.ContactID = c.ContactID UNION ALL SELECT 2 AS Tag, 1 AS Parent, v.VendorID, v.Name, c.FirstName, c.LastName FROM Purchasing.Vendor v, Purchasing.VendorContact vc, Person.Contact c WHERE v.VendorID = vc.VendorID AND vc.ContactID = c.ContactID ORDER BY [Vendor!1!ID], [Contact!2!LastName] FOR XML EXPLICIT

Djelomični su rezultati prikazani na slici 7-26.

Slika 7-26. Rezultati primjera klauzule FOR XML s EXPLICIT režimom

Metastupci Tag i Parent zadaju hijerarhiju XML dokumenta. Stupci se biraju na svakoj razini hijerarhije i kombiniraju u ugniježđeni XML dokument upotrebom operatora UNION ALL. Sintaksa imena stupca je elementName!elementLevel!attributeName.

FOR XML podrška za tipove podataka SQL Servera Sljedeći tipovi podataka SQL Servera imaju ograničenja ili posebnu vrstu obrade kao što je opisano kad se koriste s klauzulom FOR XML: xml Ako je u kluzuli SELECT zadan xml tip podataka, vrijednosti stupaca se preslikavaju na elemente i kao oni se serijaliziraju u vraćenom XML-u, bez obzira je li zadana direktiva ELEMENTS. XML deklaracije u stupcima xml tipa podataka nisu serijalizirane.

206 | Programiranje SQL Server 2005

Korisnički definirani tipovi (UDT) CLR UDT-i nisu podržani. Niz znakova Znakovi bijelog prostora u podacima pretvaraju se u entitete. Na primjer, prijelazi u novi red (engl. carriage returns), tabulatori i znakovi za novi red (engl. line feeds) pretvaraju se u , , odnosno . timestamp S instancama timestamp tipa podataka postupa se kao s varbinary(8) podacima i uvijek su kodirane s Base64. Ako se zahtijeva XSD ili XSR shema, ona to odražava.

Ažuriranja i poboljšanja klauzule FOR XML SQL Server 2005 ažurira i poboljšava FOR XML funkcionalnost iz SQL Servera 2000 na način opisan u sljedećem popisu: Direktiva TYPE U SQL Serveru 2000, FOR XML upit vraća rezultate kao text ili image tip. U SQL Serveru 2005, direktiva TYPE omogućuje vraćanje skupa rezultata iz FOR XML upita kao xml tip podataka. Poboljšanja RAW režima RAW režim sada omogućuje zadavanje imena elementa reda, dobivanje XML-a orijentiranog prema elementu i zadavanje korijenskog elementa za XML rezultat. Poboljšanja AUTO režima AUTO režim oblikuje vraćenu XML hijerarhiju uspoređivanjem stupaca u susjednim redovima u upitu. U SQL Serveru 2000, ntext, text i image tipovi podataka ne uspoređuju se. U SQL Serveru 2005, stupci xml tipa podataka također se ne uspoređuju. Novi varchar(max), nvarchar(max) i varbinary(max) tipovi podataka se uspoređuju. Poboljšana je podrška za izvedene tablice, omogućujući njihovu upotrebu za grupiranje stupaca iz različitih tablica pod istim elementom, uz skrivanje spoja od mehanizma AUTO režima za oblikovanje. Poboljšanja EXPLICIT režima EXPLICIT režim sada podržava direktivu CDATA s imenom elementa i xsi:nil režimom stupca. Ugniježđeni upiti Upotreba xml tipa podataka i direktive TYPE u FOR XML upitima omogućuje dodatnu obradu XML skupa rezultata na poslužitelju. Ovo omogućuje izradu ugniježđenih FOR XML upita Generiranje elemenata za vrijednosti NULL Parametar XSINIL direktive ELEMENTS omogućuje stvaranje elemenata za NULL vrijednosti stupaca. Ovi elementi imaju atribut xsi:nil postavljen na true. Generiranje izravno upisanih XSD I XDR shema Upit s klauzulom FOR XML može vratiti izravno upisanu shemu u vraćenom XML-u. Poglavlje 7: XML podaci | 207

Zadajte ključnu riječ XMLSCHEMA kako bi se vratila XSD shema. XMLSCHEMA može biti zadana samo u RAW ili AUTO režimu, ne i u EXPLICIT režimu. Ugniježđeni FOR XML upit koji zadaje direktivu TYPE vraća netipiziranu instancu xml tipa podataka. Zadajte ključnu riječ XMLDATA u klauzuli FOR XML kako bi se vratila XDR shema. XDR shema ne podržava sve nove tipove podataka i poboljšanja u SQL Serveru 2005. Određenije: • XDR ne podržava skupove rezultata FOR XML upita koji uključuju stupce xml tipa podataka. • varchar(max), nvarchar(max) i varbinary(max) tipovi podataka preslikavaju se u varchar(n), nvarchar(n) i varbinary(n). • Kad je režim kompatibilnosti postavljen na 90, s vrijednostima vremenske oznake postupa se kao s varbinary(8) podacima i Base64-kodiranim kad je zadano binary base64, a URL-kodiranim u AUTO režimu kad binary base64 nije zadano.

XML kataloški pogledi Kataloški pogledi opisani u tablici 7-8 vraćaju informacije o xml entitetima u bazi podataka. Tablica 7-8. Kataloški pogledi za XML entitete Kataloški pogled

Opis

sys.xml_attributes

Red po xml komponenti koja je atribut (symbol_space = A). Ovaj pogled nasljeđuje od sys.xml_components.

sys.xml_component_placements

Red po položaju za xml komponente.

sys.xml_components

Red po komponenti XML sheme.

sys.xml_elements

Red po xml komponenti koja je element (symbol_space = E). Ovaj pogled nasljeđuje od sys.xml_components.

sys.xml_facets

Red po značajki definicije xml tipa. Ovaj pogled nasljeđuje od sys.xml_components.

sys.xml_indexes

Red po xml indeksu. Ovaj pogled nasljeđuje od sys.indexes.

sys.xml_model_groups

Red po xml komponenti koja je Model-Group (symbol_space = M). Ovaj pogled nasljeđuje od sys.xml_components.

sys.xml_schema_collections

Red po kolekciji XML shema.

sys.xml_schema_components

Red po komponenti XML sheme.

sys.xml_schema_namespaces

Red po XSD definiranom XML imenskom prostoru.

208 | Programiranje SQL Server 2005

Tablica 7-8. Kataloški pogledi za XML entitete (nastavak) Kataloški pogled

Opis

sys.xml_types

Red po xml komponenti koja je Type (symbol_space = T). Ovaj pogled nasljeđuje od sys.xml_components.

sys.xml_wildcard_namespaces

Red po enumeriranom imenskom prostoru za xml zamjenski znak.

sys.xml_wildcards

Red po xml komponenti koja je Attribute-Wildcard (vrste V) ili ElementWildcard (vrste W), obje sa symbol_space = N. Ovaj pogled nasljeđuje od sys.xml_components.

Poglavlje 7: XML podaci | 209

POGLAVLJE 8

Izvorne XML Web usluge

SQL Server 2005 podržava izvorne XML Web usluge i za SOAP 1.1 i za SOAP 1.2 klijente. SQL Server Database Engine može se konfigurirati kao HTTP slušatelj, omogućujući pristup podacima raznim klijentima. S pomoću SOAP poruke putem HTTP-a možete poslati zahtjev SQL Serveru za izvođenje paketa T-SQL naredbi (sa ili bez parametara), pohranjenih procedura, produženih pohranjenih procedura i korisnički definiranih funkcija sa skalarnom vrijednošću. U SQL Serveru 2000, podršku za Web usluge pružaju SQLXML 3.0 i Internet Information Services (IIS), kao i Microsoft Data Access Components (MDAC) stog instaliran na klijentu za pristup SQL Serveru. Uključivanje izvornih Web usluga u SQL Server 2005 omogućuje pristup bazi podataka puno široj grupi klijenata, u skladu s ciljevima interoperabilnosti platforme i operacijskog sustava za Web usluge. Klijentu su potrebni samo HTTP i XML za pristupanje Web uslugama koje izlaže SQL Server 2005. To proširuje pristup podacima SQL Servera na razini velikih poduzeća iz različitih okolina, uključujući Unix i Linux sustave te prijenosne uređaje. SQL Server 2005 uključuje ugrađene mjere sigurnosti za nadziranje klijentskog pristupa.

Otvoreni standardi Izvorne XML Web usluge SQL Servera 2005 temelje se na sljedećim otvorenim standardima: Hypertext Transfer Protocol (HTTP) Protokol nezavisan o platformi za razmjenu podataka. HTTP je temeljni protokol na Webu. HTTP zadaje format poruka, način na koji se prenose te akcije koje bi Web poslužitelji i preglednici trebali poduzeti kao odgovor na naredbe poruke. Izvorna HTTP podrška u SQL Serveru 2005 zahtijeva HTTP slušatelja u režimu jezgre (http.sys), a koji je na raspolaganju jedino u Windows Serveru 2003 ili Windows XP SP2 ili novijima. HTTP Configuration Utility (httpcfg.exe) upotrebljava se za konfiguriranje http.sys datoteke. 210

Simple Object Access Protocol (SOAP) Jednostavan protokol za razmjenu poruka temeljen na XML-u koji se koristi za kodiranje informacija zahtjeva i odgovora Web usluga te njihovo otpremanje preko mreže. SOAP je neovisan o platformi i operativnom sustavu te se može prenositi preko raznih Internet protokola, uključujući HTTP, TCP i SMTP. Web Service Description Language (WSDL) XML format dokumenta koji opisuje mogućnosti Web usluge.

Izrada Web usluge Slijedite ove korake kako biste izradili XML Web uslugu u SQL Serveru 2005: 1. Uspostavite HTTP krajnju točku na instanci SQL Servera. Krajnja je točka sučelje preko kojeg HTTP klijenti mogu slati upite poslužitelju. Krajnju točku uspostavljate upotrebom T-SQL DDL naredbe CREATE ENDPOINT. 2. Izložite pohranjene procedure ili UDF-e kao Web metode. To ćete postići definiranjem postojećih pohranjenih procedura ili UDF-a za Web pristup upotrebom T-SQL DDL naredbe CREATE ENDPOINT ili ALTER ENDPOINT. 3. Napravite WSDL koji opisuje Web uslugu i stavite ga na raspolaganje klijentima, omogućujući im pristup Web usluzi. WSDL može generirati SQL Server ili ga možete napraviti sami. Sljedeći odlomak ovog poglavlja pruža primjer izrade Web usluge u SQL Serveru 2005.

Primjer izrade HTTP krajnje točke i izlaganja Web metode Primjer iz ovog odlomka izrađuje pohranjenu proceduru i zadaje HTTP SOAP krajnju točku sa samo jednom Web metodom koja pristupa pohranjenoj proceduri. .NET klijent se stvara da bi pozvao pohranjenu proceduru putem poziva Web usluge te prikazao rezultate. Slijedite ove korake kako biste izradili krajnju točku i izložili Web metodu: 1. Izradite pohranjenu proceduru koja vraća narudžbenice za određenog zaposlenika ili sve narudžbenice, ako zaposlenik nije određen. Izvedite sljedeći upit u bazi podataka AdventureWorks za izradu pohranjene procedure: USE AdventureWorks CREATE PROCEDURE GetPurchaseOrder @EmployeeID [int] = NULL WITH EXECUTE AS CALLER

Poglavlje 8: Izvorne XML Web usluge | 211

AS IF @EmployeeID IS NOT NULL BEGIN SELECT * FROM Purchasing.PurchaseOrderHeader WHERE EmployeeID = @EmployeeID END ELSE SELECT * FROM Purchasing.PurchaseOrderHeader

2. Izradite HTTP SOAP krajnju točku pod nazivom GetPurchaseOrderEndpoint za izlaganje ove pohranjene procedure kao Web metode pod nazivom GetPurchaseOrder. Sljedeća T-SQL naredba stvara HTTP krajnju točku s jednom Web metodom: USE AdventureWorks CREATE ENDPOINT GetPurchaseOrderEndpoint STATE = STARTED AS HTTP ( path = '/sql/GetPurchaseOrder', AUTHENTICATION = (INTEGRATED), PORTS = (CLEAR) ) FOR SOAP( WEBMETHOD 'GetPurchaseOrder' (NAME = 'AdventureWorks.dbo.GetPurchaseOrder', SCHEMA = STANDARD), BATCHES = ENABLED, WSDL = DEFAULT, SCHEMA = STANDARD, DATABASE = 'AdventureWorks', NAMESPACE = 'http://tempUri.org/' )

U Windowsima XP ne možete stvarati krajnje točke upotrebom porta 80 ako se izvodi IIS jer IIS sluša port 80. Zato možete zaustaviti uslugu World Wide Web Publishing ili izraditi krajnju točku na drugom portu zadavanjem klauzule CLEAR_PORT u naredbama CREATE ENDPOINT ili ALTER ENDPOINT. Zaustavite uslugu World Wide Web Publishing odabiranjem Start ➝ Administrative Tools ➝ Services. U dijaloškom okviru Services desnim gumbom miša pritisnite World Wide Web Publishing i izaberite Stop u kontekstnom izborniku.

Izrada HTTP krajnjih točaka i upravljanje njima detaljno je opisano u odlomku „Izrada HTTP krajnje točke“, kasnije u ovom poglavlju. Da je krajnja točka izrađena možete potvrditi ispitivanjem kataloškog pogleda sys. http_endpoints: SELECT * FROM sys.http_endpoints

Postojanje Web metode možete potvrditi ispitivanjem kataloškog pogleda sys.endpoint_webmethods: SELECT * FROM sys.endpoint_webmethods

212 | Programiranje SQL Server 2005

Kataloški pogledi koji sadrže informacije o HTTP krajnjim točkama zadanim u instanci SQL Servera opisani su kasnije u ovom poglavlju. Sljedeće dopuštenje kontrolira može li principal vidjeti metapodatke za određenu krajnju točku: { GRANT | DENY | REVOKE | } ON ENDPOINT::endPointName TO server_principal

Ovo dopuštenje principalu ne daje pristup krajnjoj točki. Idući korak je upotreba Web metode. Sljedeći primjer koristi C# .NET klijent. Slijedite ove korake u Visual Studiju 2005: 1. Iz izbornika Visual Studija 2005 odaberite File ➝ New ➝ Project. 2. U dijaloškom okviru New Project izaberite Visual C# u stablastom pregledu te Windows Application iz instaliranih predložaka. 3. Zadajte gdje želite spremiti projekt. Projekt nazovite GetPurchaseOrderSoapApp. Pritisnite OK. 4. U prozoru Solution Explorer desnom tipkom miša pritisnite References i odaberite Add Web Reference s kontekstnog izbornika. 5. U dijaloški okvir Add Web Reference unesite http://localhost/sql/GetPurchaseOrder?wsdl. Možete navesti ime poslužitelja umjesto localhost ukoliko SQL Server nije lokalnog tipa. Slika 8-1 pokazuje da je metoda GetPurchaseOrder() raspoloživa, zajedno s sqlbatch(), što dozvoljava izvođenje ad hoc upita. 6. Promijenite naziv Web reference u GetPurchaseOrderWS. Pritisnite gumb Add Reference. 7. Dvaput pritisnite na Form1 u Solution Exploreru kako biste otvorili Form Designer. 8. Obrascu dodajte kontrolu DataGridView. Uklonite oznake iz polja za potvrdu Enable Adding, Enable Editing i Enable Deleting. Svojstvo Name postavite na PODataGridView. 9. Obrascu dodajte kontrolu Label. Svojstvo Text postavite na Employee ID:. 10. Obrascu dodajte kontrolu TextBox. Svojstvo Name postavite na employeeIDTextBox. 11. Obrascu dodajte kontrolu Button. Svojstvo Text postavite na Go, a svojstvo Name na goButton. Slika 8-2 prikazuje dovršeni obrazac. 12. Dvaput pritisnite goButton kako biste dodali metodu za obradu događaja pritiska na gumb nazvanu goButton_Click. 13. Dodajte sljedeći kod metodi za obradu događaja goButton_Click: GetPurchaseOrderWS.GetPurchaseOrderEndpoint proxy = new GetPurchaseOrderWS.GetPurchaseOrderEndpoint(); proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

Poglavlje 8: Izvorne XML Web usluge | 213

Slika 8-1. Dodavanje Web reference za GetPurchaseOrder()

Slika 8-2. Korisničko sučelje klijentske Web aplikacije object[] results; int employeeID = -1; try { employeeID = int.Parse(employeeIDTextBox.Text);

214 | Programiranje SQL Server 2005

} catch (Exception) { } // Izvodi metodu GetPurchaseOrder() šaljući joj vrijednost null ili // oznaku zaposlenika if (employeeID != -1 results = proxy.GetPurchaseOrder(employeeID); else results = proxy.GetPurchaseOrder(System.Data.SqlTypes.SqlInt32.Null); // Iterira po cijelom polju objekata vraćenom iz Web usluge za svaki // pojedini objekt foreach (object o in results) { if (o.GetType().IsPrimitive) MessageBox.Show("SP Return Code = " + o); else switch (o.GetType().ToString()) { case "System.Data.DataSet": // Pretvara objekt u skup podataka i popunjava pogled PODataGridView.DataSource = ((DataSet)o).Tables[0]; break; case "GetPurchaseOrderSoapApp.GetPurchaseOrderWS.SqlRowCount": MessageBox.Show("RowCount = " + ((GetPurchaseOrderSoapApp.GetPurchaseOrderWS.SqlRowCount)o).Count); break; } }

14. Pokrenite aplikaciju. Unesite vrijednost za Employee ID (na primjer, 244) ili ostavite prazno radi dobivanja svih zaposlenika. Pritisnite gumb Go i DataGridView će se napuniti skupom podataka koji je vratila Web metoda. Rezultati za Employee ID = 244 prikazani su na slici 8-3.

Slika 8-3. Rezultati primjera Web usluge Poglavlje 8: Izvorne XML Web usluge | 215

SQL paketi Krajnje točke Web usluga mogu biti konfigurirane tako da podržavaju ad hoc upite. Konfiguriranje izvodi poseban SOAP argument BATCHES u CREATE ENDPOINT i ALTER ENDPOINT. Ad hoc upit izvodite pozivajući metodu sqlbatch() HTTP krajnje točke, proslijeđujući joj upite (višestruki upiti moraju biti odvojeni točka-zarezom) te parametre. U SOAP SQL paketnom zahtjevu SOAP element sadrži samo jedan . Ovaj element ima dva elementa potomka: Zadaje upit ili višestruke upite odvojene točka-zarezima (;). Zadaje neobavezan popis parametara. Svaki je parametar zadan kao element potomak elementa . Za svaki parametar morate proslijediti ime parametra kao atribut imena elementa , a vrijednost parametra kao element potomak elementa . Sljedeći primjer demonstrira podršku za ad hoc upite preinačavanjem prethodnog klijenta. Nova inačica vraća narudžbenice za zaposlenika upotrebom ad hoc upita umjesto Web metode GetPurchaseOrder(). Kôd metode za obradu događaja goButton_Click zamijenite sljedećim kodom: int employeeID = -1; try { employeeID = int.Parse(employeeIDTextBox.Text); } catch (Exception) { } // execute the query only if a valid employee ID is entered if (employeeID != -1) { GetPurchaseOrderWS.GetPurchaseOrderEndpoint proxy = new GetPurchaseOrderWS.GetPurchaseOrderEndpoint(); proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; // Parametrizirana SQL naredba koja vraća narudžbe samo za određenog zaposlenika string commandText = "SELECT * FROM Purchasing.PurchaseOrderHeader " + "WHERE EmployeeID = @employeeID FOR XML AUTO"; // Stvara parametar s identifikatorom zaposlenika GetPurchaseOrderWS.SqlParameter[] parm = new GetPurchaseOrderWS.SqlParameter[1]; parm[0] = new GetPurchaseOrderWS.SqlParameter(); parm[0].name = "employeeID"; parm[0].Value = employeeID; parm[0].sqlDbType = GetPurchaseOrderWS.sqlDbTypeEnum.Int; parm[0].direction = GetPurchaseOrderWS.ParameterDirection.Input;

216 | Programiranje SQL Server 2005

// Poziva metodu sqlbatch Web usluge za izvođenje ad-hoc upita object[] results = proxy.sqlbatch(commandText, ref parm); // Iterira po cijelom polju objekata vraćenom iz Web usluge // za svaki pojedini objekte foreach (object o in results) { if (o.GetType().IsPrimitive) MessageBox.Show("Return Code = " + o); else switch (o.GetType().ToString()) { case "System.Xml.XmlElement": // Uzima XmlElement i pretvara ga u skup podataka System.Xml.XmlElement xmlResult = (System.Xml.XmlElement)o; System.Xml.XmlNodeReader xnr = new System.Xml.XmlNodeReader(xmlResult); DataSet ds = new DataSet(); ds.ReadXml(xnr); PODataGridView.DataSource = ds.Tables[0]; break; case "GetPurchaseOrderSoapApp.GetPurchaseOrderWS.SqlRowCount": MessageBox.Show("RowCount = " + ((GetPurchaseOrderSoapApp.GetPurchaseOrderWS.SqlRowCount) o).Count); break; } } }

Rezultati su isti kao i u prethodnom primjeru, osim što morate obavezno navesti identifikator zaposlenika.

SOAP poruke zahtjeva i odgovora Kad izrađujete Visual Studio .NET aplikaciju, Visual Studio .NET stvara neophodnu posredničku klasu tako da možete pozvati metodu Web usluge gotovo jednako kao i bilo koju drugu metodu. Visual Studio .NET aplikacija automatski izrađuje SOAP omotnicu za zahtjev, a SQL Server obrađuje zahtjev, vraćajući rezultate u polju object ili u samo jednom DataSet objektu. Ukoliko razvijate aplikaciju koja izgrađuje vlastite SOAP zahtjeve i obrađuje vlastite SOAP odgovore, trebate razumjeti strukture SOAP poruka zahtjeva i odgovora te strukturu SOAP poruka pogreške. Za više informacija, pogledajte Microsoft SQL Server 2005 Books Online.

Poglavlje 8: Izvorne XML Web usluge | 217

Rad sa HTTP krajnjim točkama HTTP krajnja točka je sučelje preko kojeg klijenti temeljeni na HTTP-u šalju upite poslužitelju. Morate upotrijebiti T-SQL naredbu CREATE ENDPOINT za konfiguriranje instance SQL Servera za izvorno slušanje HTTP zahtjeva, prije no što možete poslati izvorni HTTP/SOAP zahtjev poslužitelju. HTTP krajnje točke SQL Servera mogu slušati i primati zahtjeve na bilo kojem valjanom portu uključujući TCP port 80 – isti port koji koristi IIS usluga World Wide Web Publishing. Svaki URL – bilo da se koristi za HTTP krajnju točku ili ga koristi IIS – registriran je u operacijskom sustavu kroz proces HTTP slušatelja (http.sys). Ovaj odlomak objašnjava kako napraviti, mijenjati i uklanjati krajnje točke te kako odobriti i promijeniti dopuštenja na objektima krajnjih točaka.

Izrada HTTP krajnje točke Krajnja točka je sučelje na kojem poslužitelj sluša HTTP zahtjeve od klijenata. T-SQL naredba CREATE ENDPOINT stvara i konfigurira krajnju točku i Web metode koje krajnja točka izlaže. Sintaksa za naredbu CREATE ENDPOINT je: CREATE ENDPOINT endPointName [ AUTHORIZATION login ] STATE = { STARTED | STOPPED | DISABLED } AS { HTTP | TCP } ( ) FOR { SOAP | TSQL | SERVICE_BROKER | DATABASE_MIRRORING } ( )

gdje je: endPointName

Ime krajnje točke koja se izrađuje. AUTHORIZATION login

Korisnički račun SQL Servera ili Windowsa kojem je dodijeljeno vlasništvo nad novom krajnjom točkom. Pozivatelj mora imati IMPERSONATE dopuštenja na određenom korisničkom računu kako bi odredio AUTHORIZATION. Ako je ova klauzula ispuštena, pozivatelj postaje vlasnik. Možete ponovno dodijeliti vlasništvo nad krajnjom točkom s pomoću naredbe ALTER ENDPOINT. = { STARTED | STOPPED | DISABLED } Stanje krajnje točke kad je izrađena.

STATE

STARTED

Krajnja točka je pokrenuta i sluša zahtjeve.

218 | Programiranje SQL Server 2005

DISABLED

Krajnja točka je onesposobljena i ne odgovara na zahtjeve. STOPPED

Krajnja točka je zaustavljena i vraća pogrešku kao odgovor na zahtjev. STOPPED je podrazumijevano stanje.

Upotrijebite naredbu ALTER ENDPOINT kako biste promijenili stanje krajnje točke. AS

{ HTTP | TCP } ( ) Zadaje koji protokol prijenosa treba upotrijebiti – HTTP ili TCP. Klauzula AS navodi informacije svojstvene protokolu prijenosa za krajnju točku, uključujući port slušanja, metodu provjere identiteta te popis IP adresa kojima je ograničen pristup krajnjim točkama.

Klauzula AS opisana je u sljedećem odjeljku. FOR { SOAP | TSQL | SERVICE_BROKER | DATABASE_MIRRORING } ( ) Određuje tip sadržaja – SOAP, TSQL, SERVICE_BROKER ili DATABASE_MIRRORING. Klauzula FOR zadaje sadržaj i navodi dodatne informacije o konfiguraciji SOAP-a,

primjerice, jesu li dozvoljeni ad hoc zahtjevi, treba li vratiti XSD nacrt za skup rezultata te kako obrađivati nedozvoljene znakove u XML-u. Klauzula FOR opisana je u nadolazećem odjeljku.

Argumenti svojstveni protokolu Sintaksa za elemente u klauzuli AS, svojstvene HTTP protokolu, je: ::= AS HTTP ( PATH = 'url', AUTHENTICATION =( { BASIC | DIGEST | INTEGRATED | NTLM | KERBEROS } [ ,...n ] ), PORTS = ( { CLEAR | SSL} [ ,... n ] ) [ SITE = {'*' | '+' | 'webSite' },] [, CLEAR_PORT = clearPort ] [, SSL_PORT = SSLPort ] [, AUTH_REALM = { 'realm' | NONE } ] [, DEFAULT_LOGON_DOMAIN = { 'domain' | NONE } ] [, RESTRICT_IP = { NONE | ALL } ] [, COMPRESSION = { ENABLED | DISABLED } ] [, EXCEPT_IP = ( { | : } [ ,...n ] ) ] )

gdje je: PATH

URL krajnje točke na računalu domaćinu zadanom argumentom SITE. PATH, zajedno s argumentom SITE, zadaje URL koji klijent koristi za slanje HTTP SOAP zahtjeva poslužitelju. Poglavlje 8: Izvorne XML Web usluge | 219

Na primjer, u URL-u http:///, site je računalo koje je zadao argument SITE, a path je URL koji je zadao argument PATH. AUTHENTICATION

Metoda provjere identiteta za krajnju točku – jedna ili više vrijednosti BASIC, DIGEST, INTEGRATED, NTLM ili KERBEROS. (Ako zadate više metoda provjere identiteta, metode odvojite zarezima). Provjeravanje identiteta detaljno je objašnjeno u odlomku „Provjera identiteta krajnje točke“, kasnije u ovom poglavlju. = ( { CLEAR | SSL} [ ,...n ] ) Jedan ili više portova slušanja za krajnju točku. Portovi slušanja mogu biti CLEAR, SSL ili oba. Ako se zada CLEAR, dolazeći zahtjevi moraju koristiti standardne HTTP zahtjeve (http://). Ako se zada SSL, dolazeći zahtjevi moraju koristiti Secure HTTP zahtjeve (https://).

PORTS

= {'*' | '+' | 'webSite' } Ime računala domaćina. Može se zadati ili točno ime, ili jedan od dva zamjenska znaka:

SITE

Znak plus (+) Zadaje slušanje na svim mogućim imenima za računalo. Zvjezdica (*) Zadaje slušanje na svim mogućim imenima za računalo, ako ona nisu na drugi način izričito rezervirana. Ako argument SITE nije zadan, podrazumijevana vrijednost je zvjezdica (*). CLEAR_PORT

Broj slobodnog porta za slušanje, ukoliko argument PORTS određuje slušanje na slobodnom portu (PORTS = CLEAR). Podrazumijevana vrijednost je 80, ako CLEAR_PORT nije izričito zadan. SSL_PORT

Broj SSL porta koji osluškuje, ukoliko argument PORTS zadaje slušanje na SSL portu (PORTS = SSL). Podrazumijevana vrijednost je 443 ako SSL_PORT nije izričito zadan. = {'realm' | NONE } Sugestija vraćena klijentu kao dio HTTP izazova za sažetu potvrdu identiteta (AUTHENTICATION = DIGEST). Podrazumijevana vrijednost je NONE.

AUTH_REALM

'domain' | NONE } Podrazumijevana domena prijave za osnovnu potvrdu identiteta (AUTHENTICATION = BASIC). Podrazumijevana vrijednost je NONE.

DEFAULT_LOGIN_DOMAIN{

RESTRICT_IP

=

{

NONE |

ALL

}

Ovaj parametar zajedno s EXCEPT_IP zadaje koje IP adrese mogu slati zahtjeve krajnjoj točki: 220 | Programiranje SQL Server 2005

NONE

Ukazuje da sve IP adrese osim popisa koji zada parametar EXCEPT_IP mogu slati zahtjeve krajnjoj točki. ALL

Ukazuje da samo IP adrese navedene u parametru EXCEPT_IP mogu slati zahtjeve krajnjoj točki (tj. sve su IP adrese ograničene, osim popisa koji je zadao parametar EXCEPT_IP) Podrazumijeva se NONE, omogućujući svim IP adresama slanje zahtjeva krajnjoj točki. COMPRESSION

=

{

ENABLED |

DISABLED }

Zadaje uvažava li krajnja točka gzip zahtjeve i vraća komprimirane odgovore. Podrazumijevana vrijednost je DISABLED i ukazuje da se gzip zahtjevi ne uvažavaju. EXCEPT_IP

=

(

{

| : } [ ,...n ] )

Popis IP adresa koji zajedno s parametrom RESTRICT_IP zadaje IP adrese kojima je dozvoljeno ili zabranjeno slati zahtjeve krajnjoj točki. Sintaksa za elemente svojstvene TCP protokolu u klauzuli AS je: ::= AS TCP ( LISTENER_PORT = listenerPort [ , LISTENER_IP = ALL | ( | ) ] [ , RESTRICT_IP = ALL | NONE ] [ , EXCEPT_IP = ( { | : } [ ,...n ] ) ]

gdje je: LISTENER_PORT

Broj porta slušatelja za TCP/IP protokol. Podrazumijevana vrijednost je 4022. LISTENER_IP = ALL | (

| )

IP adresa koju krajnja točka sluša. Podrazumijevana vrijednost je ALL, što znači da će krajnja točka prihvatiti vezu na bilo kojoj valjanoj IP adresi. RESTRICT_IP

Klauzula RESTRICT_IP opisana je u prethodnoj raspravi o elementima svojstvenim HTTP protokolu. EXCEPT_IP

Klauzula EXCEPT_IP opisana je u prethodnoj raspravi o elementima svojstvenim HTTP protokolu.

Argumenti svojstveni jeziku Sintaksa za SOAP argumente svojstvene jeziku je: ::= FOR SOAP( [ { WEBMETHOD [ 'namespace' .] 'method_alias' ( NAME = 'database.owner.name' [ , SCHEMA = { NONE | STANDARD | DEFAULT } ]

Poglavlje 8: Izvorne XML Web usluge | 221

[ , FORMAT = { ALL_RESULTS | ROWSETS_ONLY | NONE} ] ) } [ ,...n ] ] [ BATCHES = { ENABLED | DISABLED } ] [ , WSDL = { NONE | DEFAULT | 'sp_name' } ] [ , SESSIONS = { ENABLED | DISABLED } ] [ , LOGIN_TYPE = { MIXED | WINDOWS } ] [ , SESSION_TIMEOUT = timeoutInterval | NEVER ] [ , DATABASE = { 'database_name' | DEFAULT } [ , NAMESPACE = { 'namespace' | DEFAULT } ] [ , SCHEMA = { NONE | STANDARD } ] [ , CHARACTER_SET = { SQL | XML }] [ , MAX_SOAP_HEADERS_SIZE = { int | DEFAULT }] )

gdje je: WEBMETHOD

[

'namespace'

.]

'method_alias'

Metoda za koju možete slati SOAP zahtjeve krajnjoj točki. Svaka klauzula WEBMETHOD opisuje samo jednu metodu. Međutim, krajnja točka može izložiti višestruke metode. Naredba ALTER ENDPOINT može se upotrijebiti za dodavanje ili uklanjanje Web metoda iz postojeće krajnje točke. Ako imenski prostor nije zadan, upotrijebit će se imenski prostor krajnje točke. = ' database.owner.name ' Ime pohranjene procedure ili UDF koje odgovara Web metodi. NAME se mora zadati kao trodijelno ime u formatu bazapodataka.naziv.ime.

NAME

= {NONE | STANDARD | DEFAULT} Zadaje vraća li Web metoda izravno upisan XSD nacrt u SOAP odgovoru.

SCHEMA

NONE

Web metoda je ispuštena iz nacrta ako je on poslan u SOAP odgovoru. STANDARD

XSD nacrt ne vraća se sa SOAP odgovorom. DEFAULT

Vrijednost određena za opciju SCHEMA krajnje točke odlučuje hoće li XSD nacrt biti vraćen. { ALL_RESULTS | ROWSETS_ONLY | NONE } Zadaje vraćaju li se zbroj redova, poruke o pogreškama i upozorenja sa skupom rezultata.

FORMAT=

ALL_RESULTS

Zbroj redova, poruke o pogreškama i upozorenja vraćaju se sa skupom rezultata u SOAP odgovoru. ROWSETS_ONLY

Samo se skup rezultata vraća u SOAP odgovoru. 222 | Programiranje SQL Server 2005

NONE

Kod svojstven SOAP-u potisnut je iz SOAP odgovora. Podrazumijevana vrijednost je ALL_RESULTS. = { ENABLED | DISABLED } Zadaje jesu li ad hoc SQL zahtjevi podržani na krajnjoj točki kroz metodu sqlbatch(). Podrazumijevana vrijednost je DISABLED.

BATCHES

Ad hoc SQL zahtjevi detaljno su opisani ranije u ovom poglavlju. = { NONE | DEFAULT | 'sp_name' } Zadaje hoće li WSDL dokument biti generiran i vraćen za WSDL upite podnesene krajnjoj točki.

WSDL

NONE

Nikakva se WSDL datoteka ne generira niti vraća za WSDL upite krajnjoj točki. DEFAULT

Podrazumijevana se WSDL datoteka generira i vraća za WSDL upite krajnjoj točki. 'sp_name'

Prilagođena WSDL datoteka koju generira pohranjena procedura sp_name vraća se za WSDL upite na krajnjoj točki. = { ENABLED | DISABLED } Zadaje dozvoljava li SQL Server sesije – višestruke SOAP zahtjev/odgovor parove prepoznate kao dio jedne SOAP sesije. Podrazumijevana vrijednost je DISABLED.

SESSIONS

= { MIXED | WINDOWS } Način potvrde identiteta za krajnju točku koji primjenjuje SQL Server. LOGIN_TYPE upotrebljava se samo za daljnje ograničavanje načina potvrde identiteta za krajnje točke, koji se temelji na načinu potvrde identiteta izabranom tijekom instalacije SQL Servera.

LOGIN_TYPE

WINDOWS

Upotrebljava se samo Windows potvrda identiteta. MIXED

Upotrebljava se ili SQL ili Windows potvrda identiteta. Miješana potvrda identiteta ne može se upotrijebiti, ako nije bila odabrana kao globalni način potvrde identiteta tijekom instalacije SQL Servera. Krajnja točka koja upotrebljava potvrdu identiteta temeljenu na SQL Serveru mora biti konfigurirana tako da koristi SSL port. Podrazumijevana vrijednost je WINDOWS. = int | NEVER Vrijeme, u sekundama, nakon kojeg SOAP sesiji istječe vrijeme trajanja na poslužitelju, ako nikakvi zahtjevi (prepoznati od identifikatora sesije u SOAP zaglavlju) nisu podneseni. Nakon što sesiji istekne vrijeme, kasniji zahtjevi s isteklim identifikatorom sesije vraćaju SOAP pogrešku. SOAP sesiji nikada ne ističe trajanje ako je za SESSION_TIMEOUT zadana vrijednost NEVER.

SESSION_TIMEOUT

Poglavlje 8: Izvorne XML Web usluge | 223

= { 'database_name' | DEFAULT } Baza podataka u kojoj se izvodi operacija. Ako nije navedena ili ako je zadano DEFAULT, za prijavu će se upotrijebiti podrazumijevana baza podataka.

DATABASE

= { 'namespace' | DEFAULT } Imenski prostor za krajnju točku. Ako nije zadan ili je zadan kao DEFAULT, upotrijebit će se http://tempuri.org.

NAMESPACE

= { NONE | STANDARD } Zadaje hoće li krajnja točka vratiti XSD nacrt sa SOAP rezultatom poslanim klijentu.

SCHEMA

STANDARD

Shema izravno upisan u kod uključena je u SOAP odgovor. NONE

Shema izravno upisana u kod nije uključena u SOAP odgovor. Izravno upisana shema potrebna je za učitavanje SOAP rezultata u .NET DataSet objekt. Podrazumijevano je STANDARD. = { SQL | XML } Zadaje ponašanje ako rezultati operacije uključuju znakove koji nisu dozvoljeni u XML-u.

CHARACTER_SET

XML

Ako rezultat uključuje nevažeće XML znakove, vraća se pogreška. SQL

Nevažeći znakovi kodirani su kao znakovne reference i vraćeni u rezultatima – ovo može rezultirati nevažećim XML-om. Podrazumijevana vrijednost je XML. MAX_SOAP_HEADERS_SIZE

=

{

int |

DEFAULT }

Zadaje maksimalnu veličinu, u bajtovima, SOAP zaglavlja unutar SOAP omotnice. Poslužitelj izbacuje pogrešku parsiranja ako je SOAP zaglavlje veće od zadane vrijednosti. Maksimalna veličina zaglavlja je 8 KB ako je postavljeno DEFAULT ili ako vrijednost nije zadana. Sintaksa za elemente svojstvene za Service Broker je: ::= FOR SERVICE_BROKER ( [ AUTHENTICATION = { WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] | CERTIFICATE certificateName | WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] CERTIFICATE certificateName | CERTIFICATE certificateName WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] } ] [ , ENCRYPTION = {DISABLED | SUPPORTED | REQUIRED } [ALGORITHM {RC4 | AES | AES RC4 | RC4 AES } ] ] } [ , MESSAGE_FORWARDING = { ENABLED | DISABLED } ] [ , MESSAGE_FORWARD_SIZE = forwardSize ] )

224 | Programiranje SQL Server 2005

gdje je: AUTHENTICATION

TCP/IP zahtjevi za provjeru identiteta za veze na krajnju točku – ili WINDOWS ili CERTIFICATE. Podrazumijevano je WINDOWS. Ako su zadane obje metode provjere identiteta, one se iskušavaju po redu koji je zadan, sve dok jedna ne bude uspješna ili obje neuspješne. WINDOWS

Windows provjera identiteta upotrebljava se za provjeru identiteta korisnika krajnje točke. Možete po želji zadati metodu autorizacije – NTLM, KERBEROS ili NEGOTIATE – kako biste prisilili Windows provjeru identiteta da koristi tu metodu autorizacije. Ako zadate NEGOTIATE, krajnja točka koristi pregovarački protokol Windowsa da odabere ili NTLM ili Kerberos. NEGOTIATE je podrazumijevana metoda autorizacije. CERTIFICATE

Krajnja se točka povezuje upotrebom zadane potvrde kako bi uspostavila identitet za autorizaciju. Krajnja točka treba potvrdu s javnim ključem za tu zadanu potvrdu. ENCRYPTION

=

{DISABLED |

SUPPORTED | REQUIRED }

Zadaje hoće li se u procesu upotrijebiti šifriranje. DISABLED

Podaci poslani preko veze nisu šifrirani. SUPPORTED

Podaci su šifrirani ako veza sa suprotnom krajnjom točkom odredi SUPPORTED ili REQUIRED. REQUIRED

Podaci moraju biti šifrirani. Suprotna krajnja točka mora odrediti SUPPORTED ili REQUIRED za opciju ENCRYPTION. Podrazumijevano je REQUIRED. ALGORITHM

Zadaje algoritam za šifriranje. Ako obje krajnje točke odrede različite algoritme za šifriranje, nadvladat će krajnja točka za prihvaćanje. MESSAGE_FORWARDING

=

{

ENABLED

|

DISABLED }

Zadaje prosljeđuju li se poruke koje primi krajnja točka, a namijenjene su uslugama smještenima na neko drugo mjesto. ENABLED

Poruke se prosljeđuju ako je adresa za prosljeđivanje raspoloživa. DISABLED

Poruke za usluge smještene na neko drugo mjesto se odbacuju. Podrazumijevana vrijednost je DISABLED. Poglavlje 8: Izvorne XML Web usluge | 225

MESSAGE_FORWARD_SIZE

Zadaje najveću količinu prostora, u megabajtima, namijenjenu upotrebi krajnje točke za pohranu poruka koje će biti proslijeđene. Sintaksa za elemente svojstvene dupliciranju baze podataka je: ::= FOR DATABASE_MIRRORING ( [ AUTHENTICATION = { WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] | CERTIFICATE certificateName } ] [ [ , ] ENCRYPTION = { DISABLED |SUPPORTED | REQUIRED } [ ALGORITHM { RC4 | AES | AES RC4 | RC4 AES } ] ] } [ , ] ROLE = { WITNESS | PARTNER | ALL } )

gdje je: AUTHENTICATION Klauzula AUTHENTICATION opisana je u prethodnoj raspravi o elementima svojstve-

nima za Service Broker. ENCRYPTION

=

{DISABLED

|

SUPPORTED

| REQUIRED }

Klauzula ENCRYPTION opisana je u prethodnoj raspravi o elementima svojstvenima za Service Broker. ROLE

=

{

WITNESS

|

PARTNER

|

ALL }

Zadaje ulogu ili uloge dupliciranja baze podataka, a koje krajnja točka podržava u SQL Serverovom procesu dupliciranja. WITNESS

Krajnja točka obavlja ulogu svjedoka u procesu dupliciranja. PARTNER

Krajnja točka obavlja ulogu ortaka u procesu dupliciranja. ALL

Krajnja točka obavlja uloge i svjedoka i suradnika u procesu dupliciranja.

Mijenjanje krajnje točke Naredba ALTER ENDPOINT dozvoljava izmjenu postojeće krajnje točke – možete dodati metode krajnjoj točki, promijeniti ili ispustiti postojeće metode krajnje točke te promijeniti njena svojstva. U naredbi ALTER ENDPOINT navedite samo svojstva koja želite ažurirati – svojstva koja nisu navedena ostat će nepromijenjena. Krajnje točke mogu preinačiti članovi uloge sysadmin, vlasnik krajnje točke ili korisnici kojima je odobreno dopuštenje ALTER ANY ENDPOINT ili dopuštenje ALTER ON ENDPOINT

226 | Programiranje SQL Server 2005

za određenu krajnju točku. Naredba ALTER AUTHORIZATION mijenja vlasnika postojeće krajnje točke – ova naredba bit će raspravljena kasnije u ovom poglavlju. Većina klauzula i argumenata za naredbu ALTER ENDPOINT ista je kao i za naredbu CREATE ENDPOINT, opisanu u prethodnom odlomku. U ovom će odlomku biti opisani samo argumenti i klauzule koje se razlikuju. Sintaksa za naredbu ALTER ENDPOINT je: ALTER ENDPOINT KrajnjaTocˇka [ AFFINITY = { NONE | | ADMIN } ] [ STATE = { STARTED | STOPPED | DISABLED } ] AS { TCP | HTTP } ( ) FOR { SOAP | TSQL | SERVICE_BROKER | DATABASE_MIRRORING } ( )

gdje je: AFFINITY

Zadaje sklonost krajnje točke. STATE

Argument STATE isti je kao i u raspravi o naredbi CREATE ENDPOINT ranije u ovom poglavlju. Ako se stanje promijeni u DISABLED poslužitelj se mora ponovno pokrenuti kako bi promjena stupila na snagu.

Elementi svojstveni protokolu Sintaksa za elemente svojstvene HTTP protokolu je: ::= AS HTTP ( PATH = 'url', AUTHENTICATION = ( { BASIC | DIGEST | NTLM | KERBEROS | INTEGRATED } [ ,...n ] ), PORTS = ( { CLEAR | SSL } [ ,...n ] ) [ SITE = { '*' | '+' | 'webSite' } , ] [ , CLEAR_PORT = clearPort ] [ , SSL_PORT = SSLPort ] [ , AUTH_REALM = { 'realm' | NONE } ] [ , DEFAULT_LOGON_DOMAIN = { 'domain' | NONE } ] [ , RESTRICT_IP = { NONE | ALL } ] [ , COMPRESSION = { ENABLED | DISABLED } ] [ , ADD EXCEPT_IP = ( { | : } [ ,...n ] ) [ , DROP EXCEPT_IP = ( { | : } [ ,...n ] ) )

gdje: ADD EXCEPT_IP

Dodaje IP adrese IP adresama u parametru EXCEPT_IP za krajnju točku.

Poglavlje 8: Izvorne XML Web usluge | 227

Parametar RESTRICT_IP naveden u naredbi CREATE ENDPOINT kontrolira je li zahtjevima s ovih IP adresa dozvoljen ili uskraćen pristup krajnjoj točki. DROP EXCEPT_IP

Uklanja IP adrese iz popisa IP adresa u parametru EXCEPT_IP za krajnju točku. Parametar RESTRICT_IP naveden u naredbi CREATE ENDPOINT kontrolira je li zahtjevima s ovih IP adresa dozvoljen ili uskraćen pristup krajnjoj točki Sintaksa za elemente svojstvene TCP protokolu je: ::= AS TCP ( LISTENER_PORT = listenerPort [ , LISTENER_IP = ALL | ( | ) ] [ , RESTRICT_IP = ALL | NONE ] [ , EXCEPT_IP = ( { | : } [ ,...n ] ) ] )

Elementi svojstveni jeziku Sintaksa za elemente svojstvene SOAP jeziku je: ::= ( [ { ADD WEBMETHOD [ 'namespace' .] 'method_alias' ( NAME = 'database.owner.name' [ , SCHEMA = {NONE | STANDARD | DEFAULT } ] [ , FORMAT = { ALL_RESULTS | ROWSETS_ONLY } ] ) } [ ( [ [

[ ,...n ] ] { ALTER WEBMETHOD [ 'namespace' .] 'method_alias' NAME = 'database.owner.name' , SCHEMA = {NONE | STANDARD | DEFAULT} ] , FORMAT = { ALL_RESULTS | ROWSETS_ONLY } ]

) } [ ,...n] ] [ [ [ [ [ [ [ [ [ )

{ DROP WEBMETHOD [ 'namespace' .] 'method_alias' } [ ,...n ] ] BATCHES = { ENABLED | DISABLED } ] , WSDL = { NONE | DEFAULT | 'sp_name' } ] , SESSIONS = { ENABLED | DISABLED } ] , SESSION_TIMEOUT = int ] , DATABASE = { 'database_name' | DEFAULT } , NAMESPACE = { 'namespace' | DEFAULT } ] , SCHEMA = { NONE | STANDARD } ] , CHARACTER_SET = { SQL | XML } ]

228 | Programiranje SQL Server 2005

gdje: ADD WEBMETHOD

Dodaje metodu krajnjoj točki. ALTER WEBMETHOD

Mijenja definiciju postojeće metode na krajnjoj točki. DROP WEBMETHOD

Uklanja postojeću metodu iz krajnje točke. Sintaksa elemenata svojstvenih za Service Broker je: ::= FOR SERVICE_BROKER ( [ AUTHENTICATION = ENABLED | REQUIRED* | NONE ] [ , MESSAGE_FORWARDING = ENABLED | DISABLED* ] [ , MESSAGE_FORWARD_SIZE = forwardSize )

Sintaksa za elemente svojstvene dupliciranju baze podataka je: ::= FOR DATABASE_MIRRORING ( [ ENCRYPTION = ENABLED | DISABLED ] | ROLE = WITNESS | PARTNER | ALL )

Uklanjanje krajnje točke Naredba DROP ENDPOINT uklanja postojeću krajnju točku. Krajnje točke mogu ukloniti članovi uloge sysadmin, vlasnik krajnje točke ili korisnici kojima je odobreno dopuštenje CONTROL za krajnju točku. Sintaksa naredbe DROP ENDPOINT je: DROP ENDPOINT endPointName

gdje je: endPointName

Ime krajnje točke koju treba ukloniti.

Provjera identiteta krajnje točke Svaka krajnja točka konfigurirana je za tip provjere identiteta i dopuštenja pristupa koji korisnicima omogućuju povezivanje s krajnjom točkom. Korisnik mora biti provjereni Windows korisnik – ili pouzdani Windows korisnik ili korisnički račun na lokalnom računalu – kako bi pristupio krajnjoj točki. Anonimna provjera identiteta na krajnjoj točki nije podržana.

Poglavlje 8: Izvorne XML Web usluge | 229

Klauzula AUTHENTICATION u naredbama CREATE ENDPOINT i ALTER ENDPOINT zadaje način izvođenja provjere identiteta krajnje točke. Podržani su sljedeći tipovi provjere identiteta: BASIC HTTP 1.1 mehanizam provjere identiteta koji koristi zaglavlje provjere identiteta koje sadrži Base64 kodirano korisničko ime i lozinku odvojene dvotočkom (:). Vjerodajnice se moraju preslikati na valjani korisnički račun Windowsa. Kako Base64 kodiranje može lako biti dekodirano, SQL Server zahtijeva da se za HTTP vezu koristi Secure Sockets Layer (SSL) – BASIC provjera identiteta nije dozvoljena za krajnje točke gdje je PORTS postavljeno na CLEAR. DIGEST HTTP 1.1 mehanizam provjere identiteta koji se sastoji od korisničkog imena i lozinke raspršenih MD5 algoritmom. Poslužitelj ima pristup ili stvarnoj lozinki ili MD5 raspršenju lozinke, dopuštajući klijentu potvrđivanje lozinke bez slanja poslužitelju. Vjerodajnice se moraju preslikati na valjani korisnički račun Windows domene – lokalni korisnici nisu podržani za sažetu provjeru identiteta. NTLM Mehanizam provjere identiteta kojeg podržavaju Windows 9x i Windows NT 4.0. NTLM je šifrirani pitanje/odgovor protokol koji koristi ime domene, korisničko ime i jednosmjerno raspršenje lozinke. Iako je Microsoftov Kerberos izabrani protokol, NTLM je zadržan radi kompatibilnosti sa starijim inačicama. KERBEROS Standardni Internet mehanizam obostrane provjere identiteta između klijenta i poslužitelja namijenjen upotrebi preko otvorene ili neosigurane mreže. Klijenti pribavljaju priznanicu za provjeru identiteta (engl. authentication ticket) iz Kerberos Key Distribution Centera (KDC) te ju daju na uvid poslužiteljima kad se veza uspostavi. Kerberos podržava Security Support Provider Interface (SSPI) u Windowsima 2000 ili novijim. Kako biste koristili Kerberos provjeru identiteta, upotrebom alata SetSPN.exe morate registrirati ime principala usluge (engl. service principal name, SPN) s korisničkim računom SQL Servera na kojem se izvodi. Za više informacija, pogledajte Microsoft SQL Server Books Online. INTEGRATED Krajnja točka može odgovoriti na izazove tipova provjere identiteta ili Kerberos ili NTLM. Poslužitelj pokušava provjeriti identitet klijenta upotrebom tipa provjere koji klijent koristi u zahtjevu provjere identiteta. Izvorni HTTP SOAP može upotrijebiti ili korisničke i grupne račune Windowsa ili korisničke račune SQL Servera kao sigurnosne principale. To kontrolirate putem vrijednosti LOGIN_TYPE u argumentima svojstvenima SOAP jeziku za naredbe CREATE ENDPOINT ili ALTER ENDPOINT. 230 | Programiranje SQL Server 2005

Ako se koriste SQL korisnički računi aplikacija mora upotrijebiti WS-Security zaglavlja kako bi poslala vjerodajnice za prijavu korisničkog imena i lozinke poslužitelju radi provjere identiteta na SQL Serveru. WS-Security je skup SOAP proširenja otvorenog standarda koja služe za izgradnju sigurnih Web usluga i implementiranje integriteta i povjerljivosti sadržaja poruka. Za više informacija o WS-Security nabavite najnoviju shemu s Web stranice organizacije Organization for the Advancement of Structured Information Standards (OASIS) na adresi http://www.oasis-open.org.

Za upotrebu SQL Server provjere identiteta moraju biti ispunjeni sljedeći uvjeti: • Instalacija SQL Servera je miješanog tipa s podrškom za korisničke račune Windowsa i SQL-a. • Krajnja točka je konfigurirana s LOGIN_TYPE = MIXED i PORTS = (SSL). • Dopuštenja krajnje točke dodijeljena su odgovarajućim korisničkim računima SQL Servera. Opće WS-Security zaglavlje koje se može upotrijebiti u zaglavlju SOAP zahtjeva kako bi se prenijele SQL Server vjerodajnice za provjeru identiteta, jest: sqlLoginUserName sqlLoginPassword

Element sadrži ime a element lozinku za prijavu korisnika SQL Servera.

Upravljanje dopuštenjima na krajnjim točkama Dopuštenja krajnjih točki zadaju može li korisnički račun stvoriti, preinačiti, povezati ili prenijeti vlasništvo nad krajnjom točkom. Zahtjeve prema krajnjim točkama mogu izvesti članovi uloge sysadmin, vlasnik krajnje točke ili korisnici kojima je dano dopuštenje CONNECT na krajnjoj točki. Sve T-SQL naredbe koje upravljaju dopuštenjima moraju biti izvedene na bazi podataka master. Ovaj odlomak opisuje naredbe koji se koriste za upravljanje dopuštenjima glav-

nih točaka. Poglavlje 8: Izvorne XML Web usluge | 231

Prototipovi u pododlomcima koriste sljedeće argumente: server_principal Principal kojemu se dopuštenje odobrava, uskraćuje ili opoziva. server_principal jedan je od sljedećih: • Korisnički račun SQL Servera. • Korisnički račun SQL Servera izveden iz Windows korisničkog računa. • Korisnički račun SQL Servera preslikan na uvjerenje. • Korisnički račun SQL Servera preslikan na asimetrični ključ. endPointName Ime krajnje točke za koju je odobreno dopuštenje.

Dopuštenje izrade Dopuštenje na razini poslužitelja kontrolira može li korisnički račun izraditi objekt krajnje točke. Sintaksa je: { GRANT | DENY | REVOKE } CREATE ENDPOINT TO server_principal

Dopuštenje mijenjanja Dopuštenja za mijenjanje krajnje točke možete dodijeliti korisniku na tri različita načina: • Na razini poslužitelja. Dodjeljivanje ovog dopuštenja dozvoljava korisničkom računu mijenjanje ili ispuštanje bilo koje krajnje točke na poslužitelju: { GRANT | DENY | REVOKE } ALTER ANY ENDPOINT TO server_principal

• Za određenu krajnju točku. Dodjeljivanje ovog dopuštenja dozvoljava korisničkom računu mijenjanje ili ispuštanje određene krajnje točke na poslužitelju: { GRANT | DENY | REVOKE } ALTER ON ENDPOINT::endPointName TO server_principal

Dopuštenje kontrole Ovo dopuštenje dozvoljava principalu mijenjanje ili ispuštanje određene krajnje točke na poslužitelju i prijenos vlasništva: { GRANT | DENY | REVOKE } CONTROL ON ENDPOINT::endPointName TO server_principal

Dopuštenje veze Ovo dopuštenje kontrolira može li korisnički račun izvesti zahtjeve prema određenoj krajnjoj točki: { GRANT | DENY | REVOKE } CONNECT ON ENDPOINT::endPointName TO server_principal

232 | Programiranje SQL Server 2005

Dopuštenje preuzimanja vlasništva Ovo dopuštenje kontrolira može li korisnik naveden u klauzuli AUTHORIZATION naredbi CREATE ENDPOINT ili ALTER ENDPOINT preuzeti vlasništvo nad krajnjom točkom: { GRANT | DENY | REVOKE } TAKE OWNERSHIP ON ENDPOINT::endPointName TO server_principal

Metapodaci krajnje točke Na kataloške poglede opisane u tablici 8-1 možete postaviti upit o svim krajnjim točkama definiranim u sustavu. Tablica 8-1. Kataloški pogledi za informacije o krajnjim točkama Kataloški pogled

Opis

sys.database_mirroring_endpoints

Opće informacije o krajnjim točkama i detaljne informacije svojstvene dupliciranju baza podataka za svaku krajnju točku dupliciranja baze podataka u sustavu.

sys.endpoints

Opće informacije o svakoj HTTP krajnjoj točki u sustavu, uključujući ime, identifikator, identifikator principala, protokol, tip i informacije o stanju.

sys.endpoint_webmethods

Detaljne informacije o svakoj SOAP metodi definiranoj na HTTP krajnjoj točki kojoj je omogućen SOAP.

sys.http_endpoints

Opće informacije o krajnjim točkama te informacije svojstvene za HTTP, uključujući informacije o stranici i tipu provjere identiteta za krajnje točke u sustavu koje koriste HTTP.

sys.tcp_endpoints

Opće informacije o krajnjim točkama te informacije svojstvene za TCP za krajnje točke u sustavu koje koriste TCP.

sys.service_broker_endpoints

Opće informacije o krajnjim točkama te informacije svojstvene za Service Broker za svaku krajnu točku Service Brokera u sustavu.

sys.soap_endpoints

Opće informacije o krajnjim točkama te informacije svojstvene za SOAP za svaku krajnju točku u sustavu koja nosi SOAP sadržaj.

sys.via_endpoints

Opće informacije o krajnjim točkama te informacije svojstvene za Virtual Interface Adapter (VIA) za svaku VIA krajnju točku u sustavu.

Poglavlje 8: Izvorne XML Web usluge | 233

POGLAVLJE 9

SQL Server Management Objects (SMO)

SQL Server Management Objects (SMO) je kolekcija imenskih prostora uvedena u SQL Server 2005 za programiranje svih oblika upravljanja SQL Servera 2005. SMO je zamijenio SQL Server Distributed Management Objects (SQL-DMO). Osim proširivanja SQL-DMO funkcionalnosti, SMO je lakši za upotrebu. SMO dodaje funkcionalnost za podršku novih svojstava SQL Servera 2005 uz pružanje svih SQL-DMO funcionalnosti. SMO koristi SQL-DMO terminologiju gdje je to moguće kako bi se olakšao prijelaz. Međutim, neka svojstva DMO-a bila su premještena ili preimenovana tijekom prijenosa. Za više informacija, pogledajte Microsoft SQL Server Books Online, odlomak „SMO Mapping to DMO“. Ne postoji način za unaprjeđivanje SQL-DMO aplikacije u SMO aplikaciju – ona se mora ponovno napisati. SMO aplikacije mogu se povezivati i sa SMO i SQL-DMO unutar istog procesa. SMO je kompatibilan sa SQL Serverom 2000 i SQL Serverom 7.0. To omogućuje upotrebu SMO-a za upravljanje okolinama u kojima se nalaze različite inačice SQL Servera. SMO ne možete koristiti za upravljanje bazom podataka s razinom kompatibilnosti 60 (SQL Server 6.0) ili 65 (SQL Server 6.5). SMO upotrebljava pružatelj podataka SQL Servera (System.Data.SqlClient) za komunikaciju s instancama SQL Servera. SMO klijenti moraju imati instaliran SQL Server Native Client. SQL Server Native Client isporučuje se i sa SQL Serverom 2005 i s .NET Frameworkom 2.0, kao što je to detaljnije opisano u poglavlju 6. SMO klijenti zahtijevaju jedan od sljedećih operacijskih sustava: Windows NT 4.0 SP5 ili noviji, Windows 2000, Windows XP ili Windows Server 2003. SMO klijentima potreban je i MDAC 9.0 koji se isporučuje sa SQL Serverom 2005. SMO sklopovi automatski se instaliraju kao dio opcije Client Tools pri instaliranju SQL Servera 2005. Podrazumijevana instalacijska mapa je C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies. 234

Ovo će poglavlje predstaviti SMO, pružiti pregled SMO objektnog modela i demonstrirati jednostavan primjer SMO programiranja. Sljedeća četiri poglavlja detaljno će istražiti SMO programiranje: Poglavlje 10, SQL Server Management Objects (SMO) klase instance, 1. dio SMO sadrži hijerarhiju klasa koja se podudara s hijerarhijom baze podataka SQL Servera. Ovo poglavlje opisuje SMO klase koje se koriste za upravljanje objektima baze podataka za pohranu i pristup podacima, poput tablica, indeksa, okidača i pohranjenih procedura. Poglavlje također pokazuje kako programski upotrijebiti SMO klase za upravljanje ovim objektima. Pored toga, pokazuje i kako se pretplatiti na SMO događaje te obrađivati iznimke. Poglavlje 11, SQL Server Management Objects (SMO) klase instance, 2. dio SMO sadrži klase za upravljanje objektima baze podataka koji ne pohranjuju podatke niti im pristupaju, poput datoteka podataka i dnevnika događaja, korisničkih računa, korisnika, uloga te .NET sklopova. Ovo poglavlje opisuje kako programski upotrijebiti te klase. Poglavlje 12, SQL Server Management Objects (SMO) pomoćne klase SMO pomoćne klase koriste se za obavljanje zadataka neovisnih o instanci SQL Servera. Te klase uključuju klase za skriptiranje, izradu sigurnosnih kopija i njihovo obnavljanje, prijenos, poštu i praćenje. Ovo poglavlje prikazuje kako programski koristiti te klase. Poglavlje 13, Windows Management Instrumentation (WMI) programiranje WMI se može upotrijebiti za upravljanje uslugama SQL Servera, mrežnim postavkama i postavkama poslužiteljskih aliasa. Ovo poglavlje opisuje SMO klase za pristupanje WMI-ju te pokazuje kako ih programirati.

SMO objektni model SMO objektni model sadrži dva tipa klasa: Klase instance Formiraju hijerarhiju koja se podudara s hijerarhijom objekata poslužitelja baze podataka. Vrhovni objekt je instanca SQL Servera predstavljena Server objektom. Ispod njega nalazi se hijerarhija objekata instance, uključujući baze podataka, tablice, stupce, indekse i pohranjene procedure. Klase instance detaljno su objašnjene u poglavljima 10 i 11. Pomoćne klase Obavljaju specifične zadatke i neovisne su o instanci poslužitelja. Pomoćne klase detaljno su objašnjene u poglavljima 12 i 13. SMO sadrži zbirku imenskih prostora koji predstavljaju različita područja funkcionalnosti. Opisani su u tablici 9-1.

Poglavlje 9: SQL Server Management Objects (SMO) | 235

Tablica 9-1. SMO imenski prostori Imenski prostor

Opis

Microsoft.SqlServer.Management.Common

Klase zajedničke za SMO i Replication Management Objects (RMO) – primarno se koriste za uspostavljanje veze s instancom SQL Servera.

Microsoft.SqlServer.Management.Nmo

Klase koje se koriste za razvoj i upravljanje instancama i aplikacijama Notification Services.

Microsoft.SqlServer.Management.Smo

Klase instance, pomoćne klase, metode za obradu događaja, iznimke i enumeracije koje se koriste za programsko kontroliranje SQL Servera.

Microsoft.SqlServer.Management.Smo.Agent

Klase koje predstavljaju SQL Server Agent.

Microsoft.SqlServer.Management.Smo.Broker

Klase koje predstavljaju Service Broker.

Microsoft.SqlServer.Management.Smo.Mail

Klase koje predstavljaju Database Mail.

Microsoft.SqlServer.Management.Smo. RegisteredServers

Klase koje predstavljaju registrirane poslužitelje i sheme.

Microsoft.SqlServer.Management.Smo.Wmi

Klase koje pružaju programski pristup WMI pružatelju usluga za Configuration Management.

Microsoft.SqlServer.Management.Trace

Klase koje pružaju programski pristup za praćenje i zapisivanje događaja, manipuliranje i analiziranje dnevnika praćenja te ponovno izvođenje događaja praćenja.

Izrada SMO projekta u Visual Studiju .NET Ovaj primjer pokazuje kako izraditi jednostavnu C# SMO konzolnu aplikaciju u Visual Studiju 2005. Pratite sljedeće korake: 1. Odaberite File ➝ New ➝ Project iz glavnog izbornika Visual Studija 2005. 2. U dijaloškom okviru New Project odaberite Visual C# kao tip projekta te Console Application iz instaliranih predložaka. 3. Unesite ime za projekt i zadajte lokaciju na koju projekt treba spremiti. Pritisnite OK. 4. Desnom tipkom miša pritisnite References u prozoru Solution Explorera i s kontekstnog izbornika odaberite Add Reference. 5. U dijaloškom okviru Add Reference dodajte referencu na sklopove Microsoft. SqlServer.ConnectionInfo.dll i Microsoft.SqlServer.Smo.dll. 6. Pritisnite OK kako bi se zatvorio dijaloški okvir i dodale reference. 7. U prozoru Solution Explorera desnom tipkom miša pritisnite datoteku Program.cs i s kontekstnog izbornika odaberite View ➝ Code. 8. Izložite SMO tipove dodajući kodu sljedeće using direktive: using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Common;

Dodajte using direktive za sve druge tipove kojima je potreban pristup.

236 | Programiranje SQL Server 2005

Jednostavna SMO aplikacija Ovaj primjer prikazuje naziv proizvoda za lokalnu instancu SQL Servera i hardversku platformu za računalo na kojem se izvodi instanca SQL Servera. Potrebne su reference na sklopove Microsoft.SqlServer.ConnectionInfo.dll i Microsoft.SqlServer.Smo.dll kako biste preveli i izveli ovaj primjer. using System; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Console.WriteLine("Product: " + server.Information.Product); Console.WriteLine("Platform: " + server.Information.Platform); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Izlaz na konzoli izgleda otprilike kao na slici 9-1.

Slika 9-1. Izlaz na konzoli za jednostavnu SMO aplikaciju

Svojstvo Information klase Server vraća Information objekt koji kroz svoja svojstva izlaže informacije o instanci SQL Servera.

Poglavlje 9: SQL Server Management Objects (SMO) | 237

POGLAVLJE 10

SQL Server Management Objects (SMO) klase instance, 1. dio

SMO klase instance oblikuju hijerarhiju koja se podudara s hijerarhijom baze podataka poslužitelja. Vrhovni SMO objekti su u SQL Serveru predstavljeni objektom Server, ispod kojeg se nalazi hijerarhija objekata koja uključuje baze podataka, tablice, stupce, indekse i pohranjene procedure. Ovo poglavlje pruža pregled SMO klasa za administriranje objekata baze podataka koji se koriste za pohranu podataka. Nakon pregleda poglavlje pokazuje kako upotrijebiti ove klase programski, kako se pretplatiti na SMO događaje i kako obrađivati SMO iznimke. Poglavlje završava referencom na sve SMO klase koje se koriste za programsko administriranje objekata za pohranu podataka. Poglavlje 11 obrađuje SMO klase za administriranje objekata baze podataka koji se ne koriste za pohranu podataka.

Programiranje SMO klasa instance za administriranje objekata za pohranu podataka Smatra se da sljedeći SQL Server objekti pohranjuju podatke. Upotrebljavaju se za identificiranje SMO klasa instance koje administriraju objekte za pohranu podataka. • Instance SQL Servera • Baze podataka • Sheme • Tablice • Pogledi • Stupci • Indeksi • Vanjski ključevi • Ograničenja • Pravila 238

• Pohranjene procedure, produžene pohranjene procedure i numerirane pohranjene procedure • DML i DDL okidači • Korisnički definirane agregatne funkcije, korisnički definirane funkcije i korisnički definirani tipovi podataka • Tipovi podataka • Sistemski tipovi podataka Slika 10-1 prikazuje relaciju između SMO klasa instance koje se upotrebljavaju za administriranje prethodnog popisa objekata SQL Servera. Referenca na ove klase navedena je u odjeljku „Referenca na SMO klase instance za administriranje objekata za pohranu podataka“, kasnije u ovom poglavlju. Sljedeći odjeljci pokazuju kako programski upotrijebiti SMO klase instance za pohranu podataka. Svi primjeri u ovom odlomku izrađeni su upotrebom Visual Studija 2005. Potrebna vam je referenca na sljedeće sklopove da biste mogli prevesti i pokrenuti primjere: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.Smo Dodatne reference na sklopove bit će navedene po potrebi.

Uspostavljanje i prekidanje veze sa SQL Serverom Ovaj primjer demonstrira kako instancirati SMO klase instance te iterirati kroz kolekciju. Primjer se povezuje s instancom lokalnog SQL Servera, daje popis baza podataka na instanci i prekida vezu s instancom: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server(

);

DatabaseCollection dbs = server.Databases; foreach (Database db in dbs) Console.WriteLine(db.Name); server.ConnectionContext.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 239

NumberedStored ProcedureParameter NumberedStored Procedure

DataType

UserDefined AggregateParameter

Column

Trigger ForeignKey

Index

Check

UserDefined FunctionParameter

StoredProcedure Parameter

ExtendedStore Procedure StoredProcedure Rule UserDefined Aggregate View Scema

UserDefinedType

Table

UserDefinedFunction

DatabaseDidTrigger Database UserDefined DataType

ServerDidTrigger Server SystemDefined DataType

Slika 10-1. SMO klase instance za hijerarhiju pohrane podataka

Rezultati su prikazani na slici 10-2. Klasa Server je klasa najviše razine u SMO hijerarhiji, a predstavlja instancu SQL Servera. Instanca Server upotrebljava se za pristupanje kolekciji Database objekata u objektu DatabaseCollection te enumeriranje imena baza podataka na poslužitelju.

240 | Programiranje SQL Server 2005

SMO klase koje se koriste za upravljanje bazama podataka SQL Servera opisane su kasnije u poglavlju, u odlomku „Referenca na SMO klase instance za administriranje objekata za pohranu podataka“.

Slika 10-2. Rezultati primjera popisivanja baza podataka poslužitelja

Objekt ServerConnection (predstavljen svojstvom Server.ConnectionContext) sadrži informacije potrebne za povezivanje i prekidanje veze s instancom SQL Servera. Možete ponovno upotrijebiti objekt ServerConnection, što je od pomoći ako su informacije o vezi koje on sadrži opsežne. Ne morate pozivati metodu Connect() na objekt ServerConnection. SMO će prema potrebi automatski otvoriti i zatvoriti vezu s poslužiteljem. Metoda Disconnect() klase ServerConnection eksplicitno prekida vezu, umjesto da jednostavno dopusti da se prekine automatski kad veza izađe iz dosega. Konstruktor objekta Server ima tri preopterećenja. Podrazumijevani konstruktor (upotrijebljen u prethodnom primjeru) automatski pokušava uspostaviti vezu s podrazumijevanom instancom SQL Servera s podrazumijevanim postavkama veze. Drugo preopterećenje navodi ime instance SQL Servera kao argument konstruktora, kao što je prikazano u sljedećem primjeru: Server server = new Server("localhost");

Treće preopterećenje stvara Server objekt upotrebom objekta ServerConnection, kao što je pokazano u sljedećem primjeru: ServerConnection sc = new ServerConnection( sc.ServerInstance = "localhost"; Server server = new Server(sc);

);

Kretanje kroz hijerarhiju poslužitelja Ovaj primjer iterira kroz sve baze podataka na lokalnoj instanci SQL Servera, dajući popis tablica i stupaca iz svake od njih: using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo;

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 241

class Program { static void Main(string[] args) { Server server = new Server("localhost"); foreach (Database db in server.Databases) { Console.WriteLine("DATABASE: " + db.Name); foreach (Table t in db.Tables) { Console.WriteLine(" TABLE: " + t.Name); Console.WriteLine(" COLUMNS:"); foreach (Column c in t.Columns) Console.WriteLine(" " + c.Name); } Console.WriteLine( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Djelomični rezultati prikazani su na slici 10-3.

Slika 10-3. Djelomični rezultati primjera kretanja kroz hijerarhiju poslužitelja

Objekt Database izlaže kolekciju Table objekata koji predstavljaju tablice u bazi podataka. Svaki Table objekt nadalje izlaže kolekciju Column objekata koji predstavljaju stupce u tablici. Pristupanje drugim kolekcijama objekata za pohranu podataka slično je pristupanju kolekcijama Table i Column. Slika 10-1, ranije u poglavlju, prikazuje

242 | Programiranje SQL Server 2005

hijerarhiju klasa, što će vam pomoći da razumijete relacije među klasama, a odlomak „Referenca na SMO klase instance za administriranje objekata za pohranu podataka“, kasnije u ovom poglavlju, pruža podrobnije informacije.

Enumeriranje svojstava baze podataka Ovaj primjer enumerira svojstva baze podataka AdventureWorks na lokalnoj instanci SQL Servera upotrebom kolekcije Database.Properties: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); DatabaseCollection dbs = server.Databases; Database db = dbs["AdventureWorks"]; foreach (Property p in db.Properties) Console.WriteLine(p.Name + ": " + p.Value); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 10-4.

Enumeriranje objekata baze podataka Ovaj primjer enumerira sve objekte u bazi podataka AdventureWorks: using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; using (DataTable dt = db.EnumObjects( { foreach (DataRow row in dt.Rows)

))

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 243

Slika 10-4. Rezultati primjera enumeriranja svojstava baze podataka { for (int i = 0; i < dt.Columns.Count; i++) Console.WriteLine(dt.Columns[i].ColumnName + ": " + row[i]); Console.WriteLine( ); } } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

244 | Programiranje SQL Server 2005

Djelomični rezultati prikazani su na slici 10-5.

Slika 10-5. Rezultati primjera enumeriranja baze podataka

Metoda EnumObjects() klase Database vraća DataTable sa stupcima opisanim u tablici 10-1. Tablica 10-1. DataTable stupci koje vraća Database.EnumObjects() Stupac

Opis

DatabaseObjectsTypes

Vrijednost iz enumeracije DatabaseObjectTypes koja identificira tip objekta.

Schema

Shema kojoj pripadaju objekti baze podataka.

Name

Ime objekta baze podataka.

Urn

Uniform Resource Name (URN) za objekt baze podataka.

Metoda EnumObjects ima tri preopterećenja. Pored inačice bez argumenata koju ste upravo vidjeli, postoje dvije koje vam omogućuju zadati tip objekta za enumeriranje kao vrijednost iz enumeracije DatabaseObjectTypes. Prototipovi za metode EnumObjects() su sljedeći: Database.EnumObjects( ) Database.EnumObjects(DatabaseObjectTypes) Database.EnumObjects(DatabaseObjectTypes, SortOrder)

gdje je: DatabaseObjectTypes

Enumeracija tipova objekata baze podataka – na primjer, All, DatabaseRole, Schema, Table i View. Ako nije zadano, podrazumijeva se All. Za cjelovit popis pogledajte Microsoft SQL Server 2005 Books Online. Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 245

SortOrder

Enumeracija naredbi za sortiranje – Name, Schema, Type i Urn. Na primjer, sljedeći red koda vraća informacije o tablicama u bazi podataka: db.EnumObjects(DatabaseObjectTypes.Table)

Vrijednosti enumeracije DatabaseObjectTypes mogu se obraditi logičkom operacijom OR kako bi se vratila tablica koja sadrži višestruke tipove objekata.

Izrada objekta baze podataka Ovaj primjer demonstrira kako izraditi nove SMO objekte instance. On stvara tablicu pod imenom SmoTestTable u bazi podataka ProgrammingSqlServer2005. Tablica sadrži dva stupca, s indeksom primarnog ključa na prvom. Trebate dodati referencu na Microsoft.SqlServer.SqlEnum kako biste preveli i izveli ovaj primjer. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["ProgrammingSqlServer2005"]; // Stvara tablicu Table t = new Table(db, "SmoTestTable"); DataType dt = new DataType(SqlDataType.Int); Column c = new Column(t, "ID", dt); c.Nullable = false; t.Columns.Add(c); dt = new DataType(SqlDataType.VarChar, 100); c = new Column(t, "Name", dt); t.Columns.Add(c); t.Create(

);

// Stvara indeks primarnog ključa na tablici Index i = new Index(t, "PK"); IndexedColumn ic = new IndexedColumn(i, "ID"); i.IndexedColumns.Add(ic); i.IndexKeyType = IndexKeyType.DriPrimaryKey; i.Create( );

246 | Programiranje SQL Server 2005

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Postupak izrade SMO objekata instance u pravilu slijedi predložak iz ovog primjera: 1. Instanciranje SMO objekta instance. 2. Postavljanje obaveznih svojstava objekta. 3. Pozivanje metode Create() tog objekta. U ovom primjeru nova je tablica stvorena instanciranjem objekta Table kojem je proslijeđen argument za bazu podataka u kojoj je stvorena tablica te ime tablice. Stupci su dodani tablici instanciranjem objekta Column, prosljeđivanjem argumenta za tablicu kojoj dodajete stupce, imena stupca te tipa podataka kao DataType instance. Konačno, tablica se stvara u bazi podataka pozivanjem metode Create() objekta Table. Indeks primarnog ključa stvoren je instanciranjem objekta Index, prosljeđivanjem argumenta za tablicu u kojoj se indeks stvara te imena indeksa. Stupac se dodaje kao dio indeksa instanciranjem objekta IndexColumn, prosljeđivanjem argumenta za indeks kojem se dodaje te imena stupca. Zatim, se zadaje tip željenog indeksa postavljanjem svojstva IndexKeyType na vrijednost iz enumeracije IndexKeyType – DriPrimaryKey, DriUniqueKey ili None. Konačno, stvara se indeks pozivanjem metode Create() objekta Index. Metoda Alter() SMO objekata instance upotrebljava se za ažuriranje svojstava objekta novim vrijednostima. Metoda Drop() SMO objekata instance upotrebljava se za uklanjanje objekta.

Provjeravanje integriteta tablice baze podataka Ovaj primjer provjerava integritet svih tablica i njihovih indeksa u AdventureWorks te ispisuje pogreške (ako ih ima) na konzolu: using System; using System.Collections.Specialized; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); DatabaseCollection dbs = server.Databases; Database db = dbs["AdventureWorks"];

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 247

StringCollection sc = db.CheckTables(RepairType.None); foreach (object o in sc) Console.WriteLine("{0}", o); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Ovaj primjer ne daje izlaz, osim ako ga pokrenete na oštećenoj bazu podataka, a u tom će slučaju izlaz na konzoli biti poruke o pogreškama. Metoda CheckTables() klase Database provjerava stranice baze podataka koje implementiraju pohranu za sve tablice i indekse definirane u tablici. Metoda CheckTables() prima samo jedan argument – vrijednost iz enumeracije RepairType, opisane u tablici 10-2. Tablica 10-2. Enumeracija RepairType Vrijednost

Opis

AllowDataLoss

Pokušava popraviti sve stranice podataka, čak i ako se podaci izgube.

Fast

Popravlja stranice podataka u brzom načinu rada. Ova opcija postoji zbog kompatibilnosti sa starijim inačicama.

None

Ne popravlja stranice podataka.

Rebuild

Popravlja stranice podataka tako što ih ponovno stvara.

Metoda CheckTables() implementira se upotrebom T-SQL naredbe DBCC CHECKDB. StringCollection koju vrati metoda jest kolekcija poruka o pogreškama koje vraća DBCC CHECKDB. Baza podataka mora biti u jednokorisničkom režimu rada kako bi se mogla upotrijebiti jedna od tri opcije za popravak (različite od None).

Izvršavanje SMO operacija SMO naredbe mogu biti umotane u transakcije kako bi višestruke naredbe uspjele ili zakazale kao grupa. Ovaj primjer izvodi skup SMO naredbi koji stvara tablicu pod imenom SmoTestTable u bazi podataka ProgrammingSqlServer2005. Ako korisnik unese Y u odzivnik, transakcija se obavlja, a tablica stvara. U suprotnom, transakcija se vraća na početak. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args)

248 | Programiranje SQL Server 2005

{ Server server = new Server("localhost"); server.ConnectionContext.BeginTransaction(

);

Database db = server.Databases["ProgrammingSqlServer2005"]; // Stvara tablicu Table t = new Table(db, "SmoTestTable2"); DataType dt = new DataType(SqlDataType.Int); Column c = new Column(t, "ID", dt); c.Nullable = false; t.Columns.Add(c); dt = new DataType(SqlDataType.VarChar, 100); c = new Column(t, "Name", dt); t.Columns.Add(c); t.Create(

);

Console.WriteLine("Commit new table (Y/N)?"); ConsoleKeyInfo cki = Console.ReadKey( ); if ((char)cki.Key == 'Y') { server.ConnectionContext.CommitTransaction( ); Console.WriteLine(Environment.NewLine + "Table created."); } else { server.ConnectionContext.RollBackTransaction( ); Console.WriteLine(Environment.NewLine + "Table not created."); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Klasa Server izlaže objekt ServerConnection kroz svojstvo ConnectionContext. Objekt ServerConnection dozvoljava programsko ispitivanje veze s instancom SQL Servera i rad s njom. ServerConnection pruža i podršku za transakcije kroz metode BeginTransaction(), CommitTransaction() i RollbackTransaction().

Režim presretanja SMO aplikacije mogu presresti i snimiti T-SQL naredbe ekvivalentne operacijama koje izvode SMO naredbe. Ovaj primjer presreće T-SQL naredbe koje programski generira SMO te ih izlaže u prozoru konzole: using System; using System.Data;

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 249

using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); server.ConnectionContext.SqlExecutionModes = SqlExecutionModes.CaptureSql; server.ConnectionContext.Connect( ); Database db = server.Databases["ProgrammingSqlServer2005"]; // Stvara tablicu Table t = new Table(db, "SmoTestTable"); DataType dt = new DataType(SqlDataType.Int); Column c = new Column(t, "ID", dt); c.Nullable = false; t.Columns.Add(c); dt = new DataType(SqlDataType.VarChar, 100); c = new Column(t, "Name", dt); t.Columns.Add(c); t.Create(

);

// Stvara indeks primarnog ključa na tablici Index i = new Index(t, "PK"); IndexedColumn ic = new IndexedColumn(i, "ID"); i.IndexedColumns.Add(ic); i.IndexKeyType = IndexKeyType.DriPrimaryKey; i.Create( ); // Prikazuje uhvaćeni T-SQL foreach (string s in server.ConnectionContext.CapturedSql.Text) Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 10-6. Ovaj primjer koristi isti kod za stvaranje tablice kao i u primjeru iz odlomka „Izrada objekta baze podataka“. Generirani T-SQL kod presretnut je i izložen. On nije poslan poslužitelju i nije izveden. Svojstvo SqlExecutionModes, Server objekta ConnectionContext kontrolira režim rada. Ono uzima vrijednost iz enumeracije SqlExecutionModes koja određuje da li se kod izvodi (ExecuteSql), presreće (CaptureSql) ili oboje (ExecuteAndCaptureSql).

250 | Programiranje SQL Server 2005

Slika 10-6. Rezultai primjera za presretnuti T-SQL

Presretnuti SQL upisuje se u objekt CapturedSql (izložen kao svojstvo ConnectionContext objekta Server), a pristupa mu se kroz svojstvo CapturedSql.Text koje ga izlaže kao objekt StringCollection.

Obavještavanje o događajima Događaji omogućuju da nadzirete SQL Server Database Engine. Nadziranje događaja može se postaviti za sljedeće SMO klase instance, od kojih neke neće biti opisane sve do poglavlja 11: Poslužitelj Baza podataka Shema Tablica Pogled Indeks Pohranjena procedura DML i DDL okidači Korisnički definirane funkcije Korisnički definirani tipovi Sinonimi Korisnički računi Korisnici SQL sklopovi Aplikacijske uloge Certifikati Funkcije i sheme particija Pretplaćivanje na događaje za različite SMO klase instance slijedi sličan predložak: 1. Instancirajte objekt skupa događaja. 2. Ovom skupu događaja dodajte događaje za koje želite obavijest. Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 251

3. Instancirajte delegat za obradu događaja i napišite metodu koja će obrađivati događaje. 4. Pozovite metodu SubscribeToEvents() kako bi zadala događaje koje ćete dobiti sa skupom događaja iz prvog koraka. 5. Pozovite metodu StartEvents() kako biste počeli primati događaje. 6. Pozovite metodu StopEvents() kako biste prestali primati događaje. Pozovite metodu UnsubscribeFromEvents() ili UnsubscribeAllEvents() kako biste izbrisali neke ili sve postavke događaja i uklonili neku ili sve metode za obradu događaja. Ovaj primjer pokazuje kako konfigurirati metodu za obradu događaja baze podataka i na nju se pretplatiti. Trebate dodati referencu na Microsoft.SqlServer.SqlEnum kako biste preveli i izveli ovaj primjer. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server( ); Database db = server.Databases["ProgrammingSqlServer2005"]; DatabaseEventSet des = new DatabaseEventSet( ); des.CreateTable = true; des.DropTable = true; ServerEventHandler seh = new ServerEventHandler(OnDatabaseEvent); db.Events.SubscribeToEvents(des, seh); db.Events.StartEvents(

);

// Stvara tablicu s jednim stupcem Table t = new Table(db, "SmoTestTable3"); DataType dt = new DataType(SqlDataType.Int); Column c = new Column(t, "ID", dt); c.Nullable = false; t.Columns.Add(c); t.Create(

);

// Uklanja tablicu t.Drop( ); db.Events.StopEvents(

);

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( );

252 | Programiranje SQL Server 2005

} protected static void OnDatabaseEvent(object sender, ServerEventArgs e) { if (e.EventType.ToString( ) == "CreateTable") Console.WriteLine("A table named " + e.Properties["ObjectName"].Value + " was created."); else if (e.EventType.ToString( ) == "DropTable") Console.WriteLine("A table named " + e.Properties["ObjectName"].Value + " was dropped."); } }

Rezultati su prikazani na slici 10-7.

Slika 10-7. Rezultati primjera događaja baze podataka

Metoda SubscribeToEvents() objekta DatabaseEvents (izloženog kroz svojstvo Events klase Database) uzima dva argumenta – objekt DatabaseEventSet koji zadaje koje događaje treba nadzirati i delegat ServerEventHandler koji obrađuje događaje baze podataka metodom OnDatabaseEvent(). Alternativno, objekt DatabaseEventSet može biti stvoren od zbroja odgovarajućih svojstava u klasi DatabaseEvent, kao što je prikazano u sljedećem kodu: DatabaseEventSet des = DatabaseEvent.CreateTable + DatabaseEvent.DropTable;

Obrada iznimaka Ovaj primjer pokazuje kako uhvatiti i obraditi SMO iznimku. Iznimka je izbačena kad se pokuša stvoriti baza podataka AdventureWorks, koja već postoji. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = new Database(server, "AdventureWorks"); try

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 253

{ db.Create( ); Console.WriteLine(Environment.NewLine + "Database created. Press any key to continue."); } catch (SmoException ex) { Console.WriteLine(ex.SmoExceptionType.ToString( )); Console.WriteLine(ex.Message); if (ex.InnerException != null) Console.WriteLine(ex.InnerException.Message); Console.WriteLine(Environment.NewLine + "Press any key to continue."); } Console.ReadKey(

);

} }

Rezultati su prikazani na slici 10-8.

Slika 10-8. Rezultati primjera obrade iznimke baze podataka

Klasa SmoException u imenskom prostoru Microsoft.SqlServer.Management.Smo predstavlja iznimku izazvanu tijekom SMO operacije. Klasa SmoException nasljeđuje od klase Exception te ima dodatna javna svojstva, popisana u tablici 10-3. Tablica 10-3. Dodatna javna svojstva klase SmoException Svojstvo

Opis

HelpLink

Hiperveza za dodatne informacije od Microsofta u vezi SMO iznimke.

ProductName

Ime proizvoda koji je izazvao SMO iznimku.

SmoExceptionType

Tip SMO iznimke. Ovo je vrijednost iz enumeracije SmoExceptionType.

Vrijednosti enumeracije SmoExceptionType opisane su u tablici 10-4. Tablica 10-4. Enumeracija SmoExceptionType Vrijednost

Opis

CollectionNotAvailableException

Pokušaj dobivanja kolekcije koja nije raspoloživa.

FailedOperationException

Operacija nije uspjela.

254 | Programiranje SQL Server 2005

Tablica 10-4. Enumeracija SmoExceptionType (nastavak) Vrijednost

Opis

InternalEnumeratorException

Pogreška se pojavila tijekom operacije enumeriranja.

InternalSmoErrorException

Pojavila se interna SMO pogreška.

InvalidConfigurationFileEnumeratorException

Nailazak na neispravnu konfiguracijsku datoteku.

InvalidPropertyUsageEnumeratorException

Svojstvu objekta pristupilo se na neispravan način.

InvalidQueryExpressionEnumeratorException

Nailazak na neispravan izraz upita.

InvalidSmoOperationException

Pozvana je neispravna SMO operacija.

InvalidVersionEnumeratorException

Inačica nije važeća.

InvalidVersionSmoOperationException

Pozvana je neispravna inačica SMO operacije.

MissingObjectException

Nedostaje objekt.

PropertyCannotBeRetrievedException

Svojstvo ne može biti dobiveno.

PropertyNotSetException

Vrijednost svojstva nije bila postavljena, a zahtijevano je da bude.

PropertyReadOnlyException

Pokušaj postavljanja svojstva koje je samo za čitanje.

PropertyTypeMismatchException

Pokušaj postavljanja svojstva s vrijednošću koja ima netočan tip podataka.

PropertyWriteException

Pogreška se pojavljuje pri pokušaju ažuriranja vrijednosti svojstva.

ServiceRequestException

Pogreška se pojavljuje tijekom zahtjeva usluge.

SmoException

Pojavljuje se SMO iznimka.

UnknownPropertyEnumeratorException

Nailazak na nepoznati enumerator svojstava.

UnknownPropertyException

Zahtijeva se nepoznato svojstvo.

UnknownTypeEnumeratorException

Nailazak na nepoznati enumerator tipova.

UnsupportedFeatureException

Zahtijeva se nepodržano svojstvo.

UnsupportedObjectNameException

Ime objekta nije podržano.

UnsupportedVersionException

Nailazak na nepodržanu inačicu SQL Servera.

WrongPropertyValueException

Svojstvu je dodijeljena netočna vrijednost.

Klase iznimaka izvedene iz klase SmoException imaju ista imena kao i SMO tipovi iznimaka popisani u tablici 10-4. Na primjer, postoji klasa CollectionNotAvailableException, izvedena iz klase SmoException.

Referenca na SMO klase instance za administriranje objekata za pohranu podataka Ovaj odlomak opisuje SMO klase koje se upotrebljavaju za administriranje objekata SQL Servera koji pohranjuju podatke. Klase su svrstane u funkcionalne grupe. Hijerarhijski dijagram tih klasa prikazan je na slici 10-1, ranije u ovom poglavlju.

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 255

Instance SQL Servera SMO klase koje se upotrebljavaju za rad s instancama SQL Servera opisane su u tablici 10-5. Tablica 10-5. SMO klase za rad s instancom SQL Servera Klasa

Opis

Information

Predstavlja nekonfigurabilne informacije o instanci SQL Servera. Svojstvo Information klase Server vraća Information objekt za instancu SQL Servera.

Server

Predstavlja instancu SQL Servera.

ServerActiveDirectory

Predstavlja postavke za instancu SQL Servera u aktivnom imeniku. Svojstvo ActiveDirectory klase Server vraća ServerActiveDirectory objekt za instancu SQL Servera.

ServerEvent

Predstavlja događaj SQL Servera koji može biti uključen u objekt ServerEventSet.

ServerEventArgs

Predstavlja argumente koji služe za izvještanje o događaju Servera.

ServerEvents

Predstavlja postavke potrebne za obavijest o događaju SQL Servera. Objekt ServerEvents dobiven je upotrebom svojstva Events objekta Server te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase ServerEvents navodi koje događaje primiti kao ServerEventSet ili kao ServerTraceEventSet objekt.

ServerEventSet

Predstavlja skup događaja SQL Servera kao ServerEvent objekte.

ServiceMasterKey

Predstavlja glavni ključ za instancu SQL Servera. Svojstvo ServiceMasterKey klase Server vraća ServiceMasterKey objekt za instancu SQL Servera.

ServerProxyAccount

Predstavlja posrednički račun SQL Servera dozvoljavajući personificiranje za izvedbu poslovnog koraka. Svojstvo ProxyAccount klase Server vraća ServerProxyAccount objekt za instancu SQL Servera.

ServerTraceEvent

Predstavlja događaj praćenja SQL Servera. Klasa ServerTraceEvent sadrži svojstvo za svaki događaj praćenja na koji poslužitelj može odgovoriti.

ServerTraceEventSet

Predstavlja skup događaja praćenja SQL Servera.

Settings

Predstavlja svojstva instance SQL Servera koja se mogu konfigurirati. Svojstvo Settings klase Server vraća Settings objekt za instancu SQL Servera.

Baze podataka SMO klase koje se upotrebljavaju za rad s bazama podataka SQL Servera opisane su u tablici 10-6. Tablica 10-6. SMO klase za rad s bazama podataka Klasa

Opis

Database

Predstavlja bazu podataka SQL Servera.

DatabaseActiveDirectory

Predstavlja svojstva za bazu podataka u aktivnom imeniku. Svojstvo ActiveDirectory klase Database vraća DatabaseActiveDirectory objekt za bazu podataka.

256 | Programiranje SQL Server 2005

Tablica 10-6. SMO klase za rad s bazama podataka (nastavak) Klasa

Opis

DatabaseCollection

Predstavlja kolekciju baza podataka kao Database objekte. Svojstvo Databases klase Server vraća baze podataka definirane na instanci SQL Servera.

DatabaseEvent

Predstavlja događaj baze podataka SQL Servera koji može biti uključen u objekt DatabaseEventSet.

DatabaseEventArgs

Predstavlja argumente koji služe za izvještanje o događaju baze podataka.

DatabaseEvents

Predstavlja postavke potrebne za obavijest o događajima baze podataka SQL Servera. Objekt DatabaseEvents dobiven je upotrebom svojstva Events objekta Database te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase DatabaseEvents navodi koje događaje primiti kao DatabaseEventSet objekt.

DatabaseEventSet

Predstavlja skup događaja baze podataka SQL Servera kao DatabaseEvent objekt.

DatabaseOptions

Predstavlja opcije baze podataka SQL Servera. Svojstvo DatabaseOptions klase Database vraća DatabaseOptions objekt za bazu podataka.

MasterKey

Predstavlja glavni ključ baze podataka koji se koristi za simetrično šifriranje i dešifriranje privatnog ključa certifikata. Svojstvo MasterKey klase Database vraća MasterKey objekt za bazu podataka.

Tablice SMO klase koje se upotrebljavaju za rad s tablicama SQL Servera opisane su u tablici 10-7. Tablica 10-7. SMO klase za rad s tablicama Klasa

Opis

Table

Predstavlja tablicu.

TableCollection

Predstavlja kolekciju tablica kao Table objekte. Svojstvo Tables klase Database vraća tablice definirane u bazi podataka.

TableEvent

Predstavlja događaj tablice SQL Servera koji može biti uključen u objekt TableEventSet.

TableEvents

Predstavlja postavke potrebne za obavijest o događajima tablice SQL Servera. Objekt TableEvents dobiven je upotrebom svojstva Events objekta Table te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase TableEvents navodi koje događaje primiti kao TableEventSet objekt.

TableEventSet

Predstavlja skup događaja tablice SQL Servera kao TableEvent objekte.

Stupci SMO klase koje se upotrebljavaju za rad sa stupcima SQL Servera opisane su u tablici 10-8.

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 257

Tablica 10-8. SMO klase za rad sa stupcima Klasa

Opis

Column

Predstavlja stupac.

ColumnCollection

Predstavlja kolekciju stupaca kao Column objekte. Svojstvo Columns klase Table vraća kolekciju stupaca u tablici. Svojstvo Columns klase View vraća kolekciju stupaca u pogledu.

DefaultConstraint

Predstavlja podrazumijevano ograničenje na stupcu. Podrazumijevano ograničenje zadaje vrijednost koju treba upotrijebiti za stupac ako vrijednost nije zadana kod dodavanja reda. Objektu DefaultConstraint pristupa se kroz svojstvo DefaultConstraint klase Column.

Pogledi SMO klase koje se upotrebljavaju za rad s pogledima SQL Servera opisane su u tablici 10-9. Tablica 10-9. SMO klase za rad s pogledima Klasa

Opis

View

Predstavlja pogled.

ViewCollection

Predstavlja kolekciju pogleda koji su definirani na tablici kao View objekti. Svojstvo View klase Database vraća poglede definirane u bazi podataka.

ViewEvent

Predstavlja događaj pogleda SQL Servera koji može biti uključen u objekt ViewEventSet.

ViewEvents

Predstavlja postavke potrebne za obavijest o događajima pogleda SQL Servera. Objekt ViewEvents dobiven je upotrebom svojstva Events objekta View te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase ViewEvents navodi koje događaje primiti kao ViewEventSet objekt.

ViewEventSet

Predstavlja skup događaja SQL Server pogleda kao ViewEvent objekte.

Indeksi SMO klase koje se upotrebljavaju za rad s indeksima SQL Servera opisane su u tablici 10-10. Tablica 10-10. SMO klase za rad s indeksima Klasa

Opis

Index

Predstavlja indeks.

IndexCollection

Predstavlja kolekciju indeksa kao Index objekte. Svojstvo Indexes klase Table vraća kolekciju indeksa definiranih na tablici. Svojstvo Indexes klase View vraća kolekciju indeksa definiranih na pogledu. Svojstvo Indexes klase UserDefinedFunction vraća kolekciju indeksa definiranih na korisnički definiranoj funkciji.

258 | Programiranje SQL Server 2005

Tablica 10-10. SMO klase za rad s indeksima (nastavak) Klasa

Opis

IndexedColumn

Predstavlja stupac u indeksu.

IndexedColumnCollection

Predstavlja kolekciju stupaca indeksa kao IndexColumn objekte. Svojstvo IndexColumns klase Index vraća kolekciju stupaca u indeksu.

IndexEvents

Predstavlja postavke potrebne za obavijest o događajima indeksa SQL Servera. Objekt IndexEvents dobiven je upotrebom svojstva Events objekta Index te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase IndexEvents navodi koje događaje primiti kao ObjectEventSet objekt.

Vanjski ključevi Ograničenje vanjskog ključa je stupac ili kombinacija stupaca koji se upotrebljavaju za forsiranje veze između dviju tablica. Stupac ili stupci koji čine primarni ključ u jednoj tablici referencirani su stupcem ili stupcima u drugoj tablici. Stupac ili stupci u drugoj tablici tvore vanjski ključ. SMO klase koje se upotrebljavaju za upravljanje ograničenjima vanjskog ključa SQL Servera opisane su u tablici 10-11. Tablica 10-11. SMO klase za rad s vanjskim ključevima Klasa

Opis

ForeignKey

Predstavlja vanjski ključ.

ForeignKeyCollection

Predstavlja kolekciju vanjskih ključeva kao ForeignKey objekte. Svojstvo ForeignKeys klase Table vraća kolekciju vanjskih ključeva definiranih na tablici.

ForeignKeyColumn

Predstavlja stupac u vanjskom ključu.

ForeignKeyColumnCollection

Predstavlja kolekciju stupaca vanjskog ključa kao ForeignKeyColumn objekte. Svojstvo Columns klase ForeignKey vraća kolekciju stupaca u vanjskom ključu.

Ograničenja Ograničenja ograničavaju vrijednosti koje mogu biti pohranjene u stupac, temeljeći se na logičkom izrazu koji vraća true ili false. Jedan stupac može imati višestruka ograničenja, a jedno ograničenje može se primijeniti na više stupaca. SMO klase koje se upotrebljavaju za upravljanje ograničenjima SQL Servera opisane su u tablici 10-12.

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 259

Tablica 10-12. SMO klase za upravljanje ograničenjima Klasa

Opis

Check

Predstavlja ograničenje.

CheckCollection

Predstavlja kolekciju ograničenja kao Check objekte. Svojstvo Checks klase Table vraća kolekciju ograničenja definiranih na tablici. Svojstvo Checks klase UserDefinedFunction vraća kolekciju ograničenja definiranih na korisnički definiranoj funkciji.

Pravila Pravilo (engl. rule) se koristi za ograničavanje vrijednosti u stupcu. SMO klase koje se upotrebljavaju za rad s pravilima SQL Servera opisane su u tablici 10-13. Tablica 10-13. SMO klase za rad s pravilima Klasa

Opis

Rule

Predstavlja atribute pravila.

RuleCollection

Predstavlja kolekciju pravila kao Rule objekte. Svojstvo Rules klase Database vraća kolekciju pravila definiranih na bazi podataka.

Pravila su uključena radi kompatibilnosti sa starijim inačicama i bit će uklonjena iz budućih inačica SQL Servera. U novim projektima umjesto pravila koristite ograničenja.

Pohranjene procedure SMO klase koje se upotrebljavaju za upravljanje pohranjenim procedurama SQL Servera opisane su u tablici 10-14. Tablica 10-14. SMO klase za upravljanje pohranjenim procedurama Klasa

Opis

StoredProcedure

Predstavlja pohranjenu proceduru.

StoredProcedureCollection

Predstavlja kolekciju pohranjenih procedura kao StoredProcedure objekte. Svojstvo StoredProcedures klase Database vraća kolekciju pohranjenih procedura u bazi podataka.

StoredProcedureEvent StoredProcedureEvents

Predstavlja događaj pohranjene procedure koji može biti uključen u objekt Stored-

Procedure EventSet.

Predstavlja postavke potrebne za obavijest o događajima pohranjene procedure SQL Servera. Objekt StoredProcedureEvents dobiven je upotrebom svojstva Events objekta StoredProcedure te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase StoredProcedureEvents navodi koje događaje primiti kao StoredProcedureEventSet objekt.

260 | Programiranje SQL Server 2005

Tablica 10-14. SMO klase za upravljanje pohranjenim procedurama (nastavak) Klasa

Opis

StoredProcedureEventSet

Predstavlja skup događaja pohranjene procedure kao StoredProcedureEvent objekte.

StoredProcedureParameter

Predstavlja parametar za pohranjenu proceduru.

StoredProcedureParameter Collection

Predstavlja kolekciju parametara pohranjene procedure kao StoredProcedureParameter objekte. Svojstvo Parameters klase StoredProcedure vraća kolekciju parametara za pohranjenu proceduru.

Numerirane pohranjene procedure SMO klase za rad s numeriranim pohranjenim procedurama SQL Servera opisane su u tablici 10-15. Tablica 10-15. SMO klase za rad s numeriranim pohranjenim procedurama Klasa

Opis

NumberedStoredProcedure

Predstavlja numeriranu pohranjenu proceduru.

NumberedStoredProcedureCollection

Predstavlja kolekciju numeriranih pohranjenih procedura kao NumberedStoredProcedure objekte. Svojstvo NumberedStoredProcedures klase StoredProcedure vraća kolekciju numeriranih pohranjenih procedura.

NumberedStoredProcedureParameter

Predstavlja parametar za numeriranu pohranjenu proceduru.

NumberedStoredProcedureParameterCollection

Predstavlja kolekciju parametara numerirane pohranjene procedure kao NumberedStoredProcedureParameter objekte. Svojstvo Parameters klase NumberedStoredProcedure vraća kolekciju parametara za numeriranu pohranjenu proceduru.

Numerirane pohranjene procedure uključene su radi kompatibilnosti sa starijim inačicama i bit će uklonjene iz budućih inačica SQL Servera. Nemojte ih upotrebljavati u novim projektima.

Produžene pohranjene procedure SMO klase koje se upotrebljavaju za rad s produženim pohranjenim procedurama SQL Servera opisane su u tablici 10-16.

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 261

Tablica 10-16. SMO klase za rad s produženim pohranjenim procedurama Klasa

Opis

ExtendedStoredProcedure

Predstavlja produženu pohranjenu proceduru.

ExtendedStoredProcedureCollection

Predstavlja kolekciju produženih pohranjenih procedura kao ExtendedStoredProcedure objekte. Svojstvo ExtendedStoredProcedures klase Database vraća kolekciju produženih pohranjenih procedura u bazi podataka.

Produžene pohranjene procedure uključene su radi kompatibilnosti sa starijim inačicama i bit će uklonjene iz budućih inačica SQL Servera. Nemojte ih upotrebljavati u novim projektima.

DML okidači SMO klase koje se upotrebljavaju za rad s DML okidačima SQL Servera opisane su u tablici 10-17. Tablica 10-17. SMO klase za rad s DML okidačima Klasa

Opis

Trigger

Predstavlja DML okidač.

TriggerCollection

Predstavlja kolekciju okidača kao Trigger objekte. Svojstvo Triggers klase Table vraća kolekciju okidača definiranih na tablici. Svojstvo Triggers klase View vraća kolekciju okidača definiranih na pogledu.

TriggerEvents

Predstavlja postavke potrebne za obavijest o događajima okidača SQL Servera. Objekt

TriggerEvents dobiven je upotrebom svojstva Events objekta Trigger te ne može

biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase TriggerEvents navodi koje događaje primiti kao ObjectEventSet objekt.

DDL okidači SMO klase koje se upotrebljavaju za rad s DDL okidačima SQL Servera kojima su polja djelovanja poslužitelj i baza podataka, opisane su u tablici 10-18. Tablica 10-18. SMO klase za upravljanje DDL okidačima Klasa

Opis

DatabaseDdlTrigger

Predstavlja DDL okidač kojem je polje djelovanja baza podataka.

DatabaseDdlTriggerCollection

Predstavlja kolekciju DDL okidača kojima je polje djelovanja baza podataka kao DatabaseDdlTrigger objekte. Svojstvo Triggers klase Database vraća kolekciju okidača kojima je polje djelovanja baza podataka.

DatabaseDdlTriggerEvent

Predstavlja događaj DDL okidača baze podataka koji može biti uključen u DatabaseDdlEventSet objekt.

262 | Programiranje SQL Server 2005

Tablica 10-18. SMO klase za upravljanje DDL okidačima (nastavak) Klasa

Opis

DatabaseDdlTriggerEventSet

Predstavlja skup događaja DDL okidača baze podataka kao DatabaseDdlTriggerEvent objekte.

ServerDdlTrigger

Predstavlja DDL okidač kojem je polje djelovanja instanca SQL Servera.

ServerDdlTriggerCollection

Predstavlja kolekciju DDL okidača kojima je polje djelovanja instanca SQL Servera kao ServerDdlTrigger objekte. Svojstvo Triggers klase Server vraća kolekciju okidača kojima je polje djelovanja instanca SQL Servera.

ServerDdlTriggerEvent

Predstavlja događaj DDL okidača poslužitelja koji može biti uključen u ServerDdlEventSet objekt.

ServerDdlTriggerEventSet

Predstavlja skup događaja DDL okidača poslužitelja kao ServerTriggerEvent objekte.

Korisnički definirani objekti SMO klase koje se upotrebljavaju za rad s korisnički definiranim agregatnim funkcijama, korisnički definiranim funkcijama i korisnički definiranim tipovima opisane su u tablici 10-19. Tablica 10-19. SMO klase za upravljanje korisnički definiranim objektima Klasa

Opis

UserDefinedAggregate

Predstavlja korisnički definiranu agregatnu funkciju.

UserDefinedAggregateCollection

Predstavlja kolekciju korisnički definiranih agregatnih funkcija kao UserDefinedAggregate objekte. Svojstvo UserDefinedAggregates klase Database vraća kolekciju korisnički definiranih agregatnih funkcija u bazi podataka.

UserDefinedAggregateParameter

Predstavlja parametar za upotrebu s korisnički definiranim agregatnim funkcijama.

UserDefinedAggregateParameter Collection

Predstavlja kolekciju parametara korisnički definirane agregatne funkcije kao UserDefinedAggregateParameter objekte. Svojstvo UserDefinedAggregateParameters klase UserDefinedAggregate vraća kolekciju parametara za korisnički definiranu agregatnu funkciju.

UserDefinedDataType

Predstavlja korisnički definirani tip temeljen na tipu podataka SQL Servera.

UserDefinedDataTypeCollection

Predstavlja kolekciju korisnički definiranih tipova kao UserDefinedDataType objekte. Svojstvo UserDefinedDataTypes klase Database vraća kolekciju korisnički definiranih tipova u bazi podataka.

UserDefinedFunction

Predstavlja korisnički definiranu funkciju.

UserDefinedFunctionCollection

Predstavlja kolekciju korisnički definiranih funkcija kao UserDefinedFunction objekte. Svojstvo UserDefinedFunctions klase Database vraća kolekciju korisnički definiranih funkcija u bazi podataka.

UserDefinedFunctionEvent

Predstavlja događaj korisnički definirane funkcije SQL Servera koji može biti uključen u UserDefinedFunctionEventSet objekt.

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 263

Tablica 10-19. SMO klase za upravljanje korisnički definiranim objektima (nastavak) Klasa

Opis

UserDefinedFunctionEvents

Predstavlja postavke potrebne za obavijest o događaju korisnički definirane funkcije SQL Servera. Objekt UserDefinedFunctionEvents dobiven je upotrebom svojstva Events objekta UserDefinedFunction te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase UserDefinedFunctionEvents navodi koje događaje primiti kao UserDefinedFunctionEventSet objekt.

UserDefinedFunctionEventSet

Predstavlja skup događaja korisnički definirane funkcije kao UserDefined-

FunctionEvent objekte.

UserDefinedFunctionParameter

Predstavlja parametar za korisnički definiranu funkciju.

UserDefinedFunctionParameter

Predstavlja kolekciju parametara korisnički definirane funkcije kao UserDefinedFunctionParameter objekte. Svojstvo Parameters klase UserDefinedFunction vraća kolekciju parametara za korisnički definiranu funkciju.

Collection UserDefinedType

Predstavlja korisnički definirani tip temeljen na .NET tipu podataka.

UserDefinedTypeCollection

Predstavlja kolekciju korisnički definiranih tipova kao UserDefinedType objekte. Svojstvo UserDefinedTypes klase Database vraća kolekciju korisnički definiranih tipova u bazi podataka.

UserDefinedTypeEvents

Predstavlja postavke potrebne za obavijest o događaju korisnički definiranog tipa SQL Servera. Objekt UserDefinedTypeEvents dobiven je upotrebom svojstva Events objekta UserDefinedType te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase UserDefinedTypeEvents navodi koje događaje primiti kao ObjectEventSet objekt.

Tipovi podataka SMO klase koje se upotrebljavaju za upravljanje tipovima podataka SQL Servera opisane su u tablici 10-20. Tablica 10-20. SMO klase za upravljanje tipovima podataka Klasa

Opis

DataType

Predstavlja tip podataka SQL Servera. Svojstvo DataType sljedećih klasa vraća DataType objekt koji predstavlja njegov tip podataka: • • • • • • •

Column NumberedStoredProcedureParameter StoredProcedureParameter UserDefinedAggregate UserDefinedAggregateParameter UserDefinedFunction UserDefinedFunctionParameter

264 | Programiranje SQL Server 2005

Sistemski tipovi podataka SMO klase koje se upotrebljavaju za upravljanje sistemskim tipovima podataka SQL Servera opisane su u tablici 10-21. Tablica 10-21. SMO klase za upravljanje sistemskim tipovima podataka Klasa

Opis

SystemDataType

Predstavlja sistemski tip podataka SQL Servera.

SystemDataTypeCollection

Predstavlja kolekciju sistemskih tipova podataka kao SystemDataType objekte. Svojstvo SystemDataTypes klase Server vraća kolekciju sistemskih tipova podataka definiranih na instanci SQL Servera.

Sheme Shema je vlasnički kontekst za objekte SQL Servera, kao što su tablice, pogledi i pohranjene procedure. SMO klase koje se upotrebljavaju za rad sa shemama SQL Servera opisane su u tablici 10-22. Tablica 10-22. SMO klase za rad sa shemama Klasa

Opis

Schema

Predstavlja shemu SQL Servera.

SchemaCollection

Predstavlja kolekciju shema kao Schema objekte. Svojstvo Schemas klase Database vraća sheme definirane za bazu podataka.

SchemaEvents

Predstavlja postavke potrebne za obavijest o događajima shema SQL Servera. Objekt SchemaEvents dobiven je upotrebom svojstva Events objekta Schema te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase SchemaEvents navodi koje događaje primiti kao ObjectEventSet objekt.

Objekti SQL Servera SMO klase koje se upotrebljavaju za rad s objektima SQL Servera opisane su u tablici 10-23. Tablica 10-23. SMO klase za upravljanje objektima SQL Servera Klasa

Opis

ObjectAlteredEventArgs

Predstavlja argumente koje prosljeđuje događaj izazvan kad je objekt promijenjen.

ObjectCreatedEventArgs

Predstavlja argumente koje prosljeđuje događaj izazvan kad je objekt stvoren.

ObjectDroppedEventArgs

Predstavlja argumente koje prosljeđuje događaj izazvan kad je objekt obrisan.

ObjectEvent

Predstavlja događaj SQL Server objekta koji može biti uključen u ObjectEventSet objekt.

Poglavlje 10: SQL Server Management Objects (SMO) klase instance, 1. dio | 265

Tablica 10-23. SMO klase za upravljanje objektima SQL Servera (nastavak) Klasa

Opis

ObjectEventSet

Predstavlja skup događaja objekta kao ObjectEvent objekte.

ObjectPermission

Predstavlja dopuštenje objekta SQL Servera.

ObjectPermissionInfo

Predstavlja informacije o dopuštenju SQL Server objekta.

ObjectPermissionSet

Predstavlja skup dopuštenja SQL Server objekta kao ObjectPermission objekte.

ObjectProperty

Predstavlja skup atributa za svojstvo objekta SQL Servera.

ObjectRenamedEventArgs

Predstavlja argumente koje prosljeđuje događaj izazvan kad je objektu promijenjeno ime.

266 | Programiranje SQL Server 2005

POGLAVLJE 11

SQL Server Management Objects (SMO) klase instance, 2. dio

Ovo poglavlje pruža pregled SMO klasa instance za administriranje objekata baze podataka koji ne pohranjuju podatke. Nakon pregleda, poglavlje će pokazati kako programski koristiti ove klase. Poglavlje 10 obrađuje SMO klase za administriranje objekata baze podataka koji pohranjuju podatke.

Programiranje SMO klasa instance za administriranje objekata baze podataka koji se ne koriste za pohranu podataka Smatra se da sljedeći objekti SQL Servera ne pohranjuju podatke. Oni identificiraju SMO klase instance koje ih administriraju. Konfiguracija poslužitelja Registrirani poslužitelji Povezani poslužitelji Podrazumijevane postavke baze podataka Datoteke podataka, dnevničke datoteke i grupe datoteka Particijske funkcije i sheme Korisnički računi Korisnici Poslužiteljske uloge, uloge baze podataka i aplikacijske uloge Dopuštenja poslužitelja i baze podataka .NET sklopovi Krajnje točke XML sheme Jezici Statistike Certifikati Vjerodajnice Simetrični i asimetrični ključevi Sinonimi 267

Sistemske i korisnički definirane poruke Full-Text Search OLE DB pružatelj Referenca na SMO klase koje implementiraju ovu funkcionalnost uključena je u odlomak „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, na kraju ovog poglavlja. Ovaj odlomak pokazuje kako programski upotrijebiti SMO klase instance koje se ne koriste za pohranu podataka. Svi su primjeri u ovom odlomku izrađeni u Visual Studiju 2005. Da biste preveli i pokrenuli primjere potrebna je referenca na sljedeće sklopove: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.Smo Tamo gdje je to potrebno ukazat ću na dodatne reference na sklopove.

Registrirani poslužitelj i grupe poslužitelja Registrirani poslužitelji omogućuju spremanje informacija o vezama sa SQL Serverima. Grupe poslužitelja čine hijerarhiju sličnu mapi u sustavu datoteka kako bi se olakšala organizacija registriranih poslužitelja. Registrirane poslužitelje i grupe poslužitelja možete pogledati u oknu Registered Servers SQL Server Management Studija. SMO klasa RegisteredServer predstavlja registrirani poslužitelj. Na sličan način, klasa ServerGroup predstavlja grupu registriranih poslužitelja. Ove klase smještene su u imenskom prostoru Microsoft.SqlServer.Management.Smo.RegisteredServers. Statičko svojstvo SqlServerRegistrations klase SmoApplication, koja predstavlja SMO aplikaciju, sadrži kolekcije registriranih poslužitelja i grupa poslužitelja pod imenima RegisteredServers i ServerGroups. Sljedeći primjer enumerira registrirane poslužitelje i grupe poslužitelja koji koriste ove kolekcije. SMO klase koje se koriste za upravljanje registriranim poslužiteljima i grupama poslužitelja opisane su u tablici 11-2 u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.RegisteredServers; class Program { static void Main(string[] args) { Console.WriteLine("---SERVER GROUPS---"); foreach (ServerGroup sg in

268 | Programiranje SQL Server 2005

SmoApplication.SqlServerRegistrations.ServerGroups) { Console.WriteLine(sg); foreach (RegisteredServer rs in sg.RegisteredServers) Console.WriteLine(" " + rs.Name); } Console.WriteLine(Environment.NewLine + "---REGISTERED SERVERS---"); foreach (RegisteredServer rs in SmoApplication.SqlServerRegistrations.RegisteredServers) Console.WriteLine(rs.Name); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-1. Vidi se da je definirana jedna grupa poslužitelja i jedan poslužitelj.

Slika 11-1. Rezultati primjera enumeracije jednog poslužitelja i grupe poslužitelja

Upravljanje korisničkim računima Ovaj primjer čita svojstvo Logins objekta Server. Logins je kolekcija Login objekata koja predstavlja sve korisničke račune definirane na ciljnom poslužitelju. Login objekt predstavlja korisnički račun SQL Servera za prijavljivanje, kojem je odobren pristup SQL Serveru kroz standardnu Windows ili SQL Server provjeru identiteta. Za svaki Login objekt u Logins kolekciji primjer prikazuje ime korisničkog računa (Login.Name), podrazumijevanu bazu podataka (Login.DefaultDatabase) te način prijavljivanja (Login.WindowsLoginAccesType). SMO klase koje se koriste za upravljanje korisničkim računima opisane su u tablici 11-8 u odjeljku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. Trebate dodati referencu na sklop Microsoft.SqlServer.SqlEnum kako biste preveli i pokrenuli ovaj primjer. using System; using System.Data; using System.Collections;

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 269

using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); foreach (Login l in server.Logins) { Console.WriteLine("Name: " + l.Name); Console.WriteLine("DefaultDatabase: " + l.DefaultDatabase); Console.WriteLine("WindowsLoginAccessType:" + l.WindowsLoginAccessType); Console.WriteLine( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-2.

Slika 11-2. Djelomični rezultati primjera enumeracije korisničkih računa

Rezultati su jednaki kao i pri otvaranju čvora Security Explorer SQL Server Management Studija.



Logins u prozoru Object

Ovaj primjer stvara novi korisnički račun TestLogin. To čini instanciranjem Login objekta, postavljanjem njegovog LoginType na LoginType.SqlLogin, a zatim pozivanjem njegove metode Create(). using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program

270 | Programiranje SQL Server 2005

{ static void Main(string[] args) { Server server = new Server("localhost"); Login l = new Login(server, "TestLogin"); l.LoginType = LoginType.SqlLogin; l.Create("tempPassword"); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Ako za LoginType zadate SqlLogin, svojstvo Password morate postaviti upotrebom preopterećene metode Create(). Ako zadate LoginType od WindowsUser, morate u konstruktoru klase Login zadati ime poslužitelja i ime Windows korisničkog računa kao argument imena korisničkog računa za prijavu. Sljedeći redovi koda stvaraju Windows korisnički račun: Login l = new Login(server, @"serverName\windowsAccountName"); l.LoginType = LoginType.WindowsUser; l.Create( );

Upravljanje korisnicima Ovaj primjer enumerira svojstvo Users objekta Database koji predstavlja bazu podataka AdventureWorks. Users je kolekcija User objekata koji predstavljaju korisnike SQL Servera – sigurnosne principale koji se upotrebljavaju za kontroliranje pristupnih dopuštenja unutar baze podataka. Dok stvarate korisničke račune na razini poslužitelja, korisnici se preslikavaju na samo jedan korisnički račun SQL Servera u bazi podataka gdje je korisnik definiran. Klasa DatabaseMapping opisuje kako se korisnički računi preslikavaju na korisnike baze podataka. Za svakog korisnika u kolekciji Database.Users primjer prikazuje korisničko ime (User.Name), datum stvaranja (User.CreateDate), pridruženi korisnički račun (User. Login) i tip korisnika (User.UserType). SMO klase koje se koriste za upravljanje korisnicima opisane su u tablici 11-9, kasnije u ovom poglavlju. Trebate dodati referencu na sklop Microsoft.SqlServer.SqlEnum kako biste preveli i izveli ovaj primjer. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 271

{ static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; foreach (User u in db.Users) { Console.WriteLine("Name: " + u.Name); Console.WriteLine("CreateDate: " + u.CreateDate); Console.WriteLine("Login: " + u.Login); Console.WriteLine("UserType: " + u.UserType); Console.WriteLine( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-3.

Slika 11-3. Rezultati primjera enumeracije korisnika

Rezultati su jednaki kao i pri otvaranju čvora Security ➝ Users za bazu podataka u prozoru Object Explorer SQL Server Management Studija. Ovaj primjer stvara novog korisnika, TestUser, u bazi podataka AdventureWorks i povezuje ga s TestLogin korisničkim računom stvorenim u primjeru ranije u ovom odlomku. To čini instanciranjem novog User objekta, postavljanjem njegovog svojstva Login na niz znakova "TestLogin" te pozivanjem njegove metode Create(). using System; using System.Data; using System.Collections;

272 | Programiranje SQL Server 2005

using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["ProgrammingSqlServer2005"]; User u = new User(db, "TestUser"); u.Login = "TestLogin"; u.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Upravljanje ulogama Ovaj primjer enumerira uloge u bazi podataka AdventureWorks. To čini čitanjem svojstva Roles objekta Database. Svaki element u kolekciji Roles jest DatabaseRole objekt. Primjer prikazuje ime (DatabaseRole.Name), datum stvaranja (DatabaseRole.CreateDate) i vlasnika (DatabaseRole.Owner) za svaki DatabaseRole objekt te također ispisuje članove uloge pozivanjem metode DatabaseRole.EnumMembers(). SMO klase koje se koriste za upravljanje poslužiteljskim ulogama opisane su u tablici 1110. SMO klase koje se koriste za upravljanje ulogama baze podataka opisane su u tablici 11-11. Obje se tablice nalaze u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. Trebate dodati referencu na sklop Microsoft.SqlServer.SqlEnum kako biste preveli i izveli ovaj primjer. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; foreach (DatabaseRole dr in db.Roles) {

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 273

Console.WriteLine("Name: " + dr.Name); Console.WriteLine("CreateDate: " + dr.CreateDate); Console.WriteLine("Owner: " + dr.Owner); Console.WriteLine("Members:"); foreach(string s in dr.EnumMembers( )) Console.WriteLine(" " + s); Console.WriteLine( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Dio rezultata prikazan je na slici 11-4.

Slika 11-4. Rezultati primjera enumeracije uloga

Rezultati su jednaki kao i pri otvaranju čvora Security ➝ Roles ➝ Database Roles za bazu podataka u prozoru Object Explorer SQL Server Management Studija. Ovaj primjer dodaje korisnika TestUser, stvorenog u ranijem primjeru, ulozi db_backupoperator. To čini pozivanjem metode AddToRole() klase User. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["ProgrammingSqlServer2005"];

274 | Programiranje SQL Server 2005

User u = db.Users["TestUser"]; u.AddToRole("db_backupoperator"); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Alternativno, možete instancirati određeni DatabaseRole objekt te ulozi dodati korisnika upotrebom metode AddMember(): DatabaseRole r = db.Roles["db_backupoperator"]; r.AddMember("TestUser");

Upravljanje poslužiteljskim dopuštenjima Ovaj primjer odobrava, uskraćuje i opoziva poslužiteljska dopuštenja korisničkom računu TestLogin, napravljenom u odlomku „Upravljanje korisničkim računima“, ranije u ovom poglavlju. Da bi to postigao koristi nekoliko SMO klasa: Server Izlaže metode Grant(), Deny(), Revoke() i EnumServerPermissions() koje se koriste za dobivanje i zadavanje poslužiteljskih dopuštenja. ServerPermissionInfo Presreće skup poslužiteljskih dopuštenja koji vraća EnumServerPermissions(). ServerPermissionSet Prosljeđuje skup poslužiteljskih dopuštenja Server metodama Grant(), Deny() i Revoke(). ServerPermission Predstavlja jedno dopuštenje u skupu poslužiteljskih dopuštenja. SMO klase koje se koriste za rad s poslužiteljskim dopuštenjima opisane su u tablici 11-12 u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); ServerPermissionInfo[] spi; ServerPermissionSet sps;

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 275

spi = server.EnumServerPermissions("TestLogin"); for (int i = 0; i < spi.Length; i++) Console.WriteLine(spi[i].ToString( )); Console.WriteLine( ); // Daje dopuštenje "napravi bilo koju bazu podataka" sps = new ServerPermissionSet(ServerPermission.CreateAnyDatabase); server.Grant(sps, "TestLogin"); // Sprječava dopuštenje "pregledaj bilo koju bazu podataka" sps = new ServerPermissionSet(ServerPermission.ViewAnyDatabase); server.Deny(sps, "TestLogin"); spi = server.EnumServerPermissions("TestLogin"); for (int i = 0; i < spi.Length; i++) Console.WriteLine(spi[i].ToString( )); Console.WriteLine( ); // Uklanja prethodna dopuštenja sps = new ServerPermissionSet(new ServerPermission[] { ServerPermission.CreateAnyDatabase, ServerPermission.ViewAnyDatabase}); server.Revoke(sps, "TestLogin"); spi = server.EnumServerPermissions("TestLogin"); for (int i = 0; i < spi.Length; i++) Console.WriteLine(spi[i].ToString( )); Console.WriteLine( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-5.

Slika 11-5. Rezultati primjera upravljanja poslužiteljskim dopuštenjima

Enumeriranje sklopova .NET Frameworka SQL Server 2005 kroz CLR integraciju omogućuje stvaranje objekata baze podataka, kao što su funkcije, pohranjene procedure, okidači, korisnički definirani tipovi podataka i korisnički definirane agregatne funkcije, iz sklopova .NET Frameworka. 276 | Programiranje SQL Server 2005

Sljedeći primjer rezultira popisom svih sklopova .NET Frameworka definiranih u bazi podataka AdventureWorks te popisuje datoteke asocirane sa svakim od njih. To čini enumeriranjem svojstva Assemblies objekta Database, koji je kolekcija SqlAssembly objekata. SqlAssembly nadalje sadrži kolekciju pod nazivom SqlAssemblyFiles, čiji su elementi SqlAssemblyFile objekti. SMO klase koje se koriste za upravljanje sklopovima .NET Frameworka opisane su u tablici 11-15 u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; foreach (SqlAssembly sa in db.Assemblies) { Console.WriteLine(sa.Name + " " + sa.CreateDate); foreach (SqlAssemblyFile saf in sa.SqlAssemblyFiles) Console.WriteLine(" " + saf.Name); } Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-6.

Slika 11-6. Rezultati primjera enumeriranja sklopova

Klasa SqlAssembly sadrži metode koje omogućuju stvaranje, mijenjanje i ispuštanje sklopova .NET Frameworka iz baze podataka.

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 277

Statistike Statistike sadrže informacije o distribuciji vrijednosti u stupcu. Optimizator upita koristi statistiku za izračunavanje optimalnog plana upita. Određenije, statistika pomaže proračunu troška upotrebe indeksa ili stupca za procjenu upita. Kad je opcija baze podataka AUTO_CREATE_STATISTICS postavljena na ON (podrazumijevano), SQL Server automatski pohranjuje statističke podatke o indeksiranim stupcima i stupcima bez indeksa koji su upotrijebljeni u predikatu. Možda ćete morati ručno odrediti statistiku, posebno ako je automatska statistika na SQL Serveru onemogućena. Kad je opcija baze podataka AUTO_UPDATE_STATISTICS postavljena na ON (podrazumijevano), SQL Server periodički ažurira statistiku prema promjenama podataka u tablicama. Zastarjela statistika može uzrokovati da optimizator upita donese odluke koje nisu optimalne za obradu upita. SQL Server 2005 uvodi opciju baze podataka AUTO_UPDATE_STATISTICS_ASYNC koja, kad je postavljena na ON (podrazumijevano je OFF), omogućuje automatsko asinkrono ažuriranje statistike. To dopušta upitima da nastave koristiti zastarjele statističke podatke tijekom ažuriranja, umjesto blokiranja upita dok se ažuriranje ne dovrši. Stanje statističkih opcija baze podataka možete pogledati upitom u kataloški pogled sys.databases: SELECT

name, is_auto_create_stats_on, is_auto_update_stats_on, is_auto_update_stats_async_on FROM sys.databases

Ovaj primjer koristi SMO za prikazivanje stupaca u svakom statističkom brojaču na tablici HumanResources.Employee u AdventureWorks. On instancira objekt Table koji predstavlja HumanResources.Employee. Objekt Table izlaže statističke brojače definirane za tablicu kao kolekciju Statistic objekata. Primjer pretražuje kolekciju, enumerirajući StatisticColumns objekt koji sadrži kolekciju stupaca definiranih u statističkom brojaču. SMO klase koje se koriste za upravljanje statistikama opisane su u tablici 11-19 u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) {

278 | Programiranje SQL Server 2005

Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Table t = db.Tables["Employee", "HumanResources"]; StatisticCollection sc = t.Statistics; for (int i = 0; i < sc.Count; i++) { Console.WriteLine(sc[i].Name); foreach (StatisticColumn scol in sc[i].StatisticColumns) Console.WriteLine(" " + scol.Name); Console.WriteLine(

);

} Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-7.

Slika 11-7. Rezultati primjera prikaza stupaca statističkog brojača

Ovaj primjer izrađuje novi statistički brojač pod imenom IX_Employee_ContactID na stupcu ContactID tablice HumanResources.Employee u AdventureWorks. Najprije stvara objekt Table koji predstavlja tablicu. Zatim instancira novi Statistic objekt i tada ga združuje s ContactID u novom StatisticColumn objektu. Objekt StatisticColumn dodaje kolekciji StatisticColumns Statistic objekta. Na kraju poziva metodu Statistic.Create(). using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo;

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 279

class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Table t = db.Tables["Employee", "HumanResources"]; Statistic s = new Statistic(t, "IX_Employee_ContactID"); StatisticColumn sc = new StatisticColumn(s, "ContactID"); s.StatisticColumns.Add(sc); s.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Novi statistički brojač možete vidjeti otvaranjem čvora Databases ➝ AdventureWorks ➝ Tables ➝ HumanResources.Employee ➝ Statistics u prozoru Object Explorer SQL Server Management Studija. Sljedeći kod uklanja statistički brojač IX_Employee_ContactID stvoren u prethodnom primjeru: using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Table t = db.Tables["Employee", "HumanResources"]; t.Statistics["IX_Employee_ContactID"].Drop(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Sinonimi Sinonim (engl. synonim) je objekt baze podataka koji pruža alternativno ime za drugi objekt baze podataka na lokalnom ili na udaljenom poslužitelju. S gledišta projektiranja, sinonim pruža sloj apstraktnosti koji omogućuje promjene pozadinskih objekata

280 | Programiranje SQL Server 2005

bez utjecaja na klijentske aplikacije. Sinonim se može napraviti za sljedeće objekte baze podataka: • Tablice, uključujući globalne i lokalne privremene tablice • Poglede • SQL skalarne funkcije, izravno upisane funkcije s tabličnom vrijednošću, funkcije s tabličnom vrijednošću i pohranjene procedure • CLR pohranjene procedure, skalarne funkcije, funkcije s tabličnom vrijednošću i agregatne funkcije • Procedure za filtriranje podataka u replikaciji • Produžene pohranjene procedure Sinonim ne može referencirati korisnički definiranu agregatnu funkciju. Objekt sinonima ne može biti temeljni objekt za drugi sinonim. Ovaj primjer stvara sinonim za tablicu HumanResources.Employees i koristi sinonim za upit u tablicu. Primjer instancira novi Synonym objekt, združujući ga s bazom podataka AdventureWorks. Zatim postavlja nekoliko relevantnih svojstava: • Schema i BaseSchema postavljena su na "HumanResources". • BaseDatabase postavljeno je na bazu podataka AdventureWorks. • BaseObject je postavljeno na ime pozadinskog objekta, u ovom slučaju tablicu Employee. Na kraju, poziva metodu Synonym.Create(). SMO klase koje se koriste za upravljanje sinonimima opisane su u tablici 11-23 u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using System.Data.SqlClient; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Synonym s = new Synonym(db, "EmployeeSynonym"); s.Schema = "HumanResources"; s.BaseDatabase = "AdventureWorks"; s.BaseSchema = "HumanResources"; s.BaseObject = "Employee"; s.Create( );

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 281

SqlConnection conn = new SqlConnection( "Data Source=localhost;Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks"); SqlDataAdapter da = new SqlDataAdapter( "SELECT TOP 5 EmployeeID, LoginID, Title " + "FROM HumanResources.EmployeeSynonym", conn); DataTable dt = new DataTable( ); da.Fill(dt); foreach (DataRow row in dt.Rows) Console.WriteLine(row["EmployeeID"] + ", " + row["LoginID"] + ", " + row["Title"]); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 11-8.

Slika 11-8. Rezultati primjera sinonima

Novi sinonim možete vidjeti otvaranjem čvora Databases ➝ AdventureWorks ➝ Synonyms u prozoru Object Explorer SQL Server Management Studija. Sljedeći kod uklanja sinonim pod imenom EmployeeSynonym napravljen u prethodnom primjeru: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; db.Synonyms["EmployeeSynonym", "HumanResources"].Drop( Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

282 | Programiranje SQL Server 2005

);

Poruke Kataloški pogled sys.messages sadrži red za svaku definiranu poruku na instanci SQL Servera. Poruke s identifikatorima manjim od 50001 rezervirane su za sistemske poruke. Kataloški pogledi preporučeni su mehanizmi za pristupanje informacijama u sistemskim tablicama. Pogled sys.sysmessages sadrži slične informacije kao kataloški pogled sys.messages, a zadržan je radi kompatibilnosti sa starijim inačicama. SMO klasa koja predstavlja sistemsku poruku jest SystemMessage. Objekt Server izlaže kolekciju SystemMessage objekata kroz svoje svojstvo SystemMessages. Sljedeći primjer enumerira kolekciju sistemskih poruka za lokalni stroj te popisuje identifikator, identifikator jezika i tekst za svaku od njih. SMO klase koje se koriste za upravljanje porukama opisane su u tablicama 11-24 i 11-25. Obje se tablice nalaze u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); foreach (SystemMessage sm in server.SystemMessages) Console.WriteLine(sm.ID + "[" + sm.Language + "]: " + sm.Text); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Djelomični su rezultati prikazani na slici 11-9. Sljedeći kod izravno pristupa poruci s identifikatorom 105: Server server = new Server("localhost"); SystemMessage sm = server.SystemMessages[105, "us_english"];

Pored indeksera, klasa SystemMessageCollection ima i dvije metode za uzimanje određenog SystemMessage objekta. Te su metode ItemByIdAndLanguage() i ItemByIdAndLanguageID(), a obje koriste dva argumenta kao i indekser. Prvi je argument identifikator poruke za obje metode. Drugi argument zadaje jezik kao niz znakova za prvu metodu, a kao identifikator jezika za drugu metodu. Kataloški pogled sys.syslanguages sadrži red za svaki jezik instaliran na instanci SQL Servera. Indekser SystemMessage i metode pristupnika zahtijevaju ili identifikator jezika (stupac langid) ili ime (stupac name) iz ove tablice kao argument jezika. Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 283

Slika 11-9. Djelomični rezultati primjera enumeracije poruka

Rad s korisnički definiranim porukama nalikuje radu sa sistemski definiranim porukama, s tom razlikom što ih možete stvoriti, izmijeniti i ispustiti upotrebom klase UserDefinedMessage. Sljedeći primjer pokazuje kako: Server server = new Server("localhost"); UserDefinedMessage udm = new UserDefinedMessage(server, 50001, "us_english", 1, "test user-defined message", false); udm.Create( );

Sljedeći kod ispušta korisnički definiranu poruku: Server server = new Server("localhost"); UserDefinedMessage udm = server.UserDefinedMessages[50001, "us_english"]; udm.Drop( );

Full-Text Search Full-Text Search omogućuje indeksiranje tekstualnih podataka u SQL Serveru i izvođenje lingvističkih pretraga prema riječima i izrazima unutar podataka, upotrebom pravila jezika na kojem su podaci. Možete napraviti indekse na stupcima tipova podataka char, varchar i nvarchar, kao i stupcima koji sadrže oblikovane binarne podatke pohranjene u stupce varbinary(max) ili image. Indeks cjelokupnog teksta možete izraditi na tablici s jednim jedinstvenim stupcem koji ne dopušta NULL vrijednosti. Indeks cjelokupnog teksta pohranjuje informacije o značajnim riječima u stupcu. Katalog indeksa cjelokupnog teksta sadrži nula ili više indeksa cjelokupnog teksta. Svaki katalog sadrži informacije o indeksiranju za jednu ili više tablica u bazi podataka. Ovaj primjer izrađuje indeks cjelokupnog teksta na stupcu Description tablice Production.ProductDescription u AdventureWorks. Ovo su koraci:

284 | Programiranje SQL Server 2005

1. Instancira objekt FullTextCatalog, postavlja njegovo svojstvo IsDefault na true i zatim poziva njegovu metodu Create(). 2. Objekt Table asocira s Production.ProductDescription. 3. Instancira objekt FullTextIndex, povezujući ga s tablicom stvorenom u 2. koraku. 4. Stvara objekt FullTextIndexColumn povezan sa stupcem Description. 5. Objekt FullTextIndexColumn stvoren u 4. koraku dodaje kolekciji IndexedColumns objekta FullTextIndex, stvorenog u 3. koraku. 6. Svojstvo CatalogName objekta FullTextIndex postavlja tako da pokazuje na objekt FullTextCatalog, stvoren u 1. koraku. 7. Poziva metodu Create() objekta FullTextIndex. SMO klase koje se koriste za upravljanje Full-Text Search katalozima i indeksima opisane su u tablici 11-26, u odlomku „Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka“, kasnije u ovom poglavlju. using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; FullTextCatalog ftc = new FullTextCatalog(db, "PSS2005_AW_Catalog"); ftc.IsDefault = true; ftc.Create( ); Table t = db.Tables["ProductDescription", "Production"]; FullTextIndex fti = new FullTextIndex(t); fti.IndexedColumns.Add(new FullTextIndexColumn(fti, "Description")); fti.UniqueIndexName = "PK_ProductDescription_ProductDescriptionID"; fti.CatalogName = "PSS2005_AW_Catalog"; fti.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Novi indeks cjelokupnog teksta možete vidjeti otvaranjem čvora Databases ➝ AdventureWorks ➝ Storage ➝ Full Text Catalogs u prozoru Object Explorera SQL Server Management Studija. Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 285

Referenca na SMO klase instance za administriranje objekata koji se ne koriste za pohranu podataka Ovaj odlomak opisuje klase koje se upotrebljavaju za administriranje SMO klasa SQL Servera koje se ne koriste za pohranu podataka. Klase su uređene u funkcionalne grupe.

Konfiguracija poslužitelja SMO klase koje se koriste za upravljanje konfiguracijskim informacijama za instancu SQL Servera opisane su u tablici 11-1. Tablica 11-1. SMO klase za upravljanje konfiguracijom SQL Servera Klasa

Opis

ConfigProperty

Predstavlja informacije o konfiguracijskim opcijama.

ConfigPropertyCollection

Predstavlja kolekciju ConfigProperty objekata. Svojstvo Properties klase Configuration vraća kolekciju konfiguracije.

Configuration

Predstavlja konfiguracijske informacije za instancu SQL Servera. Objekt konfiguracijskih informacija za postavku konfiguracijske opcije izložen je kroz svojstva objekta Configuration koji vraća objekt ConfigProperty. Objektu Configuration pristupa se kroz svojstvo Configuration klase Server.

Registrirani poslužitelji Registrirani poslužitelji omogućuju spremanje informacija o vezi za instance SQL Servera. Grupe poslužitelja čine hijerarhiju sličnu mapi operacijskog sustava zbog olakšavanja organizacije registriranih poslužitelja. Registrirane poslužitelje i grupe poslužitelja možete pogledati u oknu Registered Servers u SQL Server Management Studiju. SMO klase koje se koriste za upravljanje registriranim poslužiteljima i grupama poslužitelja opisane su u tablici 11-2. Ove se klase nalaze u imenskom prostoru Microsoft. SqlServer.Management.Smo.RegisteredServers. Tablica 11-2. SMO klase za upravljanje registriranim poslužiteljima i grupama poslužitelja Klasa

Opis

RegisteredServer

Predstavlja registrirani SQL Server.

RegisteredServerCollection

Predstavlja kolekciju registriranih SQL Servera kao RegisteredServer objekte. Svojstvo RegisteredServers klase ServerGroup vraća objekt RegisteredServerCollection koji sadrži SQL poslužitelje uključene u roditeljsku grupu poslužitelja. Svojstvo RegisteredServers klase SmoApplication.SqlServerRegistrations vraća objekt RegisteredServerCollection koji sadrži SQL poslužitelje definirane na objektu SmoApplication.

ServerGroup

Predstavlja grupu registriranih instanci SQL Servera.

286 | Programiranje SQL Server 2005

Tablica 11-2. SMO klase za upravljanje registriranim poslužiteljima i grupama poslužitelja (nastavak) Klasa

Opis

ServerGroupCollection

Predstavlja kolekciju registriranih grupa SQL Servera kao ServerGroup objekte. Svojstvo ServerGroups klase SmoApplication.SqlServerRegistrations vraća objekt ServerGroupCollection koji sadrži grupe SQL poslužitelja definirane na objektu SmoApplication.

Povezani poslužitelji Povezani poslužitelj je sustav za upravljanje bazom podataka različit od SQL Servera i povezan na instancu SQL Servera preko OLE DB upravljačkog programa. SMO klase koje se koriste za upravljanje povezanim poslužiteljima opisane su u tablici 11-3. Tablica 11-3. SMO klase za upravljanje povezanim poslužiteljima Klasa

Opis

LinkedServer

Predstavlja sustav za upravljanje bazom podataka različit od SQL Servera.

LinkedServerCollection

Predstavlja kolekciju povezanih poslužitelja kao LinkedServer objekte. Svojstvo LinkedServers klase Server vraća kolekciju povezanih poslužitelja registriranih s instancom SQL Servera.

LinkedServerLogin

Predstavlja SQL Server korisnički račun za prijavu koji ima dopuštenje za uspostavljanje veze s povezanim poslužiteljem.

LinkedServerLoginCollection

Predstavlja kolekciju korisničkih računa povezanog poslužitelja kao LinkedServerLogin objekte. Svojstvo LinkedServerLogins klase LinkedServer vraća kolekciju korisničkih računa povezanog poslužitelja definiranu na povezanom poslužitelju.

Podrazumijevane vrijednosti baze podataka SMO klase koje se koriste za upravljanje podrazumijevanim vrijednostima baze podataka opisane su u tablici 11-4. Tablica 11-4. SMO klase za upravljanje podrazumijevanim vrijednostima baze podataka Klasa

Opis

Default

Predstavlja podrazumijevanu vrijednost SQL Server baze podataka.

DefaultCollection

Predstavlja kolekciju podrazumijevanih vrijednosti baze podataka kao Default objekte. Svojstvo Defaults klase Database vraća kolekciju podrazumijevanih vrijednosti definiranih na bazi podataka.

Datoteke i grupe datoteka Baza podataka SQL Servera preslikana je preko serije datoteka operacijskog sustava, a datoteke podataka i dnevničke datoteke uvijek su pohranjene u zasebne datoteke. Podaci mogu biti preslikani i na jedinstvenu primarnu datoteku podataka (.mdf datoteku), koja je polazišna točka za sve operacije baze podataka, i na neobavezne sekundarne datoteke podataka (.ndf datoteke). Dnevničke datoteke sadrže informacije koje se upotrebljavaju za obnavljanje baze podataka i preslikane su na jednu ili više datoteka operacijskog sustava (.ldf datoteke). Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 287

Grupe datoteka upotrebljavaju se za grupiranje objekata i datoteka baze podataka radi alokacije i u administrativne svrhe. Dnevničke datoteke nisu dio grupe datoteka i njima se upravlja zasebno iz prostora podataka. SMO klase koje se koriste za upravljanje datotekama podataka, dnevničkim datotekama i grupama datoteka opisane su u tablici 11-5. Tablica 11-5. SMO klase za upravljanje datotekama i grupama datoteka Klasa

Opis

DataFile

Predstavlja datoteku podataka SQL Servera.

DataFileCollection

Predstavlja kolekciju datoteka podataka kao DataFile objekte. Svojstvo Files klase FileGroup vraća kolekciju datoteka podataka definiranih u grupi datoteka.

FileGroup

Predstavlja grupu datoteka SQL Servera.

FileGroupCollection

Predstavlja kolekciju grupa datoteka kao FileGroup objekte. Svojstvo FileGroups klase Database vraća kolekciju grupa datoteka definiranih na bazi podataka.

LogFile

Predstavlja dnevničku datoteku SQL Servera.

LogFileCollection

Predstavlja kolekciju dnevničkih datoteka kao LogFile objekte. Svojstvo LogFiles klase Database vraća kolekciju dnevničkih datoteka definiranih na bazi podataka.

Particijske funkcije Particioniranje (engl. partitioning) baze podataka dijeli velike tablice na manje tablice kako bi se poboljšale performanse i pojednostavilo održavanje. Particijska funkcija preslikava svaki red tablice ili indeks u particiju na temelju vrijednosti zadanog stupca. Particija ima doseg na razini baze podataka. SMO klase koje se koriste za upravljanje particijskim funkcijama opisane su u tablici 11-6. Tablica 11-6. SMO klase za upravljanje particijskim funkcijama Klasa

Opis

PartitionFunction

Predstavlja particijsku funkciju.

PartitionFunctionCollection

Predstavlja kolekciju particijskih funkcija kao PartitionFunction objekte. Svojstvo PartitionFunctions klase Database vraća kolekciju particijskih funkcija definiranih na bazi podataka.

PartitionFunctionEvents

Predstavlja postavke potrebne za obavijest o događajima particijske funkcije SQL Servera. Objekt PartitionFunctionEvents dobiven je upotrebom svojstva Events objekta PartitionFunction te ne može biti stvoren kao samostalni objekt.

PartitionFunctionParameter

Predstavlja parametar particijske funkcije.

PartitionFunctionParameterCollection

Predstavlja kolekciju parametara particijske funkcije kao PartitionFunctionParameter objekte. Svojstvo PartitionFunctionParameters klase PartitionFunction vraća kolekciju parametara particijske funkcije definiranih na particijskoj funkciji.

288 | Programiranje SQL Server 2005

Particijske sheme Particijska shema preslikava particije tablice ili indeksa na grupe datoteka. SMO klase koje se koriste za upravljanje particijskim shemama opisane su u tablici 11-7. Tablica 11-7. SMO klase za upravljanje particijskim shemama Klasa

Opis

PartitionScheme

Predstavlja particijsku shemu.

PartitionSchemeCollection

Predstavlja kolekciju particijskih shema kao PartitionScheme objekte. Svojstvo PartitionSchemes klase Database vraća kolekciju particijskih shema definiranih na bazi podataka.

PartitionSchemeEvents

Predstavlja postavke potrebne za obavijest o događajima particijske sheme SQL Servera. Objekt PartitionSchemeEvents dobiven je upotrebom svojstva Events objekta PartitionScheme te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase PartitionSchemeEvents navodi koje događaje primiti kao ObjectEventSet objekt.

PartitionSchemeParameter

Predstavlja parametar za particijsku shemu.

PartitionSchemeParameterCollection

Predstavlja kolekciju parametara particijske sheme kao PartitionSchemeParameter objekte. Svojstvo PartitionSchemeParameters klasa Table i Index vraća kolekciju parametara particijske sheme definiranih na tablici ili indeksu.

Korisnički računi SMO klase koje se koriste za upravljanje korisničkim računima opisane su u tablici 11-8. Tablica 11-8. SMO klase za upravljanje korisničkim računima Klasa

Opis

DatabaseMapping

Predstavlja preslikavanje korisničkih računa SQL Server baze podataka na korisnike baze podataka za svaku bazu podataka. Metoda EnumDatabaseMappings() klase Login vraća polje DatabaseMapping objekata za korisnički račun.

Login

Predstavlja korisnički račun SQL Servera za prijavu kojem je odobren pristup SQL Serveru preko standardne Windows ili SQL Server provjere identiteta.

LoginCollection

Predstavlja kolekciju Login objekata. Svojstvo Logins klase Server vraća LoginCollection objekt koji sadrži sve korisničke račune za prijavu definirane na instanci SQL Servera.

LoginEvents

Predstavlja postavke potrebne za obavijest o događajima korisničkog računa SQL Servera. Objekt LoginEvents dobiven je upotrebom svojstva Events objekta Login te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase LoginEvents navodi događaje koji će biti primljeni kao objekt ObjectEventSet.

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 289

Korisnici SMO klase koje se koriste za upravljanje korisnicima opisane su u tablici 11-9. Tablica 11-9. SMO klase za upravljanje korisnicima Klasa

Opis

User

Predstavlja SQL Server korisnika – sigurnosni principal koji se koristi za kontroliranje dopuštenja za pristup unutar baze podataka. Dok se korisnički račun stvara na razini poslužitelja, korisnik se preslikava na jedan SQL Server korisnički račun u bazi podataka u kojoj je korisnik definiran.

UserCollection

Predstavlja kolekciju User objekata. Svojstvo Users klase Database vraća UserCollection objekt koji sadrži sve korisnike definirane za bazu podataka.

UserEvents

Predstavlja postavke potrebne za obavijest o događajima korisnika SQL Servera. Objekt UserEvents dobiven je upotrebom svojstva Events objekta User te ne može biti stvoren kao

samostalni objekt. Metoda SubscribeToEvents() klase UserEvents navodi događaje koji mogu primiti objekt ObjectEventSet.

UserOptions

Predstavlja skup konfigurabilnih poslužiteljskih opcija koji se odnose na korisnike. Objekt UserOptions dobiven je upotrebom svojstva UserOptions objekta Server te ne može biti stvoren kao samostalni objekt.

Poslužiteljske uloge SMO klase koje se koriste za upravljanje poslužiteljskim ulogama opisane su u tablici 11-10. Tablica 11-10. SMO klase za upravljanje poslužiteljskim ulogama Klasa

Opis

ServerRole

Predstavlja poslužiteljsku sigurnosnu ulogu.

ServerRoleCollection

Predstavlja kolekciju poslužiteljskih uloga kao ServerRole objekte. Svojstvo Roles klase Server vraća kolekciju uloga definiranih na instanci SQL Servera.

Uloge baze podataka SMO klase koje se koriste za upravljanje ulogama baze podataka opisane su u tablici 11-11. Tablica 11-11. SMO klase za upravljanje ulogama baze podataka Klasa

Opis

DatabaseRole

Predstavlja sigurnosnu ulogu baze podataka SQL Servera.

DatabaseRoleCollection

Predstavlja kolekciju DatabaseRole objekata. Svojstvo Roles klase Database vraća DatabaseRoleCollection objekt koji sadrži sve uloge definirane za bazu podataka.

Poslužiteljska dopuštenja SMO klase koje se koriste za upravljanje poslužiteljskim dopuštenjima opisane su u tablici 11-12. 290 | Programiranje SQL Server 2005

Tablica 11-12. SMO klase za upravljanje poslužiteljskim dopuštenjima Klasa

Opis

ServerPermission

Predstavlja poslužiteljsko dopuštenje. Objekt ServerPermissionSet, koji sadrži skup ServerPermission objekata, koristi se za zadavanje dopuštenja za metode Grant(), Deny() i Revoke() objekta Server.

ServerPermissionInfo

Predstavlja informacije o dopuštenjima poslužiteljske razine za poslužitelja baze podataka. Metoda EnumServerPermissions() klase Server vraća informacije o dopuštenjima kao polje ServerPermissionInfo objekata.

ServerPermissionSet

Predstavlja skup poslužiteljskih dopuštenja. Klasa ServerPermissionSet koristi se za određivanje višestrukih dopuštenja za metode Grant(), Deny() i Revoke() objekta Server.

Dopuštenja baze podataka SMO klase koje se koriste za upravljanje dopuštenjima baze podataka opisane su u tablici 11-13. Tablica 11-13. SMO klase za upravljanje dopuštenjima baze podataka Klasa

Opis

DatabasePermission

Predstavlja dopuštenje baze podataka SQL Server. Objekt DatabasePermissionSet, koji sadrži skup DatabasePermission objekata, koristi se za zadavanje dopuštenja za metode Grant(), Deny() i Revoke() objekta Database.

DatabasePermissionInfo

Predstavlja informacije o dopuštenjima poslužiteljske razine za poslužitelj baze podataka. Metoda EnumDatabasePermissions() klase Database vraća informacije o dopuštenjima kao polje DatabasePermissionInfo objekata.

DatabasePermissionSet

Predstavlja skup dopuštenja baze podataka. Klasa DatabasePermissionSet koristi se za određivanje višestrukih dopuštenja za metode Grant(), Deny() i Revoke() objekta Database.

Aplikacijske uloge SMO klase koje se koriste za upravljanje aplikacijskim ulogama opisane su u tablici 11-14. Tablica 11-14. SMO klase za upravljanje aplikacijskim ulogama Klasa

Opis

ApplicationRole

Predstavlja aplikacijsku sigurnosnu ulogu koja se koristi za postavljanje povlastica aplikacije.

ApplicationRoleCollection

Predstavlja kolekciju aplikacijskih uloga kao ApplicationRole objekte. Svojstvo ApplicationRoles klase Database vraća kolekciju uloga definiranih na bazi podataka.

ApplicationRoleEvents

Predstavlja postavke potrebne za obavijest o događajima aplikacijske uloge SQL Servera. Objekt ApplicationRoleEvents dobiven je upotrebom svojstva Events objekta ApplicationRole te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase ApplicationRoleEvents navodi događaje koji mogu primiti objekt ObjectEventSet. Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 291

.NET Framework sklopovi SQL Server 2005 kroz CLR integraciju omogućuje stvaranje objekata baze podataka, kao što su funkcije, pohranjene procedure, okidači, korisnički definirani tipovi podataka i korisnički definirane agregatne funkcije iz .NET Framework sklopova. SMO klase koje se koriste za rad sa sklopovima .NET Frameworka opisane su u tablici 11-15. Tablica 11-15. SMO klase za upravljanje .NET Framework sklopovima Klasa

Opis

SqlAssembly

Predstavlja .NET Framework sklop.

SqlAssemblyCollection

Predstavlja kolekciju sklopova kao SqlAssembly objekte. Svojstvo Assemblies klase Database vraća SqlAssemblyCollection objekt koji sadrži sve .NET Framework sklopove definirane na bazi podataka.

SqlAssemblyEvent

Predstavlja događaj sklopa. Klasa SqlAssemblyEvent sadrži svojstvo za svaki događaj na koji baza podataka može odgovoriti.

SqlAssemblyEvents

Predstavlja postavke potrebne za obavijest o događajima sklopova SQL Servera. Objekt SqlAssemblyEvents dobiven je upotrebom svojstva Events objekta SqlAssembly te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase SqlAssemblyEvents navodi događaje koje može primiti objekt SqlAssemblyEventSet.

SqlAssemblyEventSet

Predstavlja skup događaja baze podataka SQL Server, a koristi se za zadavanje skupa događaja za klasu DatabaseEvent.

SqlAssemblyFile

Predstavlja binarnu datoteku koja pohranjuje sklop .NET Frameworka.

SqlAssemblyFileCollection

Predstavlja kolekciju datoteka .NET Framework sklopova kao SqlAssemblyFile objekte. Svojstvo SqlAssemblyFiles klase SqlAssembly vraća SqlAssemblyFileCollection objekt koji sadrži sve datoteke asocirane sa sklopovima.

Krajnje točke Krajnja točka je usluga koja izvorno može slušati zahtjeve. Ona može izložiti metode klijentima koji je pozivaju. Krajnje točke mogu koristiti HTTP ili TCP protokole te obrađivati SOAP, Service Broker, T-SQL ili sadržaje dupliciranja datoteke. SMO klase koje se koriste za upravljanje krajnjim točkama opisane su u tablici 11-16. Tablica 11-16. SMO klase za upravljanje krajnjim točkama Klasa

Opis

DatabaseMirroringPayload

Predstavlja sadržaj dupliciranja baze podataka SQL Servera. Svojstvo DatabaseMirroring klase Payload vraća DatabaseMirroringPayload objekt

Endpoint

Predstavlja uslugu krajnje točke SQL Servera.

koji predstavlja sadržaj dupliciranja baze podataka za krajnju točku.

292 | Programiranje SQL Server 2005

Tablica 11-16. SMO klase za upravljanje krajnjim točkama (nastavak) Klasa

Opis

EndpointCollection

Predstavlja kolekciju krajnjih točaka kao Endpoint objekte Svojstvo Endpoints klase Server vraća kolekciju krajnjih točaka definiranih na instanci SQL Servera.

EndpointProtocol

Predstavlja protokol krajnje točke. Svojstvo Protocol klase Endpoint vraća Protocol objekt koji predstavlja protokol za krajnju točku.

HttpProtocol

Predstavlja HTTP protokol. Svojstvo Http klase Protocol vraća HttpProtocol objekt koji predstavlja HTTP protokol.

Payload

Predstavlja HTTP sadržaj krajnje točke. Svojstvo Payload klase Endpoint vraća Payload objekt koji predstavlja sadržaj za krajnju točku.

Protocol

Predstavlja protokol koji koristi krajnja točka.

ServiceBrokerPayload

Predstavlja SQL Server Service Broker sadržaj. Svojstvo ServiceBroker klase Payload vraća ServiceBrokerPayload objekt koji predstavlja Service Broker sadržaj za krajnju točku.

SoapPayload

Predstavlja SQL Server SOAP sadržaj. Svojstvo Soap klase Payload vraća SoapPayload objekt koji predstavlja SOAP sadržaj za krajnju točku.

SoapPayloadMethod

Predstavlja metodu SOAP sadržaja.

SoapPayloadMethodCollection

Predstavlja kolekciju metoda SOAP sadržaja kao SoapPayloadMethod objekte. Svojstvo SoapPayloadMethods klase SoapPayload vraća kolekciju metoda SOAP sadržaja definiranih za SOAP sadržaj.

TcpProtocol

Predstavlja TCP protokol. Svojstvo Tcp klase Protocol vraća TcpProtocol objekt koji predstavlja TCP protokol.

XML sheme XML sheme služe za potvrdu XML dokumenata i instanci tipova podataka te za definiranje složenih XML tipova podataka. SMO klase koje se koriste za upravljanje XML shemama opisane su u tablici 11-17. Tablica 11-17. SMO klase za upravljanje XML shemama Klasa

Opis

XmlSchemaCollection

Predstavlja kolekciju XML imenskih prostora.

XmlSchemaCollectionCollection

Predstavlja kolekciju XML imenskih prostora kao XmlSchemaCollection objekte. Svojstvo XmlSchemaCollections klase Database vraća kolekciju XML imenskih prostora definiranih na bazi podataka.

Jezici SMO klase koje se koriste za upravljanje podržanim jezicima opisane su u tablici 11-18.

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 293

Tablica 11-18. SMO klase za upravljanje podržanim jezicima Klasa

Opis

Language

Predstavlja jezik SQL Servera.

LanguageCollection

Predstavlja kolekciju jezika SQL Servera kao Language objekte. Svojstvo Languages klase Server vraća kolekciju jezika koje podržava instanca SQL Servera.

Statistike Statistike sadrže informacije o distribuciji vrijednosti u stupcu. Ove se informacije upotrebljavaju za izračunavanje optimalnih planova upita. SMO klase koje se koriste za upravljanje statistikama SQL Servera opisane su u tablici 11-19. Tablica 11-19. SMO klase za upravljanje statistikama Klasa

Opis

Statistic

Predstavlja statistički brojač SQL Servera.

StatisticCollection

Predstavlja kolekciju statističkih brojača SQL Servera kao Statistic objekte. Svojstvo Statistics klase Table vraća StatisticCollection objekt koji sadrži sve statističke brojače definirane za tablicu.

StatisticColumn

Predstavlja stupac definiran u statističkom brojaču SQL Servera.

StatisticColumnCollection

Predstavlja kolekciju stupaca definiranih u statističkom brojaču SQL Servera kao StatisticColumn objekte. Svojstvo StatisticColumns klase Statistic vraća StatisticColumnCollection objekt koji sadrži sve statističke stupce definirane u statističkom brojaču.

StatisticEvents

Predstavlja postavku potrebnu za obavijest o događajima statistike SQL Servera. Objekt StatisticEvents dobiven je upotrebom svojstva Events objekta Statistic te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase StatisticEvents navodi događaje koji mogu primiti objekt ObjectEventSet.

Certifikati Certifikat je digitalno potpisani iskaz koji spaja vrijednost javnog ključa s osobom, uslugom ili uređajem koji ima odgovarajući privatni ključ. SMO klase koje se koriste za upravljanje certifikatima opisane su u tablici 11-20. Tablica 11-20. SMO klase za upravljanje certifikatima Klasa

Opis

Certificate

Predstavlja certifikat SQL Servera.

CertificateCollection

Predstavlja kolekciju certifikata SQL Servera kao Certificate objekte. Svojstvo Certificates klase Database vraća kolekciju certifikata definiranih na bazi podataka.

294 | Programiranje SQL Server 2005

Tablica 11-20. SMO klase za upravljanje certifikatima (nastavak) Klasa

Opis

CertificateEvents

Predstavlja postavke potrebne za obavijest o događajima certifikata SQL Servera. Objekt CertificateEvents dobiven je upotrebom svojstva Events objekta Certificate te ne može biti stvoren kao samostalni objekt. Metoda SubscribeToEvents() klase CertificateEvents navodi događaje koji mogu primiti objekt ObjectEventSet.

Vjerodajnice Vjerodajnica sadrži informacije o provjeri identiteta potrebne za uspostavljanje veze s osiguranim resursom izvan SQL Servera. Vjerodjnica može biti asocirana s višestrukim korisničkim računima SQL Servera, ali korisnički račun može biti preslikan samo na jednu vjerodajnicu. SMO klase koje se koriste za upravljanje vjerodajnicama opisane su u tablici 11-21. Tablica 11-21. SMO klase za upravljanje vjerodajnicama Klasa

Opis

Credential

Vjerodajnica SQL Servera.

CredentialCollection

Predstavlja kolekciju vjerodajnica SQL Servera kao Credential objekte. Svojstvo Credentials klase Server vraća kolekciju vjerodajnica definiranih na instanci SQL Servera.

Ključevi SMO klase koje se koriste za upravljanje asimetričnim i simetričnim ključevima opisane su u tablici 11-22. Tablica 11-22. SMO klase za upravljanje ključevima Klasa

Opis

AsymmetricKey

Predstavlja asimetrični ključ SQL Servera.

AsymmetricKeyCollection

Predstavlja kolekciju asimetričnih ključeva kao AsymmetricKey objekte. Svojstvo AsymmetricKeys klase Database vraća kolekciju asimetričnih ključeva definiranih na bazi podataka.

SymmetricKey

Predstavlja simetrični ključ SQL Servera.

SymmetricKeyCollection

Predstavlja kolekciju simetričnih ključeva kao SymmetricKey objekte. Svojstvo SymmetricKeys klase Database vraća kolekciju simetričnih ključeva definiranih na bazi podataka.

SymmetricKeyEncryption

Predstavlja tip šifriranja (simetrični, certifikat, lozinka ili simetrični) koji se koristi pri šifriranju objekta simetričnog ključa. Metoda AddKeyEncryption() klase SymmetricKey dodaje tip šifriranja simetričnom ključu.

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 295

Sinonimi Sinonim je objekt baze podataka koji pruža alternativno ime za objekt baze podataka, bilo na lokalnom poslužitelju ili na udaljenom poslužitelju. SMO klase koje se koriste za upravljanje sinonimima SQL Servera opisane su u tablici 11-23. Tablica 11-23. SMO klase za upravljanje sinonimima Klasa

Opis

Synonym

Predstavlja sinonim SQL Servera.

SynonymCollection

Predstavlja kolekciju sinonima SQL Servera kao Synonym objekte. Svojstvo Synonyms klase Database vraća SynonymCollection objekt koji sadrži sinonime definirane na bazi podataka.

SynonymEvents

Predstavlja postavke potrebne za obavijest o događajima sinonima SQL Servera.

Sistemske poruke SMO klase koje se koriste za upravljanje sistemskim porukama opisane su u tablici 11-24. Tablica 11-24. SMO klase za upravljanje sistemskim porukama Klasa

Opis

SystemMessage

Predstavlja sistemsku poruku definiranu na instanci SQL Servera.

SystemMessageCollection

Predstavlja kolekciju sistemskih poruka SQL Servera kao SystemMessage objekte. Svojstvo SystemMessages klase Server vraća SystemMessageCollection objekt koji sadrži sve sistemske poruke definirane na instanci SQL Servera.

Korisnički definirane poruke SMO klase koje se koriste za upravljanje korisnički definiranim porukama pogrešaka i upozorenja, opisane su u tablici 11-25. Tablica 11-25. SMO klase za upravljanje korisnički definiranim porukama Klasa

Opis

UserDefinedMessage

Predstavlja korisnički definiranu poruku na instanci SQL Servera.

UserDefinedMessageCollection

Predstavlja kolekciju korisnički definiranih poruka SQL Servera kao UserDefinedMessage objekte. Svojstvo UserDefinedMessages klase Server vraća UserDefinedMessageCollection objekt koji sadrži sve korisnički definirane poruke na instanci SQL Servera.

296 | Programiranje SQL Server 2005

Full-Text Search Full-Text Search omogućuje izvođenje lingvističkih pretraga prema riječima i izrazima u podacima. SMO klase za upravljanje Full-Text Search katalozima i indeksima opisane su u tablici 11-26. Tablica 11-26. SMO klase za rad sa Full-Text Searchom Klasa

Opis

FullTextCatalog

Predstavlja katalog cjelokupnog teksta koji omogućuje programsku izradu, upravljanje i konfiguriranje kataloga.

FullTextCatalogCollection

Predstavlja kolekciju kataloga cjelokupnog teksta kao FullTextCatalog objekte. Svojstvo FullTextCatalogs klase Database vraća FullTextCatalogCollection objekt koji sadrži sve kataloge cjelokupnog teksta definirane na bazi podataka.

FullTextIndex

Predstavlja indeks cjelokupnog teksta koji omogućuje programsku izradu, upravljanje i konfiguriranje indeksa. Svojstvo FullTextIndex klasa Table ili View vraća indeks cjelokupnog teksta na tablici ili u pregledu.

FullTextIndexColumn

Predstavlja stupac u indeksu cjelokupnog teksta koji omogućuje programsku izradu, upotrebu i konfiguriranje stupca.

FullTextIndexColumnCollection

Predstavlja kolekciju stupaca indeksa cjelokupnog teksta kao FullTextIndexColumnCollection objekte. Svojstvo IndexedColumns klase FullTextIndex vraća FullTextIndexColumnCollection objekt koji sadrži sve stupce definirane na indeksu cjelokupnog teksta.

FullTextService

Pruža programski pristup postavkama Full-Text Searcha. Svojstvo FullText klase Server vraća implementaciju usluge cjelokupnog teksta za instancu SQL Servera.

OLE DB pružatelji SMO klase koje se koriste za upravljanje OLE DB pružateljima SQL Servera opisane su u tablici 11-27. Tablica 11-27. SMO klase za upravljanje OLE DB pružateljima Klasa

Opis

OleDbProviderSettings

Predstavlja postavke za SQL Server OLE DB pružatelj.

OleDbProviderSettingsCollection

Predstavlja kolekciju OleDbProviderSettings objekata. Svojstvo OleDbProviderSettings klase Settings vraća kolekciju postavki OLE pružatelja definiranih na instanci SQL Servera. Svojstvo Settings klase Server vraća Settings objekt koji predstavlja skup konfigurabilnih postavki na instanci SQL Servera.

Poglavlje 11: SQL Server Management Objects (SMO) klase instance, 2. dio | 297

POGLAVLJE 12

SQL Server Management Objects (SMO) pomoćne klase

SMO pomoćne klase izvode posebne zadatke te rade neovisno o instanci SQL Servera. SMO pomoćne klase mogu se grupirati prema svojim funkcijama: • Operacije skriptiranja baze podataka • Izrađivanje sigurnosne kopije i restauriranje baze podataka • Prijenos shema i podataka između instanci baza podataka • Operacije praćenja i ponovnog izvođenja rezultata praćenja • Administriranje podsustava Database Mail Odlomci u ovom poglavlju opisuju SMO pomoćne klase i kroz primjere programiranja pokazuju kako ih upotrijebiti. Postoje još tri SMO klase koje će biti raspravljene u kasnijim poglavljima: • SMO klase koje se upotrebljavaju za administriranje SQL Server Agenta obrađene su u poglavlju 16. • SMO klase koje se upotrebljavaju za administriranje Service Brokera obrađene su u poglavlju 17. • SMO klase koje se upotrebljavaju za administriranje Notification Services obrađene su u poglavlju 18. Svi su primjeri u ovom odlomku izrađeni upotrebom Visual Studija 2005. Primjeri trebaju referencu na sljedeće sklopove: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.Smo Dodatne reference na sklopove bit će navedene za primjere u kojima su ti sklopovi potrebni.

Skriptiranje Nacrt baze podataka možete dokumentirati generiranjem T-SQL skripti za različite objekte. Moguće upotrebe za ove skripte su sljedeće: 298

• Sigurnosne kopije za ponovno stvaranje objekata ako bude potrebno. • Stvaranje razvojnih, testnih, pripremnih i proizvodnih okolina. SQL Server Management Studio omogućava skriptiranje odabranog objekta baze podataka. Za generiranje skripti SQL Servera možete izabrati upotrebu ručnog procesa ili čarobnjaka Generate SQL Server Scripts. SMO klase koje se koriste za operacije skriptiranja opisane su u tablici 12-1. Te se klase nalaze u imenskom prostoru Microsoft.SqlServer.Management.Smo. Tablica 12-1. SMO klase za operacije skriptiranja Klasa

Opis

Scripter

Pruža programski pristup postavkama i funkcionalnosti skriptiranja, uključujući pronalaženje zavisnosti, izlaganje skripti i upravljanje kontekstom operacije skriptiranja.

ScriptingErrorEventArgs

Predstavlja argumente koji se koriste za izvješćivanje o pogreški tijekom operacije skriptiranja. ScriptingErrorEventArgs izvedena je iz EventArgs.

ScriptingOptions

Predstavlja opcije za operacije skriptiranja. One prepoznaju elemente SQL Servera koje treba skriptirati te nadziru operaciju.

ScriptOption

Predstavlja opciju skriptiranja SQL Servera. Klasa ScriptOption sadrži svojstvo za svaki tip elementa SQL Servera koji može biti skriptiran.

Ovaj odlomak pokazuje kako programski upotrijebiti SMO klase skriptiranja. Trebate dodati referencu na sklop Microsoft.SqlServer.SmoEnum kako biste preveli i izveli primjere u ovom odlomku. Uniform Resource Name (URN) adresa jedinstveno identificira svaki objekt SQL Servera. Prvi i sljedeći primjer koriste URN adrese za zadavanje objekata koje treba skriptirati. Prvi primjer pokazuje kako upotrijebiti klasu Scripter za skriptiranje objekata u bazi podataka AdventureWorks: using System; using System.Data; using System.Collections.Specialized; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Scripter scripter = new Scripter(server); StringCollection sc = scripter.Script(new Urn[] { db.Urn }); foreach (string s in sc)

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 299

Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 12-1.

Slika 12-1. Rezultati skriptiranja objekata baze podataka AdventureWorks

Metoda Script() klase Scripter generira T-SQL koji može biti upotrijebljen za stvaranje objekata SQL Servera koje identificira polje SqlSmoObject, polje Urn ili objekt UrnCollection, proslijeđen konstruktoru kao argument. Metoda Script() vraća T-SQL kao StringCollection objekt. Svojstvo Options izlaže objekt ScriptingOptions koji omogućuje kontroliranje operacija skriptiranja. Sljedeći primjer skriptira sve tablice u AdventureWorks: using System; using System.Data; using System.Collections.Specialized; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo;

300 | Programiranje SQL Server 2005

class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; UrnCollection urnc = new UrnCollection( foreach (Table t in db.Tables) urnc.Add(t.Urn);

);

Scripter scripter = new Scripter(server); StringCollection sc = scripter.Script(urnc); foreach (string s in sc) Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue." ); Console.ReadKey( ); } }

Djelomični rezultati prikazani su na slici 12-2.

Slika 12-2. Rezultati primjera skriptiranja AdventureWorks tablica upotrebom klase UrnCollection

Metoda Script() klase Scripter je preopterećena. Uz prihvaćanje objekta UrnCollection kako je prikazano u prethodnom primjeru, ona može primiti i popis objekata kao polje Urn ili polje SqlSmoObject. SMO klase koje se koriste za upravljanje URN adresama opisane su u tablici 12-2.

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 301

Tablica 12-2. SMO klase za upravljanje URN adresama Klasa

Opis

Urn

Predstavlja URN adresu.

UrnCollection

Predstavlja kolekciju Urn objekata.

Klasa SqlSmoObject opća je klasa koja predstavlja sve objekte SQL Servera. Sljedeći primjer koristi klasu SqlSmoObject za stvaranje istih rezultata kao i prethodni primjer: using System; using System.Data; using System.Collections.Specialized; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Table[] ta = new Table[db.Tables.Count]; db.Tables.CopyTo(ta, 0); SqlSmoObject[] ssoa = new SqlSmoObject[db.Tables.Count]; Array.Copy(ta, ssoa, ta.Length); Scripter scripter = new Scripter(server); StringCollection sc = scripter.Script(ssoa); foreach (string s in sc) Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Djelomični su rezultati prikazani na slici 12-3. Statička metoda EnumDependencies() klase Scripter vraća UrnCollection objekt koji sadrži zadani objekt i njegove roditeljske objekte ili objekte potomke, ovisno o vrijednosti drugog argumenta iz enumeracije DependencyType. Sljedeći primjer upotrebljava metodu EnumDependencies() za skriptiranje prve tablice u AdventureWorks i njenih objekata potomaka: using System; using System.Data; using System.Collections.Specialized;

302 | Programiranje SQL Server 2005

Slika 12-3. Rezultati primjera skriptiranja AdventureWorks tablice upotrebom klase SqlSmoObject using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; Scripter scripter = new Scripter(server); UrnCollection urnc = Scripter.EnumDependencies( db.Tables[0], DependencyType.Children); StringCollection sc = scripter.Script(urnc); foreach (string s in sc) Console.WriteLine(s); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 12-4. Rezultat sadrži T-SQL skriptu za generiranje tablice pod imenom AWBuildVersion i njenih potomaka – samo jednog okidača ažuriranja na tablici. Objekt Scripter izaziva tri tipa događaja, opisana u tablici 12-3.

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 303

Slika 12-4. Rezultati primjera skriptiranja jedne AdventureWorks tablice i njenih potomaka Tablica 12-3. Scripter događaji Događaj

Opis

DiscoveryProgress

Izvješćuje o napretku u intervalima tijekom metode DiscoverDependencies().

ScriptingError

Izvješćuje o pogreški tijekom operacije skriptiranja.

ScriptingProgress

Izvješćuje o napretku u intervalima tijekom metode Script().

Ovaj primjer prima i obrađuje događaj ScriptingProgress: using System; using System.Data; using System.Collections.Specialized; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; UrnCollection urnc = new UrnCollection( foreach (Table t in db.Tables) urnc.Add(t.Urn); Scripter scripter = new Scripter(server);

);

304 | Programiranje SQL Server 2005

scripter.ScriptingProgress += new ProgressReportEventHandler(ScriptingProgressEventHandler); StringCollection sc = scripter.Script(urnc); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } protected static void ScriptingProgressEventHandler( object sender, ProgressReportEventArgs e) { Console.WriteLine("(" + e.TotalCount + "/" + e.Total + ") " + e.Current); } }

Djelomični rezultati prikazani su na slici 12-5.

Slika 12-5. Rezultati primjera nadziranja napretka skriptiranja

Izrada sigurnosnih kopija i restauriranje podataka SMO klase za izradu sigurnosnih kopija i restauriranje imaju nekoliko zadaća: • Izrada sigurnosnih kopija i restauriranje podataka i dnevnika događaja • Izvođenje provjera integriteta • Ispitivanje postojanosti baze podataka SMO klase za izradu igurnosne kopije i restauriranje opisane su u tablici 12-4. Te se klase nalaze u imenskom prostoru Microsoft.SqlServer.Management.Smo.

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 305

Tablica 12-4. SMO klase za upravljanje operacijama izrade sigurnosnih kopija i restauriranja Klasa

Opis

Backup

Pruža programski pristup operacijama SQL Servera za izradu sigurnosnih kopija.

BackupDevice

Uređaj za izradu sigurnosnih kopija – jedinicu s vrpcom ili disk jedinicu koja se koristi za izradu sigurnosne kopije.

BackupDeviceCollection

Predstavlja kolekciju uređaja za izradu kopija kao BackupDevice objekte. Svojstvo BackupDevices klase Server vraća kolekciju svih uređaja za izradu kopija na instanci SQL Servera.

BackupDeviceItem

Pruža programski pristup uređajima za izradu kopija prema imenu.

PercentCompleteEventArgs

Detalji o događaju do kojeg dolazi kad proces izrade kopije ili restauriranja dosegne oznaku o postotku dovršenosti.

RelocateFile

Pruža mehanizam za premještanje datoteka tijekom operacije restauriranja. Klasa RelocateFile koristi se sa svojstvom RelocateFiles klase Restore.

Restore

Programski pristup operacijama SQL Servera za restauriranje. Klasa Restore omogućava restauriranje cijele baze podataka ili njenog dijela i dnevničkih izvješća o transakciji, provjeru integriteta medija za sigurnosnu kopiju, identificiranje sadržaja medija za kopiju i nadziranje statusa restauriranja.

VerifyCompleteEventArgs

Detalji o događaju do kojeg dolazi kad se dovrši provjera sigurnosne kopije.

Ovaj odlomak pokazuje kako programski upotrijebiti SMO klase za izradu sigurnosnih kopija i restauriranje. Sljedeći primjer pravi sigurnosnu kopiju baze podataka AdventureWorks u datoteku: using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { BackupDeviceItem bdi = new BackupDeviceItem("AdventureWorks.bak", DeviceType.File); Backup bu = new Backup( ); bu.Database = "AdventureWorks"; bu.Devices.Add(bdi); bu.Initialize = true; // Dodaje obradu događaja za postotak dovršenosti i dovršenost operacije bu.PercentComplete += new PercentCompleteEventHandler(Backup_PercentComplete); bu.Complete +=new ServerMessageEventHandler(Backup_Complete); Server server = new Server("localhost"); bu.SqlBackup(server); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( );

306 | Programiranje SQL Server 2005

} protected static void Backup_PercentComplete( object sender, PercentCompleteEventArgs e) { Console.WriteLine(e.Percent + "% processed."); } protected static void Backup_Complete(object sender, ServerMessageEventArgs e) { Console.WriteLine(Environment.NewLine + e.ToString( )); } }

Kad je dovršena, datoteka sigurnosne kopije AdventureWorks.bak smještena je (podrazumijevano) u mapu C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup. Rezultati su prikazani na slici 12-6.

Slika 12-6. Rezultati primjera izrade sigurnosne kopije

Klasa Backup pruža programski pristup operacijama SQL Servera za izradu sigurnosne kopije. Za konfiguriranje Backup objekta u ovom primjeru postavljena su tri svojstva: Database Navodi bazu podataka za koju treba izraditi sigurnosnu kopiju. Devices Postavlja uređaj za izradu sigurnosne kopije kao instancu BackupDeviceItem. Initialize Zadaje inicijalizira li se uređaj za izradu sigurnosne kopije kao dio operacije izrade kopije. Postoje i druga neobavezna svojstva koja dodatno kontroliraju operaciju izrade rezervne kopije. Dodaje se PercentCompleteEventHandler kako bi napredak operacije izrade sigurnosne kopije mogao biti prikazan na konzoli. ServerMessageEventHandler prikazuje status operacije BACKUP DATABASE. Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 307

Konačno, poziva se metoda SqlBackup() da izvede operaciju izrade sigurnosne kopije baze podataka. Sljedeći primjer restaurira sigurnosnu kopiju stvorenu u prethodnom primjeru: using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; class Program { static void Main(string[] args) { Server server = new Server("localhost"); BackupDeviceItem bdi = new BackupDeviceItem( "AdventureWorks.bak", DeviceType.File); Restore r = new Restore( ); r.Database = "AdventureWorks"; r.ReplaceDatabase = true; r.Devices.Add(bdi); // Dodaje obradu događaja za postotak dovršenosti i dovršenost operacije r.PercentComplete += new PercentCompleteEventHandler(Restore_PercentComplete); r.Complete += new ServerMessageEventHandler(Restore_Complete); r.SqlRestore(server); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } protected static void Restore_PercentComplete( object sender, PercentCompleteEventArgs e) { Console.WriteLine(e.Percent + "% processed."); } protected static void Restore_Complete(object sender, ServerMessageEventArgs e) { Console.WriteLine(Environment.NewLine + e.ToString( )); } }

Rezultati su prikazani na slici 12-7. Klasa Restore pruža programski pristup operacijama restauriranja SQL Servera. Za konfiguriranje Restore objekta u ovom primjeru postavljena su tri svojstva:

308 | Programiranje SQL Server 2005

Slika 12-7. Rezultati primjera restauriranja

• Svojsvo Database koje navodi bazu podataka na kojoj se izvodi operacija restauriranja. • Svojstvo ReplaceDatabase koje zadaje stvara li operacija izrade sigurnosne kopije novi prikaz restaurirane baze podataka. • Svojstvo Devices koje postavlja uređaj sa sigurnosnom kopijom za operaciju restauriranja kao instancu BackupDeviceItem. Postoje i druga neobavezna svojstva koja nisu upotrijebljena u ovom primjeru za dodatnu kontrolu izrade sigurnosne kopije. Metoda za obradu događaja PercentCompleteEventHandler dodaje se kako bi napredak operacije restauriranja mogao biti prikazan na konzoli. Metoda za obradu događaja ServerMessageEventHandler dodaje se za prikaz detalja događaja RESTORE DATABASE. Konačno, poziva se metoda SqlRestore() da izvede operaciju restauriranja baze podataka. Operacija restauriranja zahtijeva isključivi pristup bazi podataka koja se restaurira.

Prijenos podataka SMO klasa Transfer koristi se za programski prijenos (kopiranje) podataka i shema unutar i između instanci SQL Servera. Ova je klasa u imenskom prostoru Microsoft. SqlServer.Management.Smo. Primjer pokazuje kako prenijeti bazu podataka AdventureWorks u novu bazu podataka pod imenom AdventureWorksCopy: using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo;

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 309

class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; // Stvara odredišnu bazu podataka Database dbCopy = new Database(server, "AdventureWorksCopy"); dbCopy.Create( ); // Prenosi podatke Transfer t = new Transfer(db); t.CopyAllTables = true; t.Options.WithDependencies = true; t.DestinationServer = server.Name; t.DestinationDatabase = "AdventureWorksCopy"; t.CopySchema = true; t.CopyData = true; // Priprema obradu događaja za prikaz napredovanja t.DataTransferEvent += new DataTransferEventHandler(DataTransferEvent_Handler); t.TransferData(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } protected static void DataTransferEvent_Handler( object sender, DataTransferEventArgs e) { Console.WriteLine("[" + e.DataTransferEventType + "] " + e.Message); } }

Djelomični rezultati prikazani su na slici 12-8. Šest je svojstava postavljeno za konfiguriranje Transfer objekta u ovom primjeru: • Svojstvo CopyAllTables postavljeno je na true. • Svojstvo Options.WithDependencies postavljeno je na true. • Svojstvo DestinationServer postavljeno je na ime poslužitelja koji je odredište za kopiju objekta. U ovom slučaju odredišni poslužitelj je lokalni poslužitelj i isti je kao i izvorni poslužitelj. • Svojstvo DestinationDatabase postavljeno je na ime baze podataka na odredišnom poslužitelju. • Svojstvo CopySchema postavljeno je na true. • Svojstvo CopyData postavljeno je na true.

310 | Programiranje SQL Server 2005

Slika 12-8. Rezultati primjera prijenosa podataka

Postoje i druga neobavezna svojstva koja nisu upotrijebljena u ovom primjeru za dodatnu kontrolu operacije prijenosa. Metoda za obradu događaja DataTransfer dodaje se kako bi napredak pri kopiranju svake baze podataka mogao biti izložen u prozoru konzole. Konačno, poziva se metoda TransferData() da izvede operaciju prijenosa podataka.

Praćenje SMO klase za praćenje i ponovno izvođenje pružaju sučelje s kojim se prate i bilježe događaji, upravlja se podacima praćenja i izvodi analiza te se ponovno izvode zabilježeni događaji praćenja. Sistemske pohranjene procedure SQL Profilera i SQL Tracea mogu također obaviti ove zadatke. SMO klase koje se koriste za upravljanje operacijama praćenja i ponovnog izvođenja opisane su u tablici 12-5. Ove su klase smještene u imenskom prostoru Microsoft. SqlServer.Management.Trace. Tablica 12-5. SMO klase za upravljanje operacijama praćenja i ponovnog izvođenja Klasa

Opis

ReplayEventArgs

Predstavlja argumente za izvješćivanje o događajima do kojih dolazi tijekom ponovnog izvođenja.

TraceEventArgs

Predstavlja argumente za izvješćivanje o događajima do kojih dolazi tijekom praćenja.

TraceFile

Predstavlja dnevničku datoteku praćenja.

TraceReplay

Predstavlja operaciju ponovnog izvođenja za dnevničke datoteke i tablice.

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 311

Tablica 12-5. SMO klase za upravljanje operacijama praćenja i ponovnog izvođenja (nastavak) Klasa

Opis

TraceReplayOptions

Predstavlja konfiguracijske postavke za ponovno izvođenje rezultata praćenja. Svojstvo Options klase TraceReplay vraća TraceReplayOptions objekt za operaciju ponovnog izvođenja.

TraceServer

Predstavlja novo praćenje na instanci SQL Servera.

TraceTable

Predstavlja tablicu informacija o praćenju.

Primjeri u ovom odlomku pokazuju kako programski upotrijebiti SMO klase za praćenje kako bi se presreli i ponovno izveli događaji praćenja. Prvi primjer zapisuje imena prvih 20 događaja dnevnika praćenja na konzolu upotrebom standardne datoteke definicije praćenja, Standard.tdf, podrazumijevano instalirane u mapu C:\Program Files\Microsoft SQL Server\90\Tools\Profiler\Templates\ Microsoft SQL Server\90. using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Trace; class Program { static void Main(string[] args) { TraceServer ts = new TraceServer(

);

ConnectionInfoBase ci = new SqlConnectionInfo("localhost"); ((SqlConnectionInfo)ci).UseIntegratedSecurity = true; ts.InitializeAsReader(ci, @"C:\Program Files\Microsoft SQL Server\90\Tools\Profiler\" + @"Templates\Microsoft SQL Server\90\Standard.tdf"); int eventNumber = 0; while (ts.Read( )) { Console.Write(ts.GetValue(0) + Environment.NewLine); eventNumber++; if (eventNumber == 20) break; } ts.Close( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 12-9.

312 | Programiranje SQL Server 2005

Slika 12-9. Rezultati primjera praćenja

Datoteka definicije praćenja odlučuje o informacijama sadržanim u praćenju – koje će se događaje i koje stupce podataka praćenja presresti za svaki događaj. Ovaj primjer prikazuje samo prvi stupac – ime događaja praćenja. Cjeloviti popis stupaca možete dobiti pregledom standardne datoteke definicije upotrebom SQL Server Profilera. Sljedeći primjer ponovno izvodi postojeću dnevničku datoteku praćenja. Upotrijebite postojeću datoteku praćenja ili izradite datoteku praćenja za upotrebu sa SQL Server Profilerom slijedeći ove korake: 1. Otvorite SQL Server Profiler odabirom opcije Start ➝ Microsoft SQL Server 2005 ➝ Performance Tools ➝ SQL Server Profiler. 2. S glavnog izbornika odaberite File ➝ New Trace. 3. Popunite dijaloški okvir Connect to Server i pritisnite gumb Connect. 4. Prihvatite podrazumijevane vrijednosti u dijaloškom okviru Trace Properties i pritisnite Run. 5. Dopustite da se praćenje izvodi za približno 20 događaja, a tada ga zaustavite odabirom File ➝ Stop Trace. 6. Spremite praćenje tako što ćete odabrati File ➝ Save u datoteku C:\PSS2005\ Trace\TestTrace.trc. Slijedi izvorni kod za ovaj primjer: using System; using System.Data; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Trace; class Program {

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 313

static void Main(string[] args) { TraceReplay tr = new TraceReplay( ); TraceFile tf = new TraceFile( ); tf.InitializeAsReader(@"C:\PSS2005\Trace\TestTrace.trc"); tr.Source = tf; tr.Connection = new SqlConnectionInfo("localhost"); tr.ReplayEvent += new ReplayEventHandler(tr_ReplayEvent); tr.Start( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } static void tr_ReplayEvent(object sender, ReplayEventArgs args) { Console.WriteLine("--- Record number: " + args.RecordNumber + " ---"); for (int i = 0; i < args.CurrentRecord.FieldCount; i++) Console.WriteLine(args.CurrentRecord[i].ToString( )); Console.WriteLine(

);

} }

Djelomični rezultati prikazani su na slici 12-10. Naravno, vaši će rezultati biti ponešto drugačiji. Primjer prikazuje sve podatke u datoteci praćenja. U ovom primjeru ima 17 izvješća, od kojih su prikazana posljednja 2.

Database Mail SMO klasa SqlMail daje programski pristup za konfiguriranje i nadziranje podsustava SQL Server Database Mail. Klasa SqlMail ne daje pristup poštanskim sandučićima ni mogućnost slanja ili primanja poruka. Iz sigurnosnih razloga Database Mail je podrazumijevano neaktivan. Morate upotrijebiti ili alat SQL Server Surface Area Configuration ili čarobnjaka Database Mail Configuration kako biste aktivirali Database Mail.

Database Mail profil je kolekcija korisničkih računa. Database Mail korisnički račun sadrži informacije za poslužitelje elektroničke pošte. Korisnički račun može biti dio jednog ili više profila. Aplikacije šalju elektroničku poštu upotrebom profila, a ne korisničkih računa. To poboljšava i fleksibilnost i pouzdanost jer korisnički računi mogu biti dodani ili uklonjeni iz profila bez mijenjanja aplikacije ili njene konfiguracije. Profili mogu biti konfigurirani tako da rezervni sustav odmah zamjenjuje glavni u slučaju blokiranja. Korisnici i aplikacije mogu imati pristup do jednog ili više profila. Profili su ili javni ili privatni. Javni su profili definirani na razini poslužitelja i na raspolaganju su korisnicima u svim matičnim bazama podataka za slanje i primanje 314 | Programiranje SQL Server 2005

Slika 12-10. Djelomični rezultati primjera ponovnog izvođenja praćenja

elektroničke pošte. Privatni su profili definirani u određenoj bazi podataka, a pristup za slanje elektroničke pošte upotrebom profila općenito je ograničen na određene korisnike i uloge. Profili su podrazumijevano privatni. Slika 12-11 prikazuje relaciju između SMO klasa Database Maila. SMO klase Database Maila opisane su u tablici 12-6. To su klase iz imenskog prostora Microsoft.SqlServer.Management.Smo.Mail. Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 315

SqlMail

ConfigurationValue

MailAccount

MailProfile

MailServer

Slika 12-11. Hijerarhija SMO klasa Database Maila Tablica 12-6. SMO klase za Database Mail Klasa

Opis

ConfigurationValue

Predstavlja konfiguracijsku opciju SQL Server Database Maila.

ConfigurationValueCollection

Predstavlja kolekciju konfiguracijskih opcija SQL Server Database Maila kao ConfigurationValue objekte. Svojstvo ConfigurationValues klase SqlMail vraća kolekciju opcija definiranih na podsustavu SQL Server Database Mail.

MailAccount

Predstavlja korisnički račun SQL Server Database Maila.

MailAccountCollection

Predstavlja kolekciju korisničkih računa SQL Server Database Maila kao MailAccount objekte. Svojstvo Accounts klase SqlMail vraća kolekciju profila

MailProfile

Predstavlja profil SQL Server Database Maila.

MailProfileCollection

Predstavlja kolekciju profila SQL Server Database Maila kao MailProfile objekte. Svojstvo Profiles klase SqlMail vraća kolekciju profila pošte definiranih na podsustavu SQL Server Database Mail.

MailServer

Predstavlja poslužitelj SQL Server Database Maila.

MailServerCollection

Predstavlja kolekciju poslužitelja SQL Server Database Maila kao MailServer objekte. Svojstvo MailServers klase MailAccount vraća kolekciju poslužitelja pošte asociranih s korisničkim računom za poštu.

SqlMail

Predstavlja podsustav SQL Server Database Mail.

pošte definiranih na podsustavu SQL Server Database Mail.

Sljedeći primjer enumerira SQL Server Database Maila profile i korisničke račune unutar svakog profila: using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Mail; class Program

316 | Programiranje SQL Server 2005

{ static void Main(string[] args) { Server server = new Server("localhost"); SqlMail mail = server.Mail; foreach (MailProfile mp in mail.Profiles) { Console.WriteLine(mp.Name); DataTable dt = mp.EnumAccounts( ); foreach (DataRow row in dt.Rows) for (int i = 0; i < dt.Columns.Count; i++) Console.WriteLine(" " + dt.Columns[i].ColumnName + ": " + row[i]); Console.WriteLine( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 12-12.

Slika 12-12. Rezultati enumeriranja SQL Server Database Maila

Rezultati pokazuju kako ogledna instanca SQL Servera ima jedan profil, pod imenom Test profile, koji ima jedan korisnički račun, pod imenom Test account. Svojstvo Mail klase Server vraća SqlMail objekt koji predstavlja podsustav SQL Server Database Mail za poslužitelj. Svojstvo Profiles klase SqlMail vraća kolekciju MailProfile objekata koji predstavljaju profile za poštu definirane na podsustavu za poštu. Metoda EnumAccounts() klase MailProfile vraća objekt DataTable koji sadrži informacije o korisničkim računima za elektroničku poštu povezanim s profilom.

Poglavlje 12: SQL Server Management Objects (SMO) pomoćne klase | 317

POGLAVLJE 13

Windows Management Instrumentation (WMI) programiranje

Usluge, mrežne postavke i postavke poslužiteljskog pseudonima SQL Servera pregledavate i njima upravljate koristeći Windows Management Instrumentation (WMI) Provider za Configuration Management. Klasa ManagedComputer u imenskom prostoru Microsoft.SqlServer.Management.Smo.Wmi predstavlja instalaciju WMI-ja na instanci SQL Servera. Ona pruža pristup WMI Provideru za Configuration Management. Klasa ManagedComputer vrhovna je klasa u SMO WMI hijerarhiji, baš kao što je klasa Server vrhovna klasa među SMO klasama instance. ManagedComputer objekti operiraju neovisno o Server objektima. WMI Provider za Configuration Management možete upotrijebiti na jedan od tri načina: • Upotrijebite editor za Windows Management Instrumentation Query Language (WQL) ili alat za upite kao što je WBEMT.exe za izvedbu upita. • Upotrijebite jezik za skriptiranje kao što je VBScript, JScript ili Perl u koji možete umetnuti i izvesti WQL upite. • Upotrijebite klasu ManagedComputer u imenskom prostoru Microsoft.SqlServer. Management.Smo.Wmi iz .NET SMO aplikacije. Ova knjiga se bavi samo upotrebom klase ManagedComputer u .NET SMO aplikaciji. Za više informacija o drugim mogućnostima pogledajte Microsoft SQL Server 2005 Books Online.

Programiranje SMO WMI klasa Slika 13-1 prikazuje relaciju između SMO klasa koje se upotrebljavaju s WMI Providerom za Configuration Management. Ovaj odlomak pokazuje kako programski upotrijebiti SMO WMI klase. Svi su primjeri u odlomku izrađeni upotrebom Visual Studija 2005. Kako biste preveli i izveli primjere trebate referencu na sljedeće sklopove: 318

ManagedComputer

WmiConnectionInfo

ClientProtocol

ServerProtocol

Service

ServiceInstance

NetLibInfo

ClientProtocol Property

ServerProtocol Property

ServerIPAddress

ServerAlias

IPAddressProperty

Slika 13-1. SMO klase koje se koriste s WMI Providerom za Configuration Management

• Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.Smo • Microsoft.SqlServer.WmiEnum U primjerima u kojima su oni potrebni biti će navedene dodatne reference na sklopove.

Enumeriranje instalacije WMI-ja Ovaj primjer demonstrira kako instancirati ManagedComputer objekt te iterirati kroz njegovu hijerarhiju kolekcija kako bi se enumerirale informacije o instalaciji WMI-a. Primjer popisuje klijentske protokole, postavke za vezu, poslužiteljske pseudonime, instance usluga i usluge na lokalnom stroju. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Wmi; class Program { static void Main(string[] args) { ManagedComputer mc = new ManagedComputer(

);

Console.WriteLine("-Client Protocols-"); foreach (ClientProtocol cp in mc.ClientProtocols) Console.WriteLine(cp.DisplayName + ": " + (cp.IsEnabled ? "Enabled" : "Disabled"));

Poglavlje 13: Windows Management Instrumentation (WMI) programiranje | 319

Console.WriteLine(Environment.NewLine + "-Connection Settings-"); WmiConnectionInfo wci = mc.ConnectionSettings; Console.WriteLine("MachineName = " + wci.MachineName); Console.WriteLine("Timeout = " + wci.Timeout); Console.WriteLine("Username = " + wci.Username); Console.WriteLine(Environment.NewLine + "-Server Aliases-"); foreach (ServerAlias sa in mc.ServerAliases) Console.WriteLine(sa.Name + ": " + sa.State); Console.WriteLine(Environment.NewLine + "-Server Instances-"); foreach (ServerInstance si in mc.ServerInstances) Console.WriteLine(si.Name + ": " + si.State); Console.WriteLine(Environment.NewLine + "-Services-"); foreach (Service s in mc.Services) Console.WriteLine(s.Name + ": " + s.ServiceState); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 13-2.

Slika 13-2. Rezultati enumeriranja instalacije WMI-ja

Klasa ManagedComputer, koja predstavlja instalaciju WMI-ja na instanci SQL Servera, ima preopterećeni konstruktor. Preopterećenje (engl. overload) upotrijebljeno u prethodnom primjeru ne uzima nikakve argumente te inicijalizira novu instancu za podrazumijevanu instancu SQL Servera. Druga dva preopterećenja dozvoljavaju zadavanje 320 | Programiranje SQL Server 2005

imena računala s kojim treba uspostaviti vezu te, neobavezno, ime korisničkog računa i lozinku. Klasa ManagedComputer izlaže WMI funkcionalnost kroz skup svojstava opisanih u tablici 13-1. Tablica 13-1. Javna svojstva klase ManagedComputer Svojstvo

Povratna vrijednost

Opis

ClientProtocols

ClientProtocolCollection

Uzima kolekciju ClientProtocol objekata, od kojih svaki predstavlja klijentski protokol definiran na instalaciji WMI-ja.

ConnectionSettings

WmiConnectionInfo

Uzima postavke za vezu za instalaciju WMI-ja.

Name

string

Uzima ime WMI objekta.

Properties

PropertyCollection

Uzima kolekciju Property objekata od kojih svaki predstavlja svojstvo definirano na WMI objektu.

ServerAliases

ServerAliasCollection

Uzima kolekciju ServerAlias objekata od kojih svaki predstavlja pseudonim poslužitelja definiran na instalaciji WMI-ja.

ServerInstances

ServerInstanceCollection

Uzima kolekciju ServerInstance objekata od kojih svaki predstavlja instancu SQL Servera na instalaciji WMI-ja.

Services

ServiceCollection

Uzima kolekciju Service objekata od kojih svaki predstavlja uslugu SQL Servera na instalaciji WMI-ja.

State

SqlSmoState

Uzima stanje WMI objekta.

Urn

Urn

Uzima URN ardesu za WMI objekt.

UserData

object

Uzima ili postavlja korisnički definirane podatke pridružene s WMI objektom.

Četiri kolekcije kojima se pristupa kroz svojstva klase ManagedComputer omogućuju pristup većini WMI funkcionalnosti. Ove kolekcije izlažu objekte podrobnije opisane u tablici 13-2. Tablica 13-2. Kolekcije klase ManagedComputer Klasa

Funkcija

ClientProtocol

Klasa ClientProtocol predstavlja mrežni protokol instaliran na klijentu koji omogućuje komunikaciju s instancom SQL Servera preko mreže. Klasa ClientProtocol omogućuje: • Uzimanje ili postavljanje imena za prikazivanje protokola. • Uključivanje ili isključivanje protokola. • Uzimanje datoteke informacija mrežne biblioteke za protokol kao NetLibInfo objekta. • Uzimanje imena datoteke mrežne biblioteke za protokol. • Uzimanje ili postavljanje redoslijeda po kojem će protokol biti popisan i primijenjen u odnosu na podržane protokole u objektu ClientProtocolCollection. • Pristupanje i modificiranje kolekcije atributa (kao ProtocolProperty objekata) definiranih na protokolu. Kolekciji ClientProtocol Objekata pristupa se kroz svojstvo ClientProtocols. Poglavlje 13: Windows Management Instrumentation (WMI) programiranje | 321

Tablica 13-2. Kolekcije klase ManagedComputer (nastavak) Klasa

Funkcija

ServerAlias

Pseudonim poslužitelja alternativno je ime koje možete upotrijebiti za vezu s instancom SQL Servera. Klasa ServerAlias omogućuje: • Uzimanje ili postavljanje niza znakova veze koji koristi pseudonim za vezu s instancom SQL Servera. • Uzimanje ili postavljanje imena za pseudonim. • Uzimanje ili postavljanje roditelja (kao ManagedComputer objekta) pseudonima. • Uzimanje ili postavljanje imena protokola kojeg koristi pseudonim. • Uzimanje ili postavljanje instance SQL Servera s kojom pseudonim uspostavlja vezu. • Izradu, osvježavanje ili ispuštanje pseudonima poslužitelja. Kolekciji ServerAlias objekata pristupa se kroz svojstvo ServerAliases.

ServerInstance

Klasa ServerInstance predstavlja instancu SQL Servera i omogućuje: • Uzimanje ili postavljanje imena instance poslužitelja. • Uzimanje ili postavljanje roditelja (kao ManagedComputer objekt) instance poslužitelja. • Pristupanje i modificiranje kolekcije protokola (kao kolekcije ServerProtocol objekata) definiranih na poslužitelju u instalaciji WMI-ja. Kolekciji ServerInstance objekata pristupa se kroz svojstvo ServerInstances.

Service

Klasa Service predstavlja instancu usluge SQL Servera i omogućuje: • Otkrivanje može li usluga biti pauzirana ili zaustavljena. • Dobivanje popisa usluga koje ovise o usluzi. • Uzimanje i prikazivanje imena usluge. • Uzimanje roditelja usluge (kao ManagedComputer objekta). • Uzimanje putanje binarne datoteke koja implementira uslugu. • Uzimanje identifikatora procesa koji jedinstveno identificira uslugu. • Uzimanje korisničkog računa pod kojim se usluga izvodi. • Uzimanje stanja usluge (npr. je li zaustavljena, pauzirana, u izvođenju, itd.). • Uzimanje metode po kojoj usluga započinje (kao enumeracijske vrijednosti ServiceStartMode). • Uzimanje parametra pokretanja za uslugu. • Mijenjanje lozinke za korisnički račun pod kojim se usluga izvodi. • Zaustavljanje, pauziranje, započinjanje ili nastavljanje usluge. • Osvježavanje usluge. • Postavljanje korisničkog računa pod kojim se usluga izvodi. Kolekciji Service objekata pristupa se kroz svojstvo Services.

SMO klase za WMI opisane su u tablici 13-3. Tablica 13-3. SMO klase koje se koriste s WMI Providerom za Configuration Management Klasa

Opis

ClientProtocol

Predstavlja klijentski mrežni protokol koji klijentu omogućuje komuniciranje s instancom SQL Servera preko mreže.

ClientProtocolCollection

Predstavlja kolekciju klijentskih protokola kao ClientProtocol objekte. Svojstvo ClientProtocols klase ManagedComputer vraća klijentske protokole definirane na instalaciji WMI-ja.

322 | Programiranje SQL Server 2005

Tablica 13-3. SMO klase koje se koriste s WMI Providerom za Configuration Management (nastavak) Klasa

Opis

ClientProtocolProperty

Predstavlja atribut klijentskog mrežnog protokola WMI-ja.

ClientProtocolPropertyCollection

Predstavlja kolekciju svojstava klijentskog protokola kao ClientProtocolProperty objekte. Svojstvo ProtocolProperties klase ClientProtocol vraća atribute klijentskog protokola.

IPAddressProperty

Predstavlja atribut IP adrese.

IPAddressCollection

Predstavlja kolekciju svojstava IP adrese kao IPAddressProperty objekte. Svojstvo IPAddressProperties klase ServerIPAddress vraća atribute IP adrese.

ManagedComputer

Predstavlja instalaciju WMI-ja na instanci SQL Servera.

NetLibInfo

Predstavlja informacije o datoteci mrežne biblioteke. Svojstvo NetLibInfo klase ClientProtocol vraća objekt NetLibInfo za protokol.

ServerAlias

Predstavlja pseudonim za poslužiteljsku vezu.

ServerAliasCollection

Predstavlja kolekciju poslužiteljskih pseudonima kao ServerAlias objekte. Svojstvo ServerAliases klase ManagedComputer vraća poslužiteljske pseudonime definirane na instalaciji WMI-ja.

ServerInstance

Predstavlja instancu SQL Servera.

ServerInstanceCollection

Predstavlja kolekciju instanci SQL Servera kao ServerInstance objekte. Svojstvo ServerInstances klase ManagedComputer vraća instance poslužitelja definirane na instalaciji WMI-ja.

ServerIPAddress

Predstavlja IP adresu poslužiteljskog protokola definiranu na instalaciji WMI-ja.

ServerIPAddressColection

Predstavlja kolekciju IP adresa kao ServerIPAddress objekte. Svojstvo IPAddresses klase ServerProtocol vraća IP adrese definirane na instalaciji WMI-ja.

ServerProtocol

Predstavlja poslužiteljski mrežni protokol koji omogućuje poslužitelju komuniciranje s klijentima SQL Servera preko mreže.

ServerProtocolCollection

Predstavlja kolekciju poslužiteljskih protokola kao ServerProtocol objekte. Svojstvo ServerProtocols klase ManagedComputer vraća poslužiteljske protokole definirane na instalaciji WMI-ja.

ServerProtocolProperty

Predstavlja atribut poslužiteljskog mrežnog protokola WMI-ja.

ServerProtocolPropertyCollection

Predstavlja kolekciju svojstava poslužiteljskog protokola kao ServerProtocolProperty objekte. Svojstvo ProtocolProperties klase ServerProtocol vraća atribute poslužiteljskog protokola.

Service

Predstavlja instancu usluge SQL Servera.

ServiceCollection

Predstavlja kolekciju usluga SQL Servera kao Service objekte. Svojstvo Services klase ManagedComputer vraća usluge definirane na instalaciji WMI-ja.

WmiConnectionInfo

Predstavlja informacije o vezi koje koristi instalacija WMI-ja. Svojstvo ConnectionSettings klase ManagedComputer vraća WmiConnectionInfo objekt za instalaciju WMI-ja.

Poglavlje 13: Windows Management Instrumentation (WMI) programiranje | 323

Stvaranje poslužiteljskog pseudonima Ovaj primjer demonstrira kako stvoriti nove SMO WMI objekte. Primjer stvara novi poslužiteljski pseudonim na lokalnoj instanci SQL Servera. To čini instanciranjem novog ServerAlias objekta, združujući ga s ManagedComputer objektom koji predstavlja WMI, a zatim pozivanjem metode Create() objekta ServerAlias. using System; using System.Data; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Wmi; class Program { static void Main(string[] args) { ManagedComputer mc = new ManagedComputer( ServerAlias sa = new ServerAlias( sa.ConnectionString = "1433"; sa.Name = "PSS2005 Alias"; sa.Parent = mc; sa.ProtocolName = "tcp"; sa.ServerName = "locahost"; sa.Create( );

);

);

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Slika 13-3 prikazuje novi pseudonim upotrebom alata SQL Server Configuration Manager (Start ➝ Microsoft SQL Server 2005 ➝ Configuration Tools ➝ SQL Server Configuration Manager).

Slika 13-3. Rezultati stvaranja poslužiteljskog pseudonima 324 | Programiranje SQL Server 2005

Pokretanje i zaustavljanje usluge Ovaj primjer pokazuje kako zaustaviti i pokrenuti uslugu zaustavljanjem i ponovnim pokretanjem usluge SQL Server Reporting Services: using System; using System.Data; using using using using

Microsoft.SqlServer.Management.Common; Microsoft.SqlServer.Management.Smo; Microsoft.SqlServer.Management.Smo.Wmi; System.Threading;

class Program { static void Main(string[] args) { ManagedComputer mc = new ManagedComputer(

);

Service s = mc.Services["ReportServer"]; Console.WriteLine("ReportServer status: " + s.ServiceState); s.Stop( ); Thread.Sleep(10000); s.Refresh( ); Console.WriteLine("ReportServer status: " + s.ServiceState); s.Start( ); Thread.Sleep(10000); s.Refresh( ); Console.WriteLine("ReportServer status: " + s.ServiceState); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 13-4.

Slika 13-4. Rezultati primjera zaustavljanja i pokretanja usluge

Klasa Service ima metode za kontroliranje stanja usluge – Start(), Pause(), Resume() i Stop(). Svojstva AcceptPause i AcceptStop trebaju biti provjerena prije pozivanja metoda Pause() ili Stop() kako bi se osiguralo da usluga može biti pauzirana ili zaustavljena.

Poglavlje 13: Windows Management Instrumentation (WMI) programiranje | 325

Primjer koristi statičku metodu Sleep() klase Thread za pauziranje od 10 sekundi kako bi omogućio dovršavanje operacija promjena stanja usluge. Metoda Refresh() klase Service osvježava uslugu SQL Servera kako bi se osiguralo aktualno stanje.

326 | Programiranje SQL Server 2005

POGLAVLJE 14

SQL Server Reporting Services (SSRS)

SQL Server 2005 Reporting Services (SSRS) je poslužitelj srednjeg sloja koji pruža okolinu za izvješćivanje koja se izvodi iznad Internet Information Services (IIS) poslužitelja. Izvješća možete izraditi iz bilo kojeg izvora podataka s pružateljem podataka kojim upravlja .NET Framework, OLE DB pružateljem ili ODBC pružateljem. To omogućuje izradu izvješća temeljenih na relacijskim, višedimenzionalnim i XML izvorima podataka iz širokog raspona poslužitelja baza podataka. Izvješću možete pristupiti navođenjem URL-a te upotrebom kontrole za pregled izvješća u Web ili Windows aplikaciji ili Web usluge Report Server. SSRS podržava tablične ili matrične oblike izvješća, izvješća u obliku grafikona i u slobodnom rasporedu, koja mogu biti kombinirana zajedno s grafičkim elementima u jednom izvješću ukoliko je to potrebno. Možete dodati veze prema dodatnim informacijama ili srodnim izvješćima te funkcionalnost stupnjevitog kretanja kroz mape. Izvješća mogu sadržavati i obavezne i neobavezne parametre. Ad hoc izvješćivanje podržano je kroz upotrebu Report Buildera – takozvane ClickOnce Windows aplikacije kojoj se pristupa preko URL-a http:///reportserver/reportbuilder/ reportbuilder.application s poslužitelja izvješća ili iz Report Managera. SSRS podržava raznolike formate izlaza, uključujući HTML 3.2, HTML 4.0, MHTML, PDF, XML, Excel, CSV te slike (TIFF). SSRS automatski pruža alatnu vrpcu za kretanje kroz stranice za formate koji podržavaju alatne vrpce. Pored toga, možete dodati mape dokumenata i obilježivače kako biste olakšali kretanje kroz opsežna izvješća. Postoje tri alata za oblikovanje izvješća. Report Designer je aplikacija za sastavljanje izvješća unutar Business Intelligence Development Studija. Report Designer omogućuje definiranje i izdavanje izvješća te njegov probni prikaz. Report Designer sadrži module za izradu upita, uređivanje izraza te čarobnjake koji pomažu u radu sa slikama i pravljenju jednostavnih uzvješća. Ad hoc izvješćivanje podržavaju dva alata: Model Designer koji upotrebljavate za definiranje, uređivanje i objavljivanje modela izvješća – poslovno orijentirane apstrakcije podataka za pomoć kod izrade ad hoc izvješća – te Report Builder koji upotrebljavate za stvaranje ad hoc izvješća na temelju objavljenih modela izvješća te za upravljanje s njima kao i s drugim izvješćima. 327

SSRS uključuje alate za konfiguriranje, nadzor i upravljanje. Sigurnosni sustav temeljen na ulogama kontrolira pristup mapama, izvješćima i resursima. Opcije za isporuku izvješća uključuju isporuku na zahtjev, kroz uključene Web dijelove SharePointa koji omogućuju pregled izvješća sa SharePoint stranice, automatizirano pretplatom ili na temelju podataka. SSRS je otvorena platforma za izvješća s mogućnošću proširenja. Možete upotrijebiti API da razvijete, instalirate i koristite proširenja komponenti SSRS-a kako bi podržavao zahtjeve prilagođenih podataka, isporuke i generiranja. Report Definition Language (RDL) koristi se za opisivanje rasporeda i sadržaja izvješća. RDL je gramatika temeljena na XML-u koju možete proširiti tako da implementira prilagođenu funkcionalnost. RDL može biti generiran ručno ili programski upotrebom Report Designera. Ovo poglavlje objašnjava kako programski pristupiti SSRS izvješćima te kako ih uključiti u aplikacije. Za više informacija o projektiranju, definiranju, isporučivanju i osiguravanju izvješća, pogledajte Microsoft SQL Server 2005 Books Online.

Započinjanje Primjeri u ovom poglavlju koriste bazu podataka AdventureWorks i pokazna izvješća. Slijedite ove upute za instaliranje pokaznih izvješća: 1. S izbornika Start odaberite Microsoft SQL Server 2005 ➝ Documentation and Tutorials ➝ Samples ➝ Microsoft SQL Server 2005 Samples kako biste instalirali pokazna izvješća. 2. Otvorite SQL Server Business Intelligence Development Studio. 3. Otvorite rješenje C:\Program Files\Microsoft SQL Server\90\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports\AdventureWorks Sample Reports.sln. 4. Sa alatne vrpce Standard odaberite konfiguraciju rješenja Production (umjesto podrazumijevanog Debug). 5. S glavnog izbornika odaberite Build ➝ Deploy AdventureWorks Sample Reports radi objavljivanja izvješća. 6. Otvorite Web preglednik i krećite se kroz stranice do virtualne mape za izvješća vašeg poslužitelja za izvješća, http:///reports. Ako je poslužitelj izvješća na lokalnom stroju, unesite URL http://localhost/reports. Mapa AdventureWorks Sample Reports popisana je u sadržaju Report Managera, kao što je prikazano na slici 14-1. 7. Pritisnite mapu AdventureWorks Sample Reports kako biste pregledali izvješća koja sadrži. Pritisnite jedno od izvješća da biste ga generirali.

328 | Programiranje SQL Server 2005

Slika 14-1. Report Manager

Integriranje izvješća u aplikacije SSRS vam omogućuje integriranje izvješća u aplikacije na tri različita načina: • Izdajte zahtjeve temeljene na URL-u za kretanje, pristup i pregled izvješća. Ovo je najučinkovitiji način generiranja izvješća jer zahtjevi temeljeni na URL-u izravno pristupaju poslužitelju. Izvješća temeljena na URL-u također je lako i učinkovito implementirati. Zahtjeve temeljene na URL-u možete koristiti i u Web i u Windows aplikacijama. U Windows aplikaciji, pokrenite Web preglednik u zasebnom prozoru ili prikažite izvješće u kontroli Web preglednika na obrascu. • Upotrijebite kontrolu preglednika izvješća za Visual Studio 2005 koja je u slobodnoj distribuciji kako biste uključili funkcionalnost Reporting Services u Windows ili Web aplikaciju. • Pristupite poslužitelju izvješća kroz Web uslugu Report Server upotrebom SOAP-a preko HTTP-a kao komunikacijskog sučelja između klijenta i poslužitelja izvješća. Pored pružanja mogućnosti za zahtjeve temeljene na URL-u, Web usluga izlaže funkcionalnost upravljanja izvješćima koja nije dostupna kroz URL pristup. To uključuje upravljanje sadržajem, pretplatom i izvorom podataka. Možete koristiti SOAP API i u Windows i u Web aplikacijama. Tipična aplikacija na razini poduzeća koristi više tih metoda kako bi udovoljila potrebama izvješćivanja. Tri su metode detaljnije opisane u sljedećim odjeljcima.

Pristup putem URL-a URL zahtjev sadrži informacije za identifikaciju poslužitelja izvješća kojeg treba upotrijebiti, kao i parametre koje obrađuje poslužitelj izvješća i koji kontroliraju oblikovanja Poglavlje 14: SQL Server Reporting Services (SSRS) | 329

i generiranje izvješća. Parametri, prefiksi parametara i kombinacije pruženih parametara u URL adresi odlučuju kako će poslužitelj izvješća obraditi određeni zahtjev. URL adrese poslužitelja izvješća prate smjernice oblikovanja W3C/IETF: • Parametri su razdvojeni znakom &. • Parovi ime/vrijednost povezani su znakom jednakosti (=). • Redoslijed parametara nije važan. Na primjer, unesite URL http://localhost/ReportServer?/AdventureWorks Sample Reports/Sales Order Detail&rs:Command=Render i u pregledniku će biti generirano izvješće prikazano na slici 14-2.

Slika 14-2. Izvješće o detaljima prodajne narudžbe

Informacije u URL-u navode da želite učiniti sljedeće: • Upotrijebiti lokalni poslužitelj izvješća. • Pristupiti izvješću u virtualnom korijenu poslužitelja izvješća ReportServer. • Pristupiti izvješću AdventureWorks Sample Reports/Sales Order Detail. • Generirati izvješće u podrazumijevanom formatu generiranja za preglednik.

330 | Programiranje SQL Server 2005

Sintaksa URL-a poslužitelja izvješća je: protocol://server/virtualroot?[/pathinfo]&[prefix:]param= value[&prefix:param=value]...n]

gdje je: protocol

URL protokol, obično http ili https. server

Ime računala na kojem se izvodi poslužitelj izvješća. virtualroot

Ime virtualnog korijena poslužitelja izvješća. pathinfo

Puna putanja elementa kojem se pristupa iz baze podataka poslužitelja izvješća. Element može biti jedan od četiri tipa opisana u tablici 14-1. Tablica 14-1. Tipovi URL elemenata Tip elementa

Opis

Data Source

Prikazuje izvor podataka ako je identitet korisnika provjeren s dopuštenjem Read Contents za izvor podataka.

Folder

Vraća opću stranicu za kretanje kroz mape koja sadrži veze prema podmapama, izvješćima, izvorima podataka i resursima u mapi.

Report

Generira i vraća određeno izvješće.

Resource

Vraća određeni resurs za izvješće.

prefix

Pristupa određenom procesu koji se izvodi na poslužitelju izvješća. Ako nije naveden, parametar se obrađuje kao parametar izvješća (rs). Tablica 14-2 opisuje raspoložive prefikse. Tablica 14-2. Prefiksi URL parametara Prefiks parametra

Opis

rc

Zadaje informacijske postavke za uređaj, uključujući one za izvješća namijenjena za HTML Viewer. Informacijske postavke za HTML uređaj opisane su u tablici 14-5. Uređaj se zadaje upotrebom parametra rs:Format poslužitelja izvješća. Valjane vrijednosti ovise o proširenjima za generiranje instaliranima na poslužitelju izvješća. Uobičajeni uređaji uključuju HTML 3.2, HTML 4.0, CSV, Excel, Image (TIFF), MHTML, PDF i XML.

rs

Zadaje konfiguracijske postavke za poslužitelj izvješća.

dsu

Zadaje korisničko ime za pristup izvoru podataka.

dsp

Zadaje lozinku za pristup izvoru podataka.

Poglavlje 14: SQL Server Reporting Services (SSRS) | 331

param

Ime parametra. Parametri kontroliraju način na koji se izvješća obrađuju i generiraju. value

Vrijednost parametra. Parametri poslužitelja izvješća imaju prefiks rs i koriste se za kontroliranje obrade izvješća. Tablica 14-3 opisuje parametre poslužitelja izvješća. Tablica 14-3. Parametri poslužitelja izvješća Parametar

Opis

Command

Zadaje tip zahtjeva podnesenog poslužitelju izvješća. Tablica 14-4 opisuje moguće vrijednosti. Ako parametar rs:Command nije naveden, poslužitelj izvješća procjenjuje URL i odabire odgovarajuću naredbenu vrijednost. Zadavanje vrijednosti za rs:Command poboljšat će izvedbu. Samo jedan parametar rs:Command može biti zadan u URL-u.

Format

Zadaje format za generiranje izvješća. Metoda ListExtensions () klase ReportingService (u Web usluzi ReportService) vraća proširenja za generiranje instalirana na instanci poslužitelja izvješća. Sljedeći odlomak koda pokazuje kako: ReportingService rs = new ReportingService( ); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; Extension[] re = rs.ListExtensions(ExtensionTypeEnum.Render);

ParameterLanguage

Zadaje jezik za URL parametre neovisan o jeziku preglednika. Vrijednost je oznaka kulturološkog područja, poput en-US. Podrazumijevani je jezik preglednika.

Snapshot

Generira izvješće na temelju snimka povijesti izvješća. Vrijednost ovog parametra mora biti valjani identifikator snimka u formatu ISO 8601 standarda YYY-MM-DDTHH:MM:SS.

Tablica 14-4 opisuje vrijednosti parametra rs:Command. Tablica 14.4. Vrijednosti parametra rs:Command Vrijednost

Opis

GetDataSourceContents

Prikazuje vrijednost zadanog izvora podataka kao XML. Ova parametarska vrijednost odgovara pozivanju metode Web usluge GetDataSourceContents().

GetResourceContents

Generira resurs i prikazuje ga kao HTML. Ova parametarska vrijednost odgovara pozivanju metode Web usluge GetResourceContents().

ListChildren

Prikazuje potomke elementa proslijeđenog u URL-u. Ova parametarska vrijednost odgovara pozivanju metode Web usluge ListChildren().

Render

Generira određeno izvješće. Ova parametarska vrijednost odgovara pozivanju metode Render() Web usluge.

Primjerice, unošenje ovog URL-a u preglednik prikazat će sve elemente potomke mape AdventureWorks Sample Reports: http://localhost/reportserver?/AdventureWorksSampleReports&rs:Command=ListChildren. 332 | Programiranje SQL Server 2005

Informacijske postavke za HTML uređaj kontroliraju način generiranja izvješća u HTML formatu. Informacijske postavke za HTML uređaj, a i druge informacijske postavke za uređaje, imaju prefiks rc. Tablica 14-5 opisuje informacijske postavke za HTML uređaj. Pogledajte Microsoft SQL Server 2005 Books Online za više detalja o postavkama za druge uređaje. Tablica 14-5. Informacijske postavke za HTML uređaj Parametar

Opis

BookmarkID

Identifikator obilježivača na koji se treba prebaciti u izvješću.

DocMap

Određuje je li karta dokumenta izvješća vidljiva. Vrijednost true prikazuje kartu dokumenta, a vrijednost false je skriva. Podrazumijevana vrijednost je true.

DocMapID

Identifikator karte dokumenta do kojeg treba doći listanjem izvješća.

EndFind

Zadnja stranica izvješća koju treba pronaći. Podrazumijevana vrijednost je trenutna stranica. Upotrijebite ovaj parametar zajedno s parametrom StartFind.

FallbackPage

Broj stranice koju treba prikazati ako pretraga ili odabir karte dokumenta ne uspiju. Podrazumijeva se trenutna stranica.

FindString

Tekst koji treba potražiti u izvješću. Podrazumijevana je vrijednost prazan niz znakova.

GetImage

Ikona za korisničko sučelje HTML Viewer.

HTMLFragment

Zadaje stvara li se HTML fragment umjesto čitavog HTML dokumenta. HTML fragment ispušta HTML oznake i . Podrazumijevana vrijednost je false.

Icon

Ikona za određeno proširenje generiranja.

JavaScript

Određuje je li JavaScript podržan u generiranom izvješću.

LinkTarget

Cilj za hiperveze u izvješću. Ova vrijednost može biti isti prozor, novi prozor, okvir itd. Zadaje se postavljanjem vrijednosti parametra na _blank, _self, _parent ili _top.

Parameters

Zadaje je li područje parametara alatne vrpce vidljivo. Vrijednost true prikazuje područje parametara, a vrijednost false ga skriva. Podrazumijevana vrijednost je true.

ReplacementRoot

Putanja koja se koristi kao prefiks vrijednosti atributa href elemenata A u HTML izvješću koje je vratio poslužitelj. Ovu vrijednost podrazumijevano pruža poslužitelj.

Section

Stranica izvješća koju treba prikazati. Podrazumijevana vrijednost je 1. Ako je vrijednost parametra veća od broja stranica izvješća, prikazuje se zadnja stranica.

StartFind

Prva stranica izvješća koju treba pronaći. Podrazumijevana vrijednost je trenutna stranica. Upotrijebite ovaj parametar zajedno s parametrom EndFind.

StreamRoot

Putanja koja se koristi kao prefiks vrijednosti atributa src elementa IMG u HTML izvješću koje je vratio poslužitelj. Podrazumijevano, ovu vrijednost pruža poslužitelj.

StyleSheet

Opis stila koji treba primijeniti na HTML Viewer.

StyleStream

Zadaje izrađuju li se stilovi i skripte kao posebni tokovi umjesto unutar dokumenta. Vrijednost true stvara poseban tok, a vrijednost false stavlja stilove i skripte u dokument. Podrazumijevana vrijednost je false.

Toolbar

Zadaje je li vidljiva alatna vrpca. Vrijednost true prikazuje alatnu vrpcu za formate generiranja koji podržavaju alatnu vrpcu. Vrijednost false skriva alatnu vrpcu. Podrazumijevana vrijednost je true.

Type

Kratko ime za preglednik kako je definirano u browscap.ini.

Zoom

Vrijednost zumiranja izvješća. Vrijednost može biti postotak ili konstanata niza znakova Page Width ili Whole Page. Podrazumijevana je vrijednost postotak s cijelim brojem 100.

Poglavlje 14: SQL Server Reporting Services (SSRS) | 333

Možete upotrijebiti parametar poslužitelja izvješća za kontroliranje formata za generiranje izvješća. URL http://localhost/reportserver?/AdventureWorks Sample Reports/CompanySales&rs:Command=Render&rs:Format=IMAGE generira izvješće kao TIFF sliku. URL http://localhost/reportserver?/AdventureWorks Sample Reports/Company Sales&rs:Command=Render&rs:Format=XML generira izvješće kao XML datoteku. Informacijske postavke za HTML uređaj kontroliraju način na koji se izvješće prikazuje u pregledniku. URL http://localhost/reportserver?/AdventureWorks Sample Reports/Company Sales&rs:Command=Render&rc:Toolbar=false&rc:Zoom=200 generira izvješće dvostruke veličine, bez alatne vrpce. Parametri izvješća prosljeđuju se u URL-u kao parovi ime/vrijednost povezani znakom jednakosti (=). Proslijedite parametar null upotrebom sintakse parameterName: isNull=true. Uočite kako parametri izvješća nemaju prefiksa. Na primjer, izvješće Employee Sales Summary uzima tri parametra: ReportMonth (cjelobrojna vrijednost), ReportYear (cjelobrojna vrijednost) i EmpID (niz znakova). Kada normalno pokrenete izvješće, RDL puni padajući popis zaposlenika upotrebom DataSeta pod imenom SalesEmps. Ovo odgovara sljedećem upitu: SELECT E.EmployeeID, C.FirstName + N' ' + C.LastName AS Employee FROM HumanResources.Employee E INNER JOIN Sales.SalesPerson SP ON E.EmployeeID = SP.SalesPersonID INNER JOIN Person.Contact C ON E.ContactID = C.ContactID ORDER BY C.LastName, C.FirstName

Moramo pokrenuti ovaj upit kako bismo utvrdili identifikator zaposlenika za svakog zaposlenika. Jillian Carson ima identifikator zaposlenika 277. URL: http://localhost/reportserver?/AdventureWorks Sample Reports/Employee SalesSummary&rsCommand=Render&EmpID=277&ReportMonth=7& ReportYear=2002

postavlja parametre izvješća tako da vraćaju zbirni pregled prodaje za Jillian Carson za srpanj 2002. godine. Prethodni primjeri pokazuju kako zatražiti izvješće upotrebom URL-a. To je ekvivalent metodi HTTP GET. Izvješće možete zatražiti i upotrebom metode HTTP POST koja prenosi parametarske parove ime/vrijednost u HTTP zaglavlje umjesto u URL. Upotreba metode HTTP POST prelazi preko maksimalnog dopuštenog ograničenja dužine URL-a u slučajevima kad je popis parametara dugačak, a i sigurnija je jer korisnik ne može izravno modificirati imena i vrijednosti parametara. Sljedeći HTML kod vraća isti zbirni pregled prodaje za Jillian Carson za srpanj 2002. godine kao u prethodnom primjeru, ali koristi metodu HTTP POST:

334 | Programiranje SQL Server 2005



Kontrola Report Viewer Kontrola preglednika izvješća je u slobodnoj distribuciji i isporučuje se s Visual Studiom 2005. Zove se ReportViewer i nalazi se u kategoriji Data na paleti alata u Visual Studiju 2005. Kontrolu možete povući na Windows ili Web obrazac. Izbornik kontrole ReportViewer ponudit će vam opcije „Choose Report“ ili „Design a new report“. Odaberite „Design a new report“ kako bi se pojavio Report Designer. Odaberite i bit će vam ponuđeno da unesete Report Server Url i Report Path. Ispunite te vrijednosti i pokrenite aplikaciju – izvješće će se pojaviti u kontroli. Na primjer, vrijednost za Report Server Url postavite na http://localhost/reportserver, a Report Path na /AdventureWorks Sample Reports/Company Sales. Pokrenite aplikaciju – ako ste izradili Windows Forms aplikaciju, izgledat će kao na slici 14-3.

Slika 14-3. Izvješće o prodaji tvrtke AdventureWorks od 2002. do 2003. godine

Poglavlje 14: SQL Server Reporting Services (SSRS) | 335

Poslužitelj izvješća i putanja izvješća mogu biti navedeni u trenutku izvođenja kroz svojstva objekta ServerReport kojeg izlaže svojstvo ServerReport kontrole, kao što je prikazano u sljedećem odlomku koda: reportViewer1.ServerReport.ReportServerUrl = new Uri(@"http://localhost/reportserver"); reportViewer1.ServerReport.ReportPath = @"/AdventureWorks Sample Reports/Company Sales";

Web usluga Report Server SSRS pruža potpuni pristup funkcionalnosti poslužitelja izvješća kroz Web usluge Report Servera. Web usluga pruža metode i svojstva za izvedbu izvješća – kontrolirajući obradu i generiranje izvješća – i za upravljanje izvješćima. Možete razviti Reporting Services aplikacije koje koriste Web usluge Report Servera s .NET Frameworkom, upotrebom skriptne okoline Reporting Servicesa i pomoćnog programa rs (rs.exe), ili upotrebom bilo kojeg razvojnog alata sposobnog pozivati SOAP metode. Ovaj odjeljak opisuje samo prvi pristup. Za informacije o druga dva pristupa pogledajte Microsoft SQL Server 2005 Books Online. Ovo su koraci koje trebate slijediti kako biste izradili aplikaciju koja koristi Web usluge Report Servera (uskoro ćete izraditi stvarni primjer): 1. Izradite novu Windows aplikaciju u Visual Studiju 2005. 2. U Solution Exploreru dodajte Web referencu na Web uslugu ReportService s lokalnog stroja. To učinite tako što ćete desnom tipkom miša pritisnuti čvor Web References u Solution Exploreru te odabrati Add Web Reference iz kontekstnog izbornika. Otvorit će se stranica Start Browsing for Web Services dijaloškog okvira Add Web Reference, prikazana na slici 14-4. 3. Pritisnite vezu „Web services on the local machine“ kako bi se otvorio dijaloški okvir prikazan na slici 14-5. 4. Pritisnite uslugu ReportService kako bi se otvorio dijaloški okvir prikazan na slici 14-6. S popisa Web reference name odaberite ReportService i pritisnite gumb Add Reference. 5. Dodajte direktivu using na vrh klase za Web uslugu ReportService. Na primjer, ako ste aplikaciju nazvali MyApp, direktiva using bila bi sljedeća: using MyApp.ReportService;

6. Napravite instancu klase posrednika, kao što je prikazano u sljedećem odlomku: ReportingService rs = new ReportingService(

);

7. Proslijedite vjerodajnice za provjeru identiteta Web usluzi. Sljedeći kod prosljeđuje podrazumijevane Windows vjerodajnice: rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

336 | Programiranje SQL Server 2005

Slika 14-4. Stranica Start Browsing for Web Services

8. Pozovite metode Web usluge poslužitelja izvješća iz vaše aplikacije. Nakon što je posrednik instanciran i pozivateljev identitet provjeren, ovo se obavlja na isti način kao i kod bilo koje druge metode .NET Frameworka. Kao primjer, izradimo Windows Forms aplikaciju koja prikazuje padajući popis izvješća raspoloživih u mapi AdventureWorks Sample Reports (slika 14-7). Kad odaberete izvješće s popisa i pritisnete gumb Render, izvješće će biti spremljeno u datoteku Web stranice (HTML). Obratite pažnju na to da, ako odaberete izvješće koje zahtijeva parametre, poput Employee Sales Summary, bit će izbačena iznimka ReportParameterValueNotSetException. Argument polja ParameterValue uvijek je prosljeđen kao null kako bi primjer ostao jednostavan. Da biste izradili primjer, napravite Windows aplikaciju pod imenom ReportServerWebService. Obrascu dodajte popis i nazovite ga reportListBox. Dodajte mu i gumb renderButton. Dodajte Web referencu Web usluzi ReportService i dajte joj ime ReportService. Prepišite sljedeći kod u obrazac: using using using using using

System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing;

Poglavlje 14: SQL Server Reporting Services (SSRS) | 337

Slika 14-5. Stranica Web services on the local machine using System.Text; using System.Windows.Forms; using System.IO; using ReportServerWebService.ReportService; namespace ReportServerWebService { public partial class MainForm : Form { private string reportPath = @"/AdventureWorks Sample Reports"; public MainForm( ) { InitializeComponent( }

);

private void MainForm_Load(object sender, EventArgs e) { ReportingService rs = new ReportingService( ); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; CatalogItem[] cis = rs.ListChildren(reportPath, false); foreach (CatalogItem ci in cis) {

338 | Programiranje SQL Server 2005

Slika 14-6. Stranica „ReportingService“ Description

Slika 14-7. Pregled pokusnih izvješća AdventureWorksa if(ci.Type == ItemTypeEnum.Report) reportListBox.Items.Add(ci.Name); } } private void renderButton_Click(object sender, EventArgs e)

Poglavlje 14: SQL Server Reporting Services (SSRS) | 339

{ if (reportListBox.SelectedIndex >= 0) { string reportName = reportListBox.Items[reportListBox.SelectedIndex].ToString(

);

SaveFileDialog sfd = new SaveFileDialog( ); sfd.Filter = "Web page format (*.html)|*.html"; sfd.FileName = reportName; if (sfd.ShowDialog( ) == DialogResult.OK) { string renderFileName = sfd.FileName; ReportingService rs = new ReportingService( ); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string reportFullName = reportPath + "/" + reportName; string format = "HTML4.0"; string historyID = null; string deviceInfo = null; ParameterValue[] pv = null; DataSourceCredentials[] dsc = null; string showHideToggle = null; string encoding; string mimeType; ParameterValue[] parameterUsed = null; Warning[] warning = null; string[] streamIds = null; byte[] report; try { report = rs.Render(reportFullName, format, historyID, deviceInfo, pv, dsc, showHideToggle, out encoding, out mimeType, out parameterUsed, out warning, out streamIds); using (FileStream fs = File.OpenWrite(renderFileName)) fs.Write(report, 0, report.Length); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } } }

340 | Programiranje SQL Server 2005

Pokretanje primjera otvara prozor aplikacije s popisom koji sadrži raspoloživa izvješća. Odaberite izvješće Company Sales i pritisnite gumb Render. Izvješće je spremljeno kao Company Sales.html na lokaciji koju zadate. Slijedi odlomak ove datoteke: Company Sales ...  Bikes $26,664,534 $35,199,346  Accessories $93,797 $595,014

Slika 14-8 prikazuje izvješće otvoreno u Internet Exploreru. Metoda Render() uzima argumente koji identificiraju izvješće te zadaju kako generirati rezultate u tok bajtova koji može biti spremljen u datoteku ili prikazan. Informacijske postavke za uređaj prosljeđuju se metodi Render() kao XML element . Informacijske postavke za HTML uređaj opisane su u tablici 14-5, ranije u poglavlju. Na primjer, da biste izvješće zumirali 200%, argument deviceInfo metode Render() postavite kako slijedi: 200

Poglavlje 14: SQL Server Reporting Services (SSRS) | 341

Slika 14-8. Rezultati primjera generiranja izvješća u datoteku

Proširenja za Reporting Services SQL Server Reporting Services projektirani su tako da se mogu proširivati. Imenski prostor Microsoft.ReportingServices.DataProcessing sadrži sučelja koja omogućuju da proširite Reporting Services kako bi se u izvješća integrirali prilagođeni podaci. Imenski prostor Microsoft.ReportingServices.Interfaces sadrži sučelja koja omogućuju proširivanje mehanizama Reporting Servicesa za isporuku i izradu prilagođenih sigurnosnih proširenja za Reporting Services. Imenski prostor Microsoft.Reporting. ReportRendering sadrži klase i sučelja za proširivanje mogućnosti Reporting Servicesa u generiranju izvješća. Za više informacija o razvoju proširenja za Reporting Services, pogledajte Microsoft SQL Server Books Online.

342 | Programiranje SQL Server 2005

POGLAVLJE 15

SQL Server Integration Services (SSIS)

SQL Server Integration Services (SSIS) je platforma za izradu rješenja integracije i tokova te rješenja za izdvajanje, trasformiranje i učitavanje podataka u skladište podataka. Uobičajeni scenariji integracije uključuju spajanje podataka iz raznorodnih izvora podataka, punjenje skladišta podataka, standardizaciju podataka te izvođenje administrativnih funkcija poput izrade sigurnosnih kopija, kopiranja i učitavanja podataka. SQL Server 2005 pruža grafičke alate za izradu rješenja integracije podataka. Također možete izraditi, održavati i koristiti integraciju podataka programski, upotrebom izvornog ili upravljanog koda. Ovo poglavlje pruža pregled SSIS-a i demonstrira programiranje SSIS upravljanog koda.

Arhitektura SSIS se sastoji od četiri ključna dijela: Usluga Integration Services Upravlja pohranom paketa te nadzire izvođenje Integration Services paketa. Objektni model Integration Services Obuhvaća izvorne i upravljane API-je za pristupanje alatima Integration Servicesa, pomoćnim programima za odzivnik i vlastitim aplikacijama. Izvedbena okolina Integration Services Sprema raspored paketa, izvodi pakete te podržava zapisivanje u dnevnik događaja, točke prekida, konfiguraciju, veze i transakcije. Izvedbene datoteke SSIS-a su paketi, kontejneri, zadaci i metode za obradu događaja koji izvode funkcionalnost toka. Tokovi podataka Premještaju podatke iz izvora na odredište s optimalnom transformacijom. Postoje tri tipa komponenti tokova podataka – izvor, transformacija i odredište. 343

SSIS objekti SSIS objektni model izgrađen je na osam primarnih objekata: Paket Kolekcija veza, elemenata kontrolnog toka, elemenata toka podataka, metoda za obradu događaja, varijabli i konfiguracija stvorenih upotrebom alata za grafički dizajn SSIS-a ili izrađen programski. Kontrolni tok Zadaci, kontejneri i ograničenja koja povezuju izvedbene dijelova u uređeni tok podataka. Tok podataka Izvori i odredišta koja izdvajaju i učitavaju podatke, transformacije podataka te putanje koje povezuju izvore, transformacije i odredišta. Tok podataka stvara se unutar zadatka toka podataka – izvedbeni dio koji stvara, uređuje i izvodi tok podataka. Upravljač vezama Zadaje niz znakova veze za pristupanje podacima koje upotrebljavaju zadaci, transformacije i metode za obradu događaja u paketu. Metoda za obradu događaja Tok koji se izvodi kao odgovor na događaje koje je izazvao paket, zadatak ili kontejner. Konfiguracija Skup parova ime/vrijednost koji zadaje svojstva paketa i njegovih zadataka, kontejnera, varijabli, veza i metoda za obradu događaja kad se paket izvodi. Razdvajanje konfiguracije od paketa omogućava mijenjanje svojstava paketa bez mijenjanja paketa. Ovi objekti također olakšavaju instaliranje paketa sa razvojnih poslužitelja na proizvodne poslužitelje te premještanje paketa između poslužitelja/okolina. Pružatelj dnevnika Zadaje tip odredišta i format koji se koriste za zapisivanje izvedbenih informacija u dnevnik za pakete, kontejnere i zadatke. Sistemske i korisnički definirane varijable Pohranjuje vrijednosti koje SSIS paketi, zadaci i metode za obradu događaja koriste u vremenu izvođenja te izlaže informacije o paketima u vremenu izvođenja. Slika 15-1 prikazuje relacije između SSIS objekata. Sljedeći odjeljci podrobnije opisuju svaki od ovih objekata.

Elementi kontrolnog toka SSIS pruža tri različita tipa elemenata kontrolnog toka koji mogu biti ugniježđeni: 344 | Programiranje SQL Server 2005

Paket

Upravitelji vezama

Zadatak

Metode za obradu događaja Zadatak toka podataka Zadatak Izvor

Izvor

Pružatelji dnevnika

Kontejner Transformacija

Zadatak

Enumeratori

Konfiguracija Odredište

Odredište

Zadatak

Slika 15-1. Relacije SSIS objekata.

Kontejneri Pružaju strukture za poslove grupiranja i implementiranje ponavljajućeg kontrolnog toka u paketima. SSIS pruža tri tipa spremnika: Foreach Loop kontejner Ponavlja kontrolni tok za svaki element u kolekciji. For Loop kontejner Ponavlja kontrolni tok sve dok je provjeravani izraz istinit. Sequence kontejner Definira podskup kontrolnog toka u paketu. Omogućuje upravljanje i izvođenje grupe izvedbenih datoteka (zadataka i kontejnera) kao jedne jedinica. Zadaci Pružaju funcionalnost unutar paketa. SSIS pruža sedam tipova zadataka: Zadaci toka Komuniciraju s drugim procesima kako bi izveli pakete ili programe, slali ili primali poruke između paketa, slali poruke elektroničke pošte, čitali Windows Management Instrumentation (WMI) podatke i nadzirali WMI događaje. Zadaci toka podataka Definiraju i izvode tokove koji izdvajaju, transformiraju i učitavaju podatke.

Poglavlje 15: SQL Server Integration Services (SSIS) | 345

Zadaci pripreme podataka Kopiraju datoteke i mape, preuzimaju datoteke i podatke, spremaju podatke koje vrate Web metode i upravljaju XML dokumentima. Zadaci SQL Servera Pristupaju, kopiraju, stvaraju, modificiraju i brišu podatke i objekte SQL Servera. Analysis Services zadaci Stvaraju, modificiraju, brišu i obrađuju Analysis Services objekte. Analysis Services usluge bit će opisane u poglavlju 20. Zadaci skriptiranja Proširuju funkcionalnost paketa prilagođenim skriptama. Zadaci održavanja Obavljaju brojne administrativne funkcije – izrađuju sigurnosne kopije baze podataka, provjeravaju integritet baze podataka, izvode poslove SQL Service Agenta, izvode T-SQL naredbe, brišu povijest, obavještavaju operatore, ponovno izgrađuju i organiziraju indekse, smanjuju opseg baze podataka te ažuriraju statistike. Ograničenja prednosti Povezuju kontejnere i zadatke unutar paketa u uređeni tok. Možete kontrolirati redoslijed izvođenja i zadati uvjete koji zadaju izvode li se kontejneri i zadaci.

Komponente toka podataka Komponente toka podataka povezane su unutar zadatka toka podataka upotrebom putanja integracijske usluge. Ove putanje preslikavaju izlaze jedne komponente toka podataka u ulaze iduće komponente toka podataka unutar zadatku toka podataka. SSIS pruža tri tipa komponenti toka podataka: Izvor Pribavljaju podatke iz vanjskog izvora podataka koji je na raspolaganju komponentama u toku podataka. Izvor ima jedan ili više ulaza i izlaza ovisno o izvođenom zadatku, kao i jedan ili više izlaza s pogreškama. SSIS pruža izvore opisane u tablici 15-1. Ako oni ne zadovoljavaju vaše potrebe, možete razviti vlastite izvore. Tablica 15-1. SSIS izvori toka podataka Izvor

Opis

DataReader

Podaci iz .NET Framework pružatelja podataka.

Excel

Podaci iz Excel datoteke.

Flat File

Podaci iz nestrukturirane datoteke.

OLE DB

Podaci iz OLE DB pružatelja.

Raw File

Neobrađeni podaci iz datoteke.

346 | Programiranje SQL Server 2005

Tablica 15-1. SSIS izvori toka podataka (nastavak) Izvor

Opis

Script Component

Podaci iz rezultata izvođenja skripte.

XML

Podaci iz XML datoteke.

Transformacija Obavlja zadatke poput ažuriranja, agregacije, čišćenja, distribucije i spajanja podataka. Transformacija može imati jednostruke ili višestruke ulaze i izlaze, ovisno o zadatku koji izvodi, a također može imati jedan ili više izlaza s pogreškama. SSIS pruža transformacije poslovne inteligencije, reda, skupa redova, razdvajanja i spajanja, kao i druge raznovrsne transformacije. Možete razviti vlastite transformacije ako ove ne zadovoljavaju vaše potrebe. Pogledajte Microsoft SQL Server 2005 Books Online za više informacija o ugrađenim transformacijama. Odredište Sprema podatke iz toka podataka u vanjske izvore podataka ili stvara DataSet unutar memorije. Odredišta imaju jedan ili više ulaza i, neobavezno, jedan ili više izlaza s pogreškama. SSIS pruža odredišta opisana u tablici 15-2. Možete razviti vlastita odredišta ako ova ne zadovoljavaju vaše potrebe. Tablica 15-2. SSIS odredišta toka podataka Odredište

Opis

Data Mining Model Training

Priprema model pronalaženja podataka.

DataReader

Izlaže podatke kroz sučelje DataReader ADO.NET-a.

Dimension Processing

Sprema i obrađuje Analysis Services dimenziju.

Excel

Sprema Excel datoteku.

Flat File

Sprema strukturiranu datoteku.

OLE DB

Sprema u OLE DB odredište podataka.

Partition Processing

Sprema i obrađuje Analysis Services particiju.

Raw File

Sprema neobrađenu datoteku.

Recordset

Izlaže podatke kroz Recordset ADO.NET-a.

Script Component

Sprema podatke upotrebom skripte.

SQL Server Mobile

Sprema u bazu podataka SQL Server Mobile.

SQL Server Destination

Skupno sprema podatke u tablicu ili pogled SQL Servera 2005.

Upravljači vezama Upravljač vezama opisuje vezu s izvorom podataka za pristup podacima koje koriste zadaci, transformacije i metode za obradu događaja u paketu. SSIS stvara veze kad se paket izvodi. Za jedan paket možete zadati višestruke veze. SSIS pruža tipove upravljača vezama opisane u tablici 15-3. Poglavlje 15: SQL Server Integration Services (SSIS) | 347

Tablica 15-3. Tipovi SSIS upravljača vezama Tip

Opis

ADO

Povezuje se s izvorom podataka koristeći ADO.

ADO.NET

Povezuje se s izvorom podataka koristeći pružatelj podataka ADO.NET-a.

EXCEL

Povezuje se s Excel datotekom.

FILE

Povezuje se jednom datotekom ili mapom.

FLATFILE

Povezuje se s podacima u jednoj nestrukturiranoj datoteci.

FTP

Povezuje se s FTP poslužiteljem.

HTTP

Povezuje se s Web uslugom ili Web stranicom.

MSMQ

Povezuje se s Microsoft Message Queue (MSMQ) redom.

MSOLAP90

Povezuje se s instancom Analysis Servicesa ili s Analysis Services projektom.

MULTIFILE

Povezuje se s višestrukim datotekama i mapama.

MULTIFLATFILE

Povezuje se s podacima u višestrukim nestrukturiranim datotekama.

ODBC

Povezuje se s izvorom podataka koristeći ODBC.

OLEDB

Povezuje se s izvorom podataka koristeći OLE DB.

SMOServer

Povezuje se sa SQL Server Management Objects (SMO).

SMTP

Povezuje se sa SMTP poslužiteljem.

SQLMOBILE

Povezuje se sa SQL Server Mobile bazom podataka.

WMI

Povezuje se s WMI poslužiteljem.

Događaji SSIS izvedbeni paketi – paketi, Foreach Loop kontejneri, For Loop kontejneri, Sequence kontejneri i kontejneri koji udomaćuju zadatke – izazivaju događaje za vrijeme izvođenja. Možete napisati prilagođene metode za obradu događaja kako biste proširili funkcionalnost paketa i olakšali administraciju. Ako događaj nema metodu za obradu, proslijedit će se do idućeg kontejnera u paketnoj hijerarhiji sve dok konačno ne bude dosegnuta razina paketa. Tablica 15-4 opisuje SSIS događaje za vrijeme izvođenja. Tablica 15-4. SSIS događaji za vrijeme izvođenja Događaj

Opis

OnError

Izaziva ga izvedbeni paket kad se pojavi pogreška.

OnExecStatusChanged

Izaziva ga izvedbeni paket kad se promijeni stanje njegove izvedbe.

OnInformation

Izaziva ga izvedbeni paket tijekom potvrđivanja i izvedbe kako bi izvjestio o informacijama.

OnPostExecute

Izaziva ga izvedbeni paket neposredno nakon izvedbe.

OnPostValidate

Izaziva ga izvedbeni paket neposredno nakon potvrđivanja.

OnPreExecute

Izaziva ga izvedbeni paket neposredno prije početka izvedbe.

OnPreValidate

Izaziva ga izvedbeni paket neposredno prije potvrđivanja.

OnProgress

Izaziva ga izvedbeni paket kad je učinjen napredak tijekom izvedbe.

OnQueryCancel

Izaziva ga izvedbeni paket kako bi utvrdio treba li se prestati izvoditi.

348 | Programiranje SQL Server 2005

Tablica 15-4. SSIS događaji za vrijeme izvođenja (nastavak) Događaj

Opis

OnTaskFailed

Izaziva ga zadatak kad ne uspije.

OnVariableValueChanged

Izaziva ga izvedbeni paket kad se promijeni vrijednost varijable.

OnWarning

Izaziva ga izvedbeni paket kad dođe do upozorenja.

Paketne konfiguracije SSIS pruža paketne konfiguracije za ažuriranje vrijednosti svojstava u vremenu izvođenja. Svaka paketna konfiguracija je par svojstvo-vrijednost. Konfiguracije pojednostavljuju instaliranje paketa na više poslužitelja, pojednostavljuju premještanje paketa između poslužitelja i dodaju paketima fleksibilnost omogućujući jednostavnu promjenu konfiguracijskih svojstava. SSIS podržava tipove paketnih konfiguracija opisane u tablici 15-5. Tablica 15-5. Tipovi SSIS paketnih konfiguracija Tip

Opis

XML konfiguracijska datoteka

Konfiguracijske informacije pohranjene su u XML datoteku, koja može sadržavati višestruke konfiguracije.

Varijabla okoline

Konfiguracijske informacije pohranjene su u varijablu okoline.

Unos u bazu registry

Konfiguracijske informacije pohranjene su u bazu Registry.

Varijabla roditeljskog paketa

Konfiguracijske informacije pohranjene su u varijablu u paketu.

Tablica SQL Servera

Konfiguracijske informacije pohranjene su u tablicu SQL Servera, koja može sadržavati višestruke konfiguracije.

Pružatelji dnevnika SSIS uključuje pružatelje dnevnika koji implementiraju zapisivanje u dnevnik u paketima, kontejnerima i zadacima kako bi pomogli provjeriti i otkriti pogreške. SSIS nudi pet pružatelja dnevnika, kako je opisano u tablici 15-6. Možete razviti prilagođene pružatelje dnevnika ako ovi ne zadovoljavaju vaše potrebe. Tablica 15-6. Pružatelji dnevnika Pružatelj

ProgID

Opis

Tekstualna datoteka

DTS.LogProviderTextFile.1

Upisuje dnevničke unose u tekstualnu datoteku u formatu zarezima odvojenih vrijednosti (CSV).

SQL Server Profiler

DTS.LogProviderSQLProfiler.1

Upisuje dnevničke unose u praćenja SQL Servera koja se mogu pogledati upotrebom SQL Server Profilera.

SQL Server

DTS.LogProviderSQLServer.1

Upisuje dnevničke unose u tablicu sysdtslog90 u bazi podataka SQL Server 2005.

Windows Event dnevnik

DTS.LogProviderEventLog.1

Upisuje dnevničke unose u dnevnik aplikacije u Windows Event dnevniku na lokalnom računalu.

XML datoteka

DTS.LogProviderXMLFile.1

Upisuje dnevničke unose u XML datoteku.

Poglavlje 15: SQL Server Integration Services (SSIS) | 349

Varijable Varijable pohranjuju vrijednosti koje upotrebljavaju SSIS paketi, zadaci i metode za obradu događaja u vremenu izvođenja. SSIS podržava dva tipa varijabli: korisnički definirane varijable i varijable sustava. Korisnički definirane varijable definirali su programeri paketa, a varijable sustava definira SSIS. Možete stvoriti korisnički definirane varijable za sve tipove SSIS kontejnera – pakete, Foreach Loop kontejnere, For Loop kontejnere, Sequence kontejnere, zadatke i metode za obradu događaja. Varijable imaju doseg unutar polja djelovanja kontejnera, a mogu im pristupiti potomci kontejnera. Varijabla može izazvati događaj kad se promijeni njena vrijednost.

Alati SQL Server 2005 pruža sljedeće alate za projektiranje i upravljanje Integration Services uslugama: Business Intelligence Development Studio Pomaže razvijati, testirati, uklanjati pogreške i instalirati integracijske pakete. SQL Server 2005 Management Studio Upravlja paketima u proizvodnji. SSIS Designer Grafički alat u Business Intelligence Development Studiju koji se upotrebljava za izradu kontrolnih tokova i tokova podataka u paketima, dodavanje metoda za obradu događaja paketima i paketnim objektima, pregledavanje sadržaja paketa i pregledavanje napretka izvedbe paketa. Integration Services čarobnjaci Čarobnjaci za kopiranje podataka između izvora podataka, izradu jednostavnih paketa, izradu paketnih konfiguracija, instaliranje Integration Services projekata i preuzimanje DTS paketa sa SQL Servera 2000. Pomoćni programi za odzivnik Alati za upravljanje paketima, zadavanje paketne konfiguracije u izvedbenom okolišu i pokretanje paketa iz odzivnika, kako je opisano u tablici 15-7. Tablica 15-7. SSIS pomoćni programi za odzivnik Program

Opis

dtexecui

Zadaje izvedbenu konfiguraciju i izvodi postojeći paket na lokalnom računalu.

dtexec

Konfigurira i izvodi postojeći paket pohranjen u SQL Server bazi podataka, SSIS spremištu paketa i datotečnom sustavu.

dtutil

Upravlja, kopira, briše, premješta i potvrđuje postojanje postojećih paketa pohranjenih u SQL Server bazi podataka, SSIS spremištu paketa i datotečnom sustavu

350 | Programiranje SQL Server 2005

Programiranje SSIS-a SSIS omogućuje programsku izradu, učitavanje, modificiranje i izvođenje paketa, kao i drugih objekata, uključujući upravljače vezama, pružatelje dnevnika i enumeratore. U ovom ćete odlomku vidjeti kako programirati SSIS u upravljanom kodu. Postoje dva stroja prema kojima programirate kad razvijate SSIS rješenja: Izvedbeni stroj Upravlja paketima i izvedbenom infrastrukturom. Stroj toka podataka Podržava zadatak toka podataka koji se koristi za izdvajanje, transformiranje i učitavanje podataka. Sljedeća dva odjeljka sadrže primjere koji pokazuju kako programski izvoditi uobičajene zadatke kad se u programiranju koriste ova dva stroja. Svi su primjeri u ovom dijelu izrađeni u Visual Studiju 2005. Svaki primjer treba referencu na sklop Microsoft.SqlServer.ManagedDTS. Bit će ukazano na dodatne reference sklopova za primjere u kojima su potrebne.

Programiranje kontrolnog toka Programiranje kontrolnog toka upotrebljava SSIS objektni model za izradu paketa, dodavanje pripremljenih i prilagođenih zadataka, povezivanje zadataka i izvođenje paketa. Programiranje kontrolnog toka također omogućuje izradu objekata kao što su upravljači vezama, varijable, pružatelji dnevnika, enumeratori, metode za obradu događaja i konfiguracijske datoteke. Sljedeći odjeljci pokazuju kako.

Izrada paketa Ovaj primjer izrađuje prazan paket – kontejner najviše razine za sve druge SSIS objekte: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 15: SQL Server Integration Services (SSIS) | 351

Klasa Package predstavlja kontejner paketa i izlaže kolekcije drugih kontejnera, veza, zadataka, pružatelja dnevnika, varijabli, konfiguracija, ograničenja prednosti i metoda za obradu događaja.

Spremanje paketa Ovaj primjer izrađuje prazan paket i sprema ga na disk upotrebom klase Application: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Sprema paket u mapu File System Application a = new Application( ); a.SaveToDtsServer(p, null, @"File System\TestPackage", "localhost"); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 15-2.

Slika 15-2. Rezultati primjera spremanja paketa

Nakon pokretanja primjera, možete vidjeti paket u prozoru Object Explorer u SQL Server Management Studiju. U glavnom izborniku odaberite View ➝ Registered Server Types ➝ Integration Services. U prozoru Registered Servers, desnom tipkom miša pritisnite SSIS poslužitelj i s kontekstnog izbornika odaberite Connect ➝ Object Explorer.

352 | Programiranje SQL Server 2005

U prozoru Object Explorer proširite čvor Stored Packages ➝ File System za instancu Integration Services, kao što je prikazano na slici 15-3.

Slika 15-3. Pregledavanje paketa upotrebom Object Explorera

Podrazumijevano, paketne (.dtsx) datoteke u čvoru File System spremaju se u C:\ Program Files\Microsoft SQL Server\90\DTS\Packages. Datoteku možete otvoriti koristeći Business Intelligence Studio ili možete ponovno učitati datoteku programski, kao što je opisano u sljedećem odlomku. Klasa Application kroz svoja svojstva otkriva Package objekt, pristupa im i koristi ih te pruža pristup informacijama o sustavu i raspoloživim komponentama.

Učitavanje paketa Ovaj primjer učitava paket pod imenom TestPackage (izrađen u prethodnom primjeru) s diska: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Učitava paket iz mape File System Application a = new Application( ); Package p = a.LoadFromDtsServer(@"File System\TestPackage", "localhost", null); Console.WriteLine("Package: " + p.CreationName + " " + p.Name + " loaded."); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 15: SQL Server Integration Services (SSIS) | 353

Rezultati slijede na slici 15-4.

Slika 15-4. Rezultati primjera učitavanja paketa

Dodavanje zadatka paketu Ovaj primjer izrađuje paket i dodaje mu ForLoop kontejner i zadatak SendMail. Zadatak SQL Task dodan je ForLoop kontejneru. using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Dodaje foreach petlju ForLoop fl = (ForLoop)p.Executables.Add("STOCK:ForLoop"); // Dodaje SQL zadatak za ForLoop kontejner fl.Executables.Add("STOCK:SQLTask"); // Dodaje zadatak slanje pošte p.Executables.Add("STOCK:SendMailTask"); // Enumerira zadatke u paketu foreach (Executable e in p.Executables) { if (e.ToString( ) == "Microsoft.SqlServer.Dts.Runtime.TaskHost") { Console.WriteLine(((TaskHost)e).InnerObject.GetType().ToString( )); } else if (e.ToString( ) == "Microsoft.SqlServer.Dts.Runtime.ForLoop") { // Enumerira zadatke ForLoop kontejneru Console.WriteLine(e.ToString( )); foreach (Executable e2 in ((ForLoop)e).Executables) Console.WriteLine(" " + ((TaskHost)e2).InnerObject.GetType().ToString( )); } } Console.WriteLine(Environment.NewLine + "Press any key to continue.");

354 | Programiranje SQL Server 2005

Console.ReadKey(

);

} }

Izlaz je prikazan na slici 15-5.

Slika 15-5. Izlaz primjera dodavanja zadataka

Izlaz primjera enumerira zadatke nakon što su stvoreni. Enumeriranje zadataka raspravljeno je u odjeljku „Enumeriranje svojstava zadatka“, kasnije u ovom poglavlju. Zadatke možete dodati objektima Package, Sequence, ForLoop, ForEachLoop i DtsEventHandler – svi ovi objekti su kontejneri. Svaki kontejner ima kolekciju Executables koja sadrži Executable objekte. Objekt dodajete kontejneru pozivanjem metode Add() objekta kontejnera. Metoda Remove() uklanja objekte iz kontejnera. Metoda Add() uzima samo jedan string parametar koji sadrži ime (COM objekta) CLSID, PROGID ili STOCK ili CreationName koji identificira zadatak ili kontejner. Tablica 15-8 opisuje SSIS zadatke. Tablica 15-8. SSIS zadaci STOCK ime

Opis

ActiveXScriptTask

Izrađuje i koristi ActiveX skripte napravljene u SQL Serveru 2000. Ovo svojstvo postoji samo radi kompatibilnosti sa starijim inačicama i bit će uklonjeno iz iduće inačice SQL Servera.

BulkInsertTask

Izvodi skupne operacije umetanja.

DMQueryTask

Izvodi upite predviđanja temeljene na modelima pronalaženja podataka izgrađenim u Analysis Services.

Exec80PackageTask

Izvodi pakete izrađene u SQL Serveru 2000 kao dio toka.

ExecutePackageTask

Izvodi ostale SSIS pakete kao dio toka podataka.

ExecuteProcessTask

Izvodi aplikaciju ili paketne datoteke kao dio toka.

FileSystemTask

Izvodi naredbu prema datotečnom sustavu.

FtpTask

Koristi FTP za preuzimanje i otpremanje datoteka i upravljanje mapama.

MessageQueueTask

Šalje ili prima poruke u i iz MSMQ reda.

PipelineTask

Premješta podatke između izvora i odredišta s neobaveznom transformacijom.

ScriptTask

Izvodi prilagođeni kod za obavljanje funkcija koje nisu raspoložive upotrebom ugrađenih SSIS zadataka.

Poglavlje 15: SQL Server Integration Services (SSIS) | 355

Tablica 15-8. SSIS zadaci (nastavak) STOCK ime

Opis

SendMailTask

Šalje poruku elektroničke pošte.

SQLTask

Izvodi T-SQL naredbe.

TransferDatabaseTask

Prenosi baze podataka s jedne instance SQL Servera na drugu.

TransferErrorMessagesTask

Kopira korisnički definirane poruke pogreške s jedne instance SQL Servera na drugu.

TransferJobsTask

Prenosi poslove SQL Server Agenta s jedne instance SQL Servera na drugu.

TransferLoginsTask

Prenosi korisničke račune s jedne instance SQL Servera na drugu.

TransferSqlServerObjectsTask

Kopira objekte SQL Servera s jedne instance SQL Servera na drugu.

TransferStoredProceduresTask

Kopira pohranjene procedure iz master baze podataka jedne instance SQL Servera na drugu.

WebServiceTask

Izvodi Web metodu i pohranjuje rezultate na zadanu lokaciju.

WmiDataReaderTask

Konfigurira i izvodi WMI upit.

WmiEventWatcherTask

Izvodi WMI upit i čeka na događaje asocirane s upitom.

XMLTask

Uzima i sprema XML dokumente pohranjene u datotekama te radi s njima.

Kontejnerske klase opisane u tablici 15-9 imaju iste kolekcije kao i klasa Package, omogućavajući ugnježđivanje zadataka unutar paketa do proizvoljne dubine. Već ste susreli kolekciju Executables; tijekom ostatka ovog poglavlja pojavit će se još kolekcija. Tablica 15-9. SSIS kontejneri STOCK ime

Opis

ForEachLoop

Određuje iterativni tok upotrebom elementa iteracije for each.

ForLoop

Određuje iterativni tok upotrebom elementa iteracije for.

Sequence

Određuje kontrolni tok koji je podskup toka roditeljskog kontejnera.

Dodavanje upravljača vezama Ovaj primjer izrađuje paket i dodaje mu SQL Server ADO.NET upravljač vezama: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); Console.WriteLine("Beginning number of connections: " +

356 | Programiranje SQL Server 2005

p.Connections.Count); // Dodaje vezu na AdventureWorks ConnectionManager cm; cm = p.Connections.Add("ADO.NET"); Console.WriteLine("Connection added."); // Konfigurira vezu cm.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks"; Console.WriteLine("Ending number of connections: " + p.Connections.Count); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 15-6.

Slika 15-6. Rezultati primjera dodavanja upravljača vezama

Klasa ConnectiomManager predstavlja vezu s izvorom podataka. Tip veze zadan je kao argument konstruktoru iz tipova veza opisanih u tablici 15-3. On pruža sloj apstrakcije kako biste mogli koristiti različite izvore podataka na kozistentan način. Svojstvo Connections klase Package izlaže kolekciju upravljača vezama asociranih s klasom Package. Svojstvo ConnectionInfos klase Application vraća kolekciju informacija o vezama koje su instalirane na računalu kao ConnectionInfo objekti. Izvedbeni stroj upravlja vezama za paket za vrijeme izvođenja, tako da ne morate izvoditi zadatke poput otvaranja i zatvaranja veza.

Izvođenje paketa Ovaj primjer izrađuje paket sa zadatkom SQLTask te ga izvodi. Trebate dodati referencu na sklop Microsoft.SqlServer.SQLTask kako biste izradili i pokrenuli ovaj primjer. using System; using Microsoft.SqlServer.Dts.Runtime; using Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask; class Program {

Poglavlje 15: SQL Server Integration Services (SSIS) | 357

static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Dodaje upravljač vezama ConnectionManager cm = p.Connections.Add("ADO.NET"); cm.Name = "CM_ProgrammingSqlServer2005"; cm.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=ProgrammingSqlServer2005"; // Dodaje SQL zadatak paketu Executable e = p.Executables.Add("STOCK:SQLTask"); TaskHost th = (TaskHost)e; ExecuteSQLTask est = (ExecuteSQLTask)th.InnerObject; est.Connection = cm.Name; est.SqlStatementSourceType = SqlStatementSourceType.DirectInput; est.SqlStatementSource = "CREATE TABLE TestTable " + "( ID int NOT NULL, Description nchar(100))"; // Izvodi paket DTSExecResult r = p.Execute(

);

// Provjerava status i rezultate izvođenja paketa Console.WriteLine("Status: " + p.ExecutionStatus.ToString(

));

if (r == DTSExecResult.Success) Console.WriteLine("Package executed successfully."); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 15-7.

Slika 15-7. Rezultati primjera izvođenja paketa

Izvođenje paketa stvara tablicu TestTable u bazi podataka ProgrammingSqlServer2005 kao rezultat izvođenja paketa. Primjer stvara Package objekt i ConnectionManager objekt koji sadrži informacije o vezi s bazom podataka ProgrammingSqlServer2005. Paketu je dodan izvedbeni SQL zadatak prosljeđivanjem niza zanakova STOCK:SQLTask metodi Add() kolekcije Executables za paket.

358 | Programiranje SQL Server 2005

Executable objekt pretvoren je u TaskHost objekt koji se zatim pretvara u ExecuteSQLTask objekt. SQL zadatak konfiguriran je postavljanjem svojstava ExecuteSQLTask objekta.

Klasa TaskHost je omotač za zadatak. Ona se koristi za dobivanje dodatnih svojstava i metoda zadatka. Svojstvo InnerObject klase TaskHost pristupa objektu zadatka, a može biti pretvoreno u poseban tip zadatka. SSIS izvedbeni objekti implementiraju metodu Execute() koja izvodi izvedbeni objekt. Svojstvo ExecutionStatus kontejnera vraća vrijednost iz enumeracije DTSExecStatus, opisane u tablici 15-10, ukazujući na stanje izvedbe zadatka. Tablica 15-10. Enumeracija DTSExecStatus Ime

Opis

Abend

Zadatak je nepravilno završen zbog unutarnje pogreške.

Completed

Zadatak je dovršen i vratio je rezultat Failure ili Success za rezultat izvedbe (DTSExecResult).

Executing

Zadatak se izvodi.

None

Zadatak je neaktivan.

Suspended

Zadatak je obustavljen.

Validating

Zadatak provjerava.

Metoda Execute() kontejnera vraća vrijednost iz enumeracije DTSExecResult, opisane u tablici 15-11, ukazujući na rezultat izvedbe paketa. Tablica 15-11. Enumeracija DTSExecResult Ime

Opis

Canceled

Zadatak je poništen.

Completion

Zadatak je izvođen do dovršenja.

Failure

Zadatak nije uspio.

Success

Zadatak je uspio.

Potvrđivanje paketa Ovaj primjer izrađuje i potvrđuje paket. Trebate dodati referencu na sklop Microsoft. SqlServer.SQLTask kako biste izradili i izveli ovaj primjer. using System; using Microsoft.SqlServer.Dts.Runtime; using Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask; class Program { static void Main(string[] args)

Poglavlje 15: SQL Server Integration Services (SSIS) | 359

{ // Stvara prazni paket Package p = new Package(

);

// Dodaje upravljač vezama ConnectionManager cm = p.Connections.Add("ADO.NET"); cm.Name = "CM_ProgrammingSqlServer2005"; cm.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=ProgrammingSqlServer2005"; // Dodaje SQL zadatak paketu Executable e = p.Executables.Add("STOCK:SQLTask"); TaskHost th = (TaskHost)e; ExecuteSQLTask est = (ExecuteSQLTask)th.InnerObject; est.Connection = cm.Name; est.SqlStatementSourceType = SqlStatementSourceType.DirectInput; est.SqlStatementSource = "CREATE TABLE TestTable " + "( ID int NOT NULL, Description nchar(100))"; // Potvrđuje paket DTSExecResult r = p.Validate(p.Connections, p.Variables, null, null); Console.WriteLine("Validation result: " + r); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Izlaz je prikazan na slici 15-8.

Slika 15-8. Izlaz primjera potvrđivanja paketa

Klasa Package i drugi kontejneri imaju metodu Validate() koja potvrđuje zavisnosti i postavke za objekt kako bi bilo utvrđeno hoće li se uspješno izvesti. Metoda jamči da su postavljene i da postoje potrebne vrijednosti. Kad su veze potvrđene, veza s podacima nije uistinu uspostavljena, a podaci u izvoru podataka nisu provjereni. Metoda Validate() može izazvati događaje i zapisati ih u dnevnik.

Enumeriranje svojstava zadatka Ovaj primjer izrađuje paket, dodaje mu zadatak TransferDatabaseTask te enumerira svojstva zadatka. Trebate dodati referencu na sklop Microsoft.SqlServer.TransferDatabase kako biste preveli i pokrenuli ovaj primjer.

360 | Programiranje SQL Server 2005

using System; using Microsoft.SqlServer.Dts.Runtime; using Microsoft.SqlServer.Dts.Tasks.TransferDatabaseTask; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); Executable e = p.Executables.Add("STOCK:TransferDatabaseTask"); TaskHost th = (TaskHost)e; TransferDatabaseTask tdt = (TransferDatabaseTask)th.InnerObject; Console.WriteLine("Type = " + tdt.GetType().ToString( )); Console.WriteLine("Version = " + tdt.Version); Console.WriteLine( ); foreach (DtsProperty dp in th.Properties) Console.WriteLine(dp.Name + " = " + dp.GetValue(th)); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 15-9. Kolekcija Properties objekta DtsProperty za klasu TaskHost izlaže kolekciju svojstava svojstvenu kontejneru. Vrijednostima svojstava pristupa se pozivanjem metode GetValue() klase DtsProperty.

Vezanje zadataka Ovaj primjer izrađuje paket, dodaje dva zadatka i postavlja ograničenje koje ne dozvoljava da se drugi zadatak izvodi sve dok prvi nije dovršen: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Stvara zadatak Executable e1 = p.Executables.Add("STOCK:TransferDatabaseTask"); Executable e2 = p.Executables.Add("STOCK:SendMailTask");

Poglavlje 15: SQL Server Integration Services (SSIS) | 361

Slika 15-9. Rezultati primjera enumeriranja svojstava zadatka // Stvara ograničenje prednosti PrecedenceConstraint pc = p.PrecedenceConstraints.Add(e1, e2); pc.Name = "e1 before e2 precedence constraint"; pc.Value = DTSExecResult.Completion; foreach (PrecedenceConstraint pc1 in p.PrecedenceConstraints) { Console.WriteLine(pc1.Name); Console.WriteLine(" From: " + ((TaskHost)pc1.PrecedenceExecutable).InnerObject); Console.WriteLine(" To: " + ((TaskHost)pc1.ConstrainedExecutable).InnerObject); } Console.WriteLine(Environment.NewLine + "Press any key to continue.");

362 | Programiranje SQL Server 2005

Console.ReadKey(

);

} }

Rezultati su prikazani na slici 15-10.

Slika 15-10. Rezultati primjera vezanja zadataka

Klasa PrecedenceConstraint konfigurira prednost između dva kontejnera. Metoda Add() za kolekciju PrecedenceConstraints za kontejner uzima dva argumenta – izvedbenu datoteku prije ograničenja i izvedbenu datoteku poslije ograničenja. Svojstvo Value kolekcije PrecedenceConstraints zadaje tip ograničenja – vrijednost iz enumeracije DTSExecResult, opisane u tablici 15-11.

Upotreba varijabli Varijable možete upotrijebiti kako biste dinamički postavili vrijednosti u paketima, kontejnerima, zadacima i metodama za obradu događaja. Ovaj primjer dodaje korisničku varijablu praznom paketu te iterira kroz sve varijable u paketu: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Stvara varijablu p.Variables.Add("Variable1", false, "", 1); foreach (Variable v in p.Variables) Console.WriteLine(v.Name + " = " + v.Value + " [" + v.DataType + "]"); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Izlaz je prikazan na slici 15-11.

Poglavlje 15: SQL Server Integration Services (SSIS) | 363

Slika 15-11. Izlaz primjera dodavanja varijable

Svojstvo Variables objekata kontejnera pristupa kolekciji Variable objekata za kontejner. U izlazu možete vidjeti varijablu pod imenom Variable1 koja je bila dodana programski. SSIS pruža dva podrazumijevana imenska prostora za varijable. Imenski prostor User podrazumijevana je lokacija za varijable izrađene programski. Imenski prostor System sadrži varijable koje pohranjuju informacije o izvođenju paketa i njegovih objekata.

Konfiguriranje paketa Ovaj primjer izrađuje konfiguracijsku datoteku za novi paket. Morate stvoriti mapu C:\PSS2005\Packages ili odrediti drugu lokaciju kako biste izveli primjere u ovom odlomku. using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { string packagePath = @"C:\PSS2005\Packages\"; // Stvara prazan paket Package p = new Package( ); // Uključuje konfiguraciju p.EnableConfigurations = true; p.ExportConfigurationFile(packagePath + "SamplePackageConfig.xml"); // Stvara varijablu Variable v = p.Variables.Add("Variable1", false, "", 1);

364 | Programiranje SQL Server 2005

// Stvara konfiguracijsku datoteku Configuration c = p.Configurations.Add( ); c.ConfigurationString = "SamplePackageConfig.xml"; c.ConfigurationType = DTSConfigurationType.ConfigFile; c.Description = "Sample configuration file"; c.PackagePath = v.GetPackagePath( ); // Sprema paket s konfiguracijskom datotekom u XML datoteku Application a = new Application( ); a.SaveToXml(packagePath + "SamplePackage.xml", p, null); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Izvođenje primjera stvara konfiguracijsku datoteku prikazanu na slici 15-12. Klasa Configuration predstavlja informacije o tome kako je paket konfiguriran. Klasa Configurations predstavlja kolekciju Configuration objekata. Klasa Package izlaže svoju kolekciju konfiguracija kroz svojstvo Configurations. Svojstvo EnableConfigurations klase Package pokazuje podržava li paket učitavanje konfiguracijskih datoteka kod učitavanja paketa. Ukoliko je vrijednost EnableConfigurations false, paket podržava učitavanje postojećih konfiguracijskih vrijednosti unutar paketa. Metoda ExportConfigurationFile() klase Package stvara XML datoteku koja sadrži sve varijable s mogućnošću instaliranja u paketu. Ovo možete vidjeti u elementu u XML-u na slici 15-12. Svojstvo ConfigurationType klase Configuration zadaje način na koji će biti pohranjene konfiguracijske informacije. Svojstvo uzima vrijednost iz enumeracije DTSConfigurationType, opisane u tablici 15-12. Svojstvo ConfigurationString zadaje lokaciju konfiguracije. Tablica 15-12. Enumeracija DTSConfigurationType Vrijednost

Opis

ConfigFile

Konfiguracijska datoteka.

EnvVariable

Varijabla okoline.

IConfigFile

Varijabla okoline koja sadrži informacije o konfiguracijskoj nestrukturiranoj datoteci.

IParentVariable

Varijabla okoline koja sadrži informacije o varijabli paketa.

IRegEntry

Varijabla okoline koja sadrži informacije o unosu u bazu Registry.

IsqlServer

Varijabla okoline koja sadrži informacije o instanci SQL Servera.

ParentVariable

Varijabla paketa.

RegEntry

Unos u bazu Registry.

SqlServer

msdb baza podataka SQL Servera.

Poglavlje 15: SQL Server Integration Services (SSIS) | 365

Slika 15-12. Primjer konfiguracijske datoteke paketa

Konačno, metoda SaveToXml() klase Application sprema paket i konfiguracijske informacije u datoteku SamplePackage.xml. Ovaj primjer učitava paket izrađen u prethodnom primjeru i prikazuje konfiguracijske informacije:

366 | Programiranje SQL Server 2005

using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { string packagePath = @"C:\PSS2005\Packages\"; Application a = new Application( ); Package p = a.LoadPackage(packagePath + "SamplePackage.xml", null); // Izlaže korisnički definirane varijable foreach (Variable v in p.Variables) { if (!v.SystemVariable) Console.WriteLine(v.Name + " = " + v.Value); } // Izlaže konfiguracije Console.WriteLine( ); foreach (Configuration c in p.Configurations) { Console.WriteLine("ConfigurationString = " + c.ConfigurationString); Console.WriteLine("ConfigurationType = " + c.ConfigurationType); Console.WriteLine("CreationName = " + c.CreationName); Console.WriteLine("Description = " + c.Description); Console.WriteLine("ID = " + c.ID); Console.WriteLine("Name = " + c.Name); Console.WriteLine("PackagePath = " + c.PackagePath); } Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 15-13.

Slika 15-13. Rezultati primjera učitavanja konfiguracijske datoteke paketa

Poglavlje 15: SQL Server Integration Services (SSIS) | 367

Obrađivanje događaja SSIS razvojna okolina pruža skup događaja do kojih dolazi prije, tijekom i poslije potvrđivanja i izvođenja paketa, kako je opisano u tablici 15-4. Možete napraviti metode za obradu događaja koje izvode tok kad se događaj izazove. Događaji se mogu presresti implementiranjem IDTSEvents sučelja u klasu ili stvaranjem DtsEventHandler objekta u toku. Prvi primjer pokazuje kako upotrijebiti IDTSEvents sučelje: using System; using Microsoft.SqlServer.Dts.Runtime; class Program : DefaultEvents { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Stvara paket // Izvodi paket s klasom Program // kao argumentom Program program = new Program( ); DTSExecResult r = p.Execute(null, null, program, null, null); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } public override void OnPreExecute(Executable exec, ref bool fireAgain) { Console.WriteLine("Event: OnPreExecute"); } }

Izlaz je prikazan na slici 15-14.

Slika 15-14. Izlaz primjera IDTSEvents

Obavijesti o događajima možete primati tijekom izvođenja ili potvrđivanja kontejnera izrađivanjem klase koja implementira IDTSEvents sučelje. Također možete izvesti klasu iz klase DefaultEvents te premostiti događaje koje želite obrađivati – ovaj je pristup upotrijebljen u ovom primjeru. Trebate napraviti instancu klase Program i pružiti je kao 368 | Programiranje SQL Server 2005

treći argument metodi Execute() koja pripada paketu kako biste primali obavijesti o događajima. Drugi primjer stvara DTSEventHandler objekt i koristi ga za obradu događaja OnTaskFailed. Trebate dodati referencu na sklop Microsoft.SqlServer.SQLTask kako biste preveli i izveli ovaj primjer. using System; using Microsoft.SqlServer.Dts.Runtime; using Microsoft.SqlServer.Dts.Tasks.ExecuteSQLTask; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Dodaje upravljač vezama ConnectionManager cm = p.Connections.Add("ADO.NET"); cm.Name = "CM_ProgrammingSqlServer2005"; cm.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=ProgrammingSqlServer2005"; // Dodaje SQL zadatak u paket Executable e = p.Executables.Add("STOCK:SQLTask"); TaskHost th = (TaskHost)e; ExecuteSQLTask est = (ExecuteSQLTask)th.InnerObject; est.Connection = cm.Name; est.SqlStatementSourceType = SqlStatementSourceType.DirectInput; est.SqlStatementSource = "CREATE TABLE TestTable2 " + "( ID int NOT NULL, Description nchar(100))"; // Dodaje obradu događaja DtsEventHandler deh = (DtsEventHandler)p.EventHandlers.Add("OnTaskFailed"); // Dodaje zadatak za okidanje za vrijeme izvođenja obrade događaja Executable e2 = deh.Executables.Add("STOCK:SQLTask"); TaskHost th2 = (TaskHost)e2; ExecuteSQLTask est2 = (ExecuteSQLTask)th2.InnerObject; est2.Connection = cm.Name; est2.SqlStatementSourceType = SqlStatementSourceType.DirectInput; est2.SqlStatementSource = "CREATE TABLE TestTable3 " + "( ID int NOT NULL, Description nchar(100))"; DTSExecResult r = p.Execute( ); Console.WriteLine("Status: " + r.ToString(

));

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 15: SQL Server Integration Services (SSIS) | 369

Ovaj primjer trebate izvesti dvaput: 1. Prva izvedba uspješno stvara tablicu pod imenom TestTable2 u bazi podataka ProgrammingSqlServer2005. Metoda za obradu događaja OnTaskFailed neće se izvesti jer niti jedan zadatak u paketu nije bio neuspješan za vrijeme izvođenja paketa – tablica TestTable3 nije stvorena. Potvrdite da tablica TestTable2 postoji, a tablica TestTable3 ne postoji upotrebom Object Explorera u SQL Server Management Studiju. 2. Druga izvedba pokušava, ali ne uspijeva stvoriti tablicu TestTable2, jer ona već postoji iz prve izvedbe paketa. Neuspjeh izaziva izvođenje metode za obradu događaja OnTaskFailed, stvarajući TestTable3. Potvrdite da postoje tablice TestTable2 i TestTable3. Klasa DtsEventHandler predstavlja kontejner koji se izvodi nakon pojave određenih događaja. Stvarate i dodajete tok za metodu za obradu događaja na isti način kao i za bilo koji drugi kontejner.

Zapisivanje u dnevnik Ovaj primjer omogućuje zapisivanje u dnevnik za paket i upisuje dnevničke informacije u XML datoteku. Trebate stvoriti mapu C:\PSS2005\Logs kako biste preveli i izveli ovaj primjer. using System; using System.IO; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { // Stvara prazan paket Package p = new Package( ); // Dodaje upravitelj veze ConnectionManager cm = p.Connections.Add("FILE"); cm.Name = "Logging"; cm.ConnectionString = @"C:\PSS2005\Logs\TestLog.xml"; // Uključuje bilježenje u dnevnik p.LoggingMode = DTSLoggingMode.Enabled; // Stvara pružatelj dnevnika u paketu i odabira ga za bilježenje u dnevnik LogProvider lp = p.LogProviders.Add("DTS.LogProviderXmlFile.1"); lp.ConfigString = cm.Name; p.LoggingOptions.SelectedLogProviders.Add(lp); // Postavlja događaje za uključivanje u dnevnik p.LoggingOptions.EventFilterKind = DTSEventFilterKind.Inclusion; p.LoggingOptions.EventFilter = new string[] { "OnPreExecute", "OnPostExecute", "OnTaskFailed" };

370 | Programiranje SQL Server 2005

// Pokreće paket DTSExecResult r = p.Execute( ); Console.WriteLine("Status: " + r); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Dnevnička datoteka C:\PSS2005\Logs\TestLog.xml prikazana je na slici 15-15. Klasa LogProvider sadrži informacije o pružatelju dnevnika za kontejner. Svojstvo LogProviders klase Package izlaže kolekciju svih pružatelja dnevnika asociranih s paketom. Metoda Add() klase LogProviders dodaje zadani pružatelj dnevnika kolekciji pružatelja dnevnika. Pružatelj dnevnika zadan je prosljeđivanjem argumenta ProgID ili ClassID jednog od pet uključenih pružatelja dnevnika ili prilagođenog pružatelja dnevnika metodi Add(). Tablica 15-6 popisuje uključene pružatelje dnevnika i odgovarajuće vrijednosti ProgID. Svojstvo ConfigString pruža konfiguracijske informacije svojstvene pružatelju dnevnika. U ovom primjeru upotrijebljen je XML pružatelj dnevnika, a većina pružatelja dnevnika upotrebljava svojstvo ConfigString kako bi zadali ConnectionManager objekt koji se koristi za vezu s odredištem dnevnika. Svojstvo LogProvidersInfo klase Application vraća kolekciju informacija o pružateljima dnevnika instaliranim na računalu.

Svojstvo LoggingMode svakog kontejnera zadaje zapisuju li se u dnevnik informacije o događajima za kontejner. Ono uzima vrijednost iz enumeracije DTSLoggingMode – Disabled, Enabled ili UseParentSetting. Ako DTSLoggingMode nije zadana, podrazumijeva se način zapisivanja u dnevnik roditeljskog kontejnera. Paket je kontejner najviše razine, a njegovo svojstvo LoggingMode podrazumijevano je Disabled. Svaki pružatelj ima različite konfiguracijske opcije postavljene putem svojstva ConfigString. Svojstvo LoggingOptions.EventFilter kontejnera uzima polje niza znakova događaja koje želite zapisati u dnevnik. Svojstvo LoggingOptions.EventFilterKind uzima vrijednost iz DTSEventFilterKind, ukazujući je li polje događaja uključeno ili isključeno iz zapisivanja u dnevnik. Zapisivanje u dnevnik može biti dodatno filtrirano postavljanjem stupaca u strukturi DTSEventColumnFilter na true ili false kako bi se odabralo hoće li stupci biti zapisivani u dnevnik te dodjeljivanjem strukture LoggingOptions upotrebom metode SetColumnFilter().

Programiranje toka podataka Tok podataka omogućuje učitavanje, transformiranje i spremanje podataka. Tok podataka izrađujete dodajući dovodne komponente (engl. pipeline components) – izvore toka podataka, transformacije i odredišta, a zatim konfigurirajući i povezujući komponente.

Poglavlje 15: SQL Server Integration Services (SSIS) | 371

Slika 15-15. Rezultati primjera zapisivanja dnevnika u XML datoteku

372 | Programiranje SQL Server 2005

Ovaj primjer enumerira raspoložive dovodne komponente – izvore toka podataka, transformacije i odredišta: using System; using Microsoft.SqlServer.Dts.Runtime; class Program { static void Main(string[] args) { Application a = new Application(

);

foreach (PipelineComponentInfo pci in a.PipelineComponentInfos) { Console.WriteLine(pci.Name); Console.WriteLine(" " + pci.ComponentType); Console.WriteLine(" " + pci.CreationName); Console.WriteLine(" " + pci.Description); Console.WriteLine( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Djelomični su rezultati prikazani na slici 15-16.

Slika 15-16. Rezultati primjera enumeriranja dovodnih komponenti

Poglavlje 15: SQL Server Integration Services (SSIS) | 373

Klasa Application izlaže kolekciju PipelineComponentInfos. Ona sadrži PipelineComponentInfo objekt za svaku instaliranu dovodnu komponentu. Svojstvo ComponentType klase PipelineComponentInfo prepoznaje tip komponente kao vrijednost iz enumeracije DTSPipelineComponent – DestinationAdapter, SourceAdapter, Transform ili View. Programiranje toka podataka – programska izgradnja i konfiguriranje toka podataka, razvijanje prilagođenog izvora, transformacija, komponente učitavanja koje sudjeluju u toku podataka te programiranje prilagođenih komponenti toka podataka – teme su izvan dosega ovog poglavlja. Pogledajte Microsoft SQL Server Books Online za više informacija o ovim temama.

374 | Programiranje SQL Server 2005

POGLAVLJE 16

SQL Server Agent

SQL Server Agent automatizira administrativne zadatke izvodeći poslove, nadzirući SQL Server i obrađujući uzbune. Poslove i njihove rasporede, uzbune i operacije možete definirati upotrebom Object Explorera u SQL Server Management Studiju, koristeći T-SQL skripte ili koristeći SQL Server Management Objects (SMO). Upotreba SMO-a u žarištu je ovog poglavlja. SQL Server Agent podrazumijevano je isključen. Pokrenite ga povezivanjem s instancom poslužitelja u Object Exploreru. Desnom tipkom miša pritisnite čvor SQL Server Agent i odaberite Start s kontekstnog izbornika kako biste pokrenuli SQL Server Agent. Postavite SQL Server Agent da se automatski pokreće odabirom opcije SQL Server Configuration Manager s izbornika Microsoft SQL Server 2005 ➝ Configuration Tools. Izaberite SQL Server 2005 Services u lijevoj polju, desnom tipkom miša pritisnite SQL Sever Agent na popisu usluga u desnom polju te odaberite Properties s kontekstnog izbornika kako biste pokrenuli dijaloški okvir SQL Server Agent Properties. Izaberite karticu Service i Start Mode promijenite u Automatic.

Programiranje SQL Server Agenta Slika 16-1 prikazuje ključne SMO klase SQL Server Agenta i definira relacije među njima. Ove su klase u imenskom prostoru Microsoft.SqlServer.Management.Smo.Agent. Ostatak poglavlja predstavlja primjere programiranja koji pokazuju kako koristiti SMO klase SQL Server Agenta te pruža opise klasa. Da biste preveli i pokrenuli primjere trebate reference na sljedeće sklopove: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.Smo • Microsoft.SqlServer.SmoEnum • Microsoft.SqlServer.SqlEnum 375

Slika 16-1. Hijerarhija klasa SQL Server Agenta

376 | Programiranje SQL Server 2005

Alert

AlertCategory

AlertSystem

Job

JobCategory

Operator

JobServer

OperatorCategory

ProxyAccount

TargetServer

TargetServerGroup

Stvaranje posla SQL Server Agent posao (engl. job) zadaje seriju poslovnih koraka (akcija) koje SQL Server Agent izvodi prema rasporedu, kao odgovor na uzbunu, ili izvođenjem pohranjene procedure sp_start_job. Ovaj primjer stvara SQL Server Agent posao pod imenom TestJob. Posao ima samo jedan poslovni korak pod imenom TestJob koji provjerava ispravnost baze podataka AdventureWorks. using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; // Stvara posao Job j = new Job(jobServer, "TestJob"); j.Create( ); // Postavlja odredišni poslužitelj (isto sp_add_jobserver) j.ApplyToTargetServer("(local)"); // Stvara korak posla JobStep js = new JobStep(j, "Step 1"); js.SubSystem = AgentSubSystem.TransactSql; js.Command = "DBCC CHECKDB('AdventureWorks') WITH NO_INFOMSGS"; js.OnFailAction = StepCompletionAction.QuitWithFailure; js.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Ako posao treba izvesti na lokalnom poslužitelju upotrebom niza znakova (local) morate zadati poslužitelj. Niz znakova localhost neće raditi.

U ovom primjeru, poslovni je korak dodan poslu stvaranjem objekta JobStep te njegovim dodavanjem poslu prosljeđivanjem reference posla u JobStep konstruktoru. Nakon što izvedete primjer, produžite i osvježite čvor SQL Server Agent ➝ Jobs u Object Exploreru kako bi prikazao novi posao TestJob. Desnom tipkom miša pritisnite čvor TestJob i iz kontekstnog izbornika odaberite Properties kako bi se prikazao dijaloški okvir Job Properties. Izaberite stranicu Steps kako bi se prikazao korak koji ste dodali poslu, kao što je prikazano na slici 16-2. Poglavlje 16: SQL Server Agent | 377

Slika 16-2. Dijaloški okvir Job Properties

Svojstvo SubSystem klase JobStep zadaje podsustav SQL Servera koji koristi poslovni korak. To je vrijednost iz enumeracije AgentSubSystem, opisane u tablici 16-1. U ovom primjeru, dodani korak koristi podsustav Transact SQL. Tablica 16-1. Enumeracija AgentSubSystem Vrijednost

Podsustav SQL Servera

ActiveScripting

Active Scripting

AnalysisCommand

Analysis Command

AnalysisQuery

Analysis Query

CmdExec

Operating System Command (izvedbeni program)

Distribution

Distribution Agent

LogReader

Log Reader Agent

Merge

Merge Agent

QueueReader

Queue Reader Agent

Snapshot

Snapshot Agent

Ssis

SQL Server Integration Services (SSIS)

TransactSql

Transact-SQL

SMO ima klase koje se koriste za upravljanje poslovima, poslovnim koracima, kategorijama poslova, filtrima i rasporedima SQL Server Agenta. Ove klase su opisane u tablici 16-2. 378 | Programiranje SQL Server 2005

Tablica 16-2. SMO klase za administriranje poslova SQL Server Agenta Klasa

Opis

Job

Predstavlja posao SQL Server Agenta.

JobCategory

Predstavlja atribute koji omogućuju kategorizaciju poslova.

JobCategoryCollection

Predstavlja kolekciju kategorija poslova kao JobCategory objekte. Svojstvo JobCategories klase JobServer vraća kategorije poslova definirane na SQL Server Agentu.

JobCollection

Predstavlja kolekciju poslova kao Job objekte. Svojstvo Jobs klase JobServer vraća poslove definirane na SQL Server Agentu.

JobFilter

Predstavlja ograničenja koja se koriste za ograničavanje izlaza metode EnumJobs() klase JobServer.

JobHistoryFilter

Predstavlja ograničenja koja se koriste za ograničavanje izlaza metode EnumJobHistory() klase JobServer.

JobSchedule

Predstavlja raspored poslova SQL Server Agenta.

JobScheduleCollection

Predstavlja kolekciju rasporeda poslova kao JobSchedule objekte. Svojstvo SharedSchedule klase JobServer vraća dijeljene rasporede definirane na SQL Server Agentu.

JobServer

Predstavlja podsustav SQL Server Agent.

JobStep

Predstavlja poslovni korak SQL Server Agenta.

JobStepCollection

Predstavlja kolekciju poslovnih koraka kao JobStep objekte. Svojstvo JobSteps klase Job vraća poslovne korake definirane za posao.

Izvođenje posla Ovaj primjer izvodi posao stvoren u prethodnom primjeru: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; Job j = jobServer.Jobs["TestJob"]; j.Start( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 16: SQL Server Agent | 379

Metoda Start() klase Job pokreće posao. Ako otvorite Job Activity Monitor SQL Server Agenta odabirom SQL Server Agent ➝ Job Activity Monitor u Object Exploreru, vidjet ćete da se izvodi posao TestJob, kao što je prikazano na slici 16-3. Morate pritisnuti gumb Refresh na alatnoj vrpci kako biste ažurirali stanje.

Slika 16-3. Job Activity Monitor SQL Server Agenta

Možete pogledati povijest posla TestJob tako što ćete desnom tipkom miša pritisnuti čvor SQL Server Agent ➝ Jobs ➝ TestJob u Object Exploreru, a potom odabirom View History iz kontekstnog izbornika.

Izrada rasporeda Raspored (engl. schedule) SQL Server Agenta zadaje kada se posao izvodi – uvijek kad se pokrene SQL Server Agent, kad je iskorištenje procesora na razini kada se smatra da je procesor neaktivan, na zadani datum i vrijeme ili na temelju ponavljanja. Ovaj primjer izrađuje raspored poslova koji se izvodi jednom dnevno, u 4 sata ujutro. Kasniji primjer združit će ovaj raspored s poslom TestJob stvorenim u prvom primjeru u ovom odlomku. using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; JobSchedule js = new JobSchedule(jobServer, "TestSchedule"); js.FrequencyTypes = FrequencyTypes.Daily; js.FrequencyInterval = 1; js.ActiveStartTimeOfDay = TimeSpan.FromHours(4); js.IsEnabled = true; js.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

380 | Programiranje SQL Server 2005

Nakon što pokrenete program, možete pogledati i urediti novi raspored tako što ćete desnom tipkom miša pritisnuti čvor SQL Server Agent ➝ Jobs u Object Exploreru i odabrati Manage Schedules iz kontekstnog izbornika. Raspored je zadan upotrebom svojstava klase JobSchedule opisanih u tablici 16-3. Tablica 16-3. Svojstva klase JobSchedule koja se koriste za zadavanje rasporeda Svojstvo

Opis

ActiveEndDate

Datum i vrijeme kad raspored završava.

ActiveEndTimeOfDay

Vrijeme kada se raspored zaustavlja za taj dan.

ActiveStartDay

Datum i vrijeme kad raspored započinje.

ActiveStartTimeOfDay

Vrijeme kad raspored započinje za taj dan.

FrequencyInterval

Interval koji zadaje koliko često će se posao izvoditi. Svojstvo FrequencyInterval u odnosu je s vrijednošću svojstva FrequencyTypes.

FrequencyReccurenceFactor

Broj tjedana ili mjeseci između predviđenih poslova koji imaju tjednu ili mjesečnu učestalost.

FrequencyRelativeIntervals

Vrijednost dana u odnosu na prvi dan mjeseca.

FrequencySubDayIntervals

Vrijeme (u satima ili minutama) između predviđenih poslova koji imaju dnevnu frekvenciju, s tipom podddnevne frekvencije sata ili minute.

FrequencySubDayTypes

Vremenska jedinica koja služi za zadavanje intervala između predviđenih poslova s dnevnom frekvencijom. Vrijednost je iz enumeracije FrequencySubDayTypes – Hour, Minute, Once ili Unknown.

FrequencyTypes

Frekvencija koja zadaje kako će se često raspored izvoditi. Vrijednost je iz enumeracije FrequencyTypes – AutoStart, Daily, Monthly, MonthlyRelative, OneTime, OnIdle, Unknown ili Weekly.

Raspoređivanje posla Ovaj primjer združuje posao TestJob, stvoren u prvom primjeru u ovom odjeljku, s rasporedom TestSchedule izrađenim u prethodnom odlomku: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; JobSchedule js = jobServer.SharedSchedules["TestSchedule"]; Job j = jobServer.Jobs["TestJob"];

Poglavlje 16: SQL Server Agent | 381

j.AddSharedSchedule(js.ID); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Metoda AddSharedSchedule() klase Job združuje raspored s poslom. Metoda upotrebljava identifikacijski broj rasporeda kako bi identificirala raspored. Nakon što pokrenete program, možete vidjeti da je posao TestJob združen s rasporedom TestSchedule ako desnom tipkom miša pritisnete čvor SQL Server Agent ➝ Jobs ➝ TestJob u Object Exploreru i izaberete Properties iz kontekstnog izbornika. Ovo otvara dijaloški okvir Job Properties. Izaberite stranicu Schedules da pogledate popis rasporeda za posao. Također možete desnom tipkom miša pritisnuti čvor SQL Server Agent ➝ Jobs i iz kontekstnog izbornika odabrati Manage Schedules. To otvara dijaloški okvir Manage Schedules. Pritisnite vrijednost u Jobs iz stupca rasporeda kako bi se prikazao dijaloški okvir Jobs Referencing a Schedule, koji ispisuje poslove združene s rasporedom.

Izrada operatora Operator SQL Server Agenta zadaje informacije o kontaktu za administratora SQL Servera. Uzbuna može obavijestiti upotrebom elektroničke pošte, jednosmjernog poziva preko elektroničke pošte ili mrežnog slanja poruke. Ovaj primjer izrađuje operatora pod imenom Test Operator i operatoru dodjeljuje adresu elektroničke pošte: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; Operator o = new Operator(jobServer, "Test Operator"); o.EmailAddress = "[email protected]"; o.Enabled = true; o.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

382 | Programiranje SQL Server 2005

Svojstva EmailAddress, NetSendAddress i PagerAddress klase Operator zadaju adresu za operatora za različite komunikacijske opcije. Nakon što pokrenete program, možete vidjeti novi operator osvježavanjem i proširivanjem čvora SQL Server Agent ➝ Operators. SMO klase koje se koriste za upravljanje operatorima SQL Server Agenta opisane su u tablici 16-4. Tablica 16-4. SMO klase za administriranje operatora SQL Server Agenta Klasa

Opis

Operator

Predstavlja operator SQL Server Agenta.

OperatorCategory

Predstavlja atribute koji omogućuju kategorizaciju operatora.

OperatorCategoryCollection

Predstavlja kolekciju kategorija operatora kao OperatorCategory objekte. Svojstvo OperatorCategories klase JobServer vraća kategorije operatora definirane na SQL Server Agentu.

OperatorCollection

Predstavlja kolekciju operatora kao Operator objekte. Svojstvo Operators klase JobServer vraća operatore definirane na SQL Server Agentu.

Izrada uzbuna Uzbuna (engl. alert) SQL Server Agenta zadaje automatski odgovor na određeno stanje – događaj SQL Servera, stanje izvedbe SQL Servera ili događaj Windows Management Instrumentationa (WMI). Uzbuna obavještava jednog ili više operatora, ili izvodi posao. Ovaj primjer izrađuje uzbunu koja šalje poruku elektroničke pošte operatoru Test Operator stvorenom u prethodnom primjeru kada dođe do pogreške sa stupnjem ozbiljnosti 20: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; Alert a = new Alert(jobServer, "Test Alert"); a.Severity = 20; // Fatalna pogreška u trenutnom procesu a.Create( ); a.AddNotification("Test Operator", NotifyMethods.NotifyEmail);

Poglavlje 16: SQL Server Agent | 383

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Nakon što pokrenete program, možete vidjeti novi alarm osvježavanjem i proširivanjem čvora SQL Server Agent ➝ Alerts. Izvedite sljedeći T-SQL iskaz kako biste izazvali alarm: RAISERROR ('test error', 20, 1) WITH LOG

Sljedeća se poruka prikazuje kao rezultat pogreške: Msg 2745, Level 16, State 2, Line 1 Process ID 59 has raised user error 50000, severity 20. SQL Server is terminating this process. Msg 50000, Level 20, State 1, Line 1 test error Msg 0, Level 20, State 0, Line 0 A severe error occurred on the current command. The results, if any, should be discarded.

Možete provjeriti je li se pojavila uzbuna Test Alert tako da desnom tipkom miša pritisnete čvor SQL Server Agent ➝ Alerts ➝ Test Alert u Object Exploreru i odaberete opciju Properties iz kontekstnog izbornika. Izaberite stranicu History u dijaloškom okviru Alert Properties kako biste vidjeli datum zadnje uzbune, datum zadnjeg odgovora i ukupan broj pojavljivanja. Kad izrađujete uzbunu, morate zadati jednu od sljedećih vrijednosti: • Identifikator poruke različit od nule. • Stupanj ozbiljnosti različit od nule. • Uvjet izvedbe čija je vrijednosti različite od null. • WMI imenski prostor i upit vrijednosti različit od null. SQL Server Agent Mail podrazumijevano je isključen. Kako biste ga aktivirali, desnom tipkom miša pritisnite čvor SQL Server Agent u Object Exploreru i s kontekstnog izbornika odaberite Properties. Zatim, izaberite stranicu Alert System u dijaloškom okviru SQL Server Agent Properties, potvrdite polje Enable mail profile i ispunite ostatak odjeljka Mail Session na stranici.

SMO klase koje se koriste za upravljanje uzbunama SQL Server Agenta opisane su u tablici 16-5. Tablica 16-5. SMO klase za administriranje uzbuna SQL Server Agenta Klasa

Opis

Alert

Predstavlja uzbunu SQL Server Agenta.

AlertCategory

Predstavlja atribute koji omogućuju kategorizaciju uzbune.

384 | Programiranje SQL Server 2005

Tablica 16-5. SMO klase za administriranje uzbuna SQL Server Agenta (nastavak) Klasa

Opis

AlertCategoryCollection

Predstavlja kolekciju kategorija uzbuna kao AlertCategory objekte. Svojstvo AlertCategories klase JobServer vraća kategorije uzbuna definirane na SQL Server Agentu.

AlertCollection

Predstavlja kolekciju operatora kao Alert objekte. Svojstvo Alerts klase JobServer vraća uzbune definirane na SQL Server Agentu.

AlertSystem

Predstavlja podrazumijevane vrijednosti za sve uzbune definirane na instanci SQL Servera. Svojstvo AlertSystem klase JobServer vraća informacije o sustavu uzbuna definiranom na SQL Server Agentu.

Izrada posredničkog korisničkog računa Posrednički korisnički račun (engl. proxy account) SQL Server Agenta zadaje sigurnosni kontekst u kojem se može izvesti poslovni korak. Ovaj primjer izrađuje posrednički korisnički račun Test Proxy, daje public pristup ulozi baze podataka i poslovnim koracima dopušta upotrebu podsustava Active Scripting i Operating System (CmdExec): using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Smo.Agent; class Program { static void Main(string[] args) { Server server = new Server("(local)"); JobServer jobServer = server.JobServer; ProxyAccount p = new ProxyAccount(jobServer, "Test Proxy"); // Pogledajte bilješke o vjerodajnici u nastavku p.CredentialName = "Test Credential"; p.IsEnabled = true; p.Create( ); // Daje javni pristup ulozi baze podataka za korisnički račun posrednika p.AddMsdbRole("public"); // Dozvoljava podsustave Active Scripting i Operating System p.AddSubSystem(AgentSubSystem.ActiveScripting); p.AddSubSystem(AgentSubSystem.CmdExec); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Poglavlje 16: SQL Server Agent | 385

Prije izrade posrednika morate napraviti vjerodajnicu (engl. credential). Vjerodajnice sadrže informacije za provjeru identiteta koje provjereni korisnici SQL Servera trebaju za pristup resursima izvan SQL Servera – na lokalnom stroju ili na mrežnoj domeni. Vjerodajnica koja se koristi za izradu posrednika mora biti za provjerenog Windows korisnika. Dodajte vjerodajnice iz Object Explorera u SQL Server Management Studiju odabirom Security ➝ Credentials ➝ New Credential u Object Exploreru. Alternativno, vjerodajnice možete dodati i koristiti upotrebom SMO klase Credential, opisane u poglavlju 11.

Nakon što izvedete kod, možete pogledati posrednike osvježavanjem i otvaranjem čvora SQL Server Agent ➝ Proxies ➝ ActiveXScript ili čvora SQL Server Agent ➝ Proxies ➝ Operating System (CmdExec) u Object Exploreru. Dodijelite posrednika poslovnom koraku upotrebom svojstva ProxyName klase JobStep. Svojstvo AgentSubSystem klase Proxy Account zadaje podsustave SQL Servera koje posrednik može koristiti. SQL korisničkom računu, ulozi baze podataka ili principalima poslužiteljske uloge možete dati pristup korisničkom računu posrednika upotrebom metoda AddLogin(), AddMsdbRole(), odnosno AddServerRole() klase ProxyAccount. SMO klase koje se koriste za upravljanje posrednicima SQL Server Agenta opisane su u tablici 16-6. Tablica 16-6. SMO klase za administriranje korisničkih računa posrednika SQL Server Agenta Klasa

Opis

ProxyAccount

Predstavlja korisnički račun posrednika SQL Server Agenta.

ProxyAccountCollection

Predstavlja kolekciju korisničkih računa posrednika kao ProxyAccount objekte. Svojstvo ProxyAccounts klase JobServer vraća korisničke račune posrednika definirane na SQL Server Agentu.

Višeposlužiteljske okoline Glavni poslužitelj (engl. master server) definira poslove SQL Server Agenta koji se izvode na udaljenim (ciljnim) poslužiteljima. Ciljni poslužitelj (engl. target server) preuzima i izvodi poslove definirane na glavnom poslužitelju. Ciljni su poslužitelji definirani samo na glavnom SQL Server Agentu. Za informacije o postavljanju višeposlužiteljske administracijske grupe pogledajte Microsoft SQL Server 2005 Books Online. Instance ciljnog poslužitelja odmah se popunjavaju kad se povežete s instancom SQL Servera određenom kao glavnom u višeposlužiteljskoj administracijskoj grupi. SMO objekti ciljnog poslužitelja omogućuju dobivanje informacija o ciljnom poslužitelju i postavljanje lokacije za ciljni poslužitelj. SMO klase koje se koriste za upravljanje ciljnim poslužiteljima SQL Server Agenta opisane su u tablici 16-7.

386 | Programiranje SQL Server 2005

Tablica 16-7. SMO klase za administriranje ciljnih poslužitelja SQL Server Agenta Klasa

Opis

TargetServer

Predstavlja ciljni poslužitelj za višeposlužiteljsku administraciju na SQL Server Agentu. Objekt TargetServer dobiven je upotrebom elementa iz objekta TargetServerCollection koji je vratilo svojstvo TargetServers objekta JobServer te ne može biti stvoren kao samostalni objekt.

TargetServerCollection

Predstavlja kolekciju ciljnih poslužitelja kao TargetServer objekte. Svojstvo TargetServers klase JobServer vraća ciljne poslužitelje definirane na SQL Server Agentu.

TargetServerGroup

Predstavlja grupu ciljnih poslužitelja za višeposlužiteljsku administraciju na SQL Server Agentu.

TargetServerGroupCollection

Predstavlja kolekciju grupa ciljnih poslužitelja kao TargetServerGroup objekte. Svojstvo TargetServerGroups klase JobServer vraća grupe ciljnih poslužitelja definirane na SQL Server Agentu.

Poglavlje 16: SQL Server Agent | 387

POGLAVLJE 17

Service Broker

SQL Server 2005 uvodi novu tehnologiju Service Broker koja je dio Database Engine za izgradnju skalabilnih aplikacija baza podataka koje ne zahtijevaju usku povezanost. Service Broker pruža komunikacijsku platformu temeljenu na porukama koja integrira nezavisne aplikacijske komponente. Osim toga, olakšava izgradnju distribuiranih aplikacija putem kostura za asinkrono programiranje namijenjenom redanju i pouzdanom slanju poruka. Tehnologija Service Broker namijenjena je aplikacijama koje koriste jednu instancu SQL Servera, kao i onima koje su raspoređene na više instanci. Service Broker Framework sadrži sučelje Data Manipulation Language (DML) za slanje i primanje tokova asinkronih poruka.

Arhitektura Prije nego što pogledate tok poruka unutar Service Broker rješenja, obratite pažnju na neke ključne pojmove vezane uz Service Broker. Poruka (engl. message) je informacija koju izmjenjuju aplikacije koje koriste Service Broker. Pohranjena je u SQL Serveru kao tip podatka varbinary (max). Svaka poruka sadrži tip poruke koji zadaje ime i tip podataka koje poruka nosi. Osim toga, svaka poruka je jedinstvena i sadrži jedinstveni redni broj unutar konverzacije koji zadaje redoslijed poruka. Konverzacija (engl. conversation) je pouzdan i trajan komunikacijski kanal sastavljen od niza poruka. Poruke stižu redoslijedom kojim su poslane i to samo jednom. Konverzacijska grupa (engl. conversation group) je skup povezanih konverzacija za izvršavanje određenog zadatka. Definira ju sudionik i ona se ne dijeli među sudionicima konverzacije, jer svaki sudionik može grupirati konverzacije po potrebi. Service Broker porukama u povezanim konverzacijama automatski dodjeljuje identifikator konverzacijske grupe. Konverzacijska grupa omogućava koordinaciju poruka u povezanim

388

konverzacijama. Ona je u vezi s određenom uslugom, a sve poruke unutar konverzacijske grupe su poruke od te usluge ili za nju. Ugovor (engl. contract) zadaje tipove poruka koji se koriste pri izvršavanju određenog zadatka i tipove poruka koje sudionici u konverzaciji mogu koristiti. Aplikacija šalje poruku usluzi – skupu povezanih zadataka – i prima poruke od reda (engl. queue) koji pohranjuje poruke u bazi podataka. U većini slučajeva se jedan red koristi za jednu uslugu, iako je moguće da više usluga dijeli jedan red. Usluga zadaje ugovore za koje je ona cilj. Ciljna usluga (engl. target service) je adresa koja prima zahtjeve za zadatke navedene u ugovoru i određene uslugom. Početna usluga (engl. initiating service) je povratna adresa konverzacije s ciljnom uslugom. Dijalog (engl. route) je konverzacija između dvije usluge. Dijalozi s pomoću identifikatora konverzacije i rednog broja prepoznaju povezane poruke i slažu ih po redu. Na taj način dijalozi omogućuju točno jednu isporuku poruke u redu. Inicijator (engl. initiator) pokreće dijalog, a cilj (engl. target) prihvaća konverzaciju koju je inicijator započeo. Slanje poruka između aplikacija je asinkrono i transakcijsko. Ako se transakcija vrati, vraćaju se i sve operacije Service Brokera unutar te transakcije, uključujući i operacije za slanje i primanje poruka. Smjer (engl. direction) utvrđuje mjesto isporuke poruke i ime usluge, identifikator instance posrednika koji na jedinstven način određuje Service Broker bazu podataka i mrežnu adresu. SQL Server s pomoću imena usluge i instance posrednika, zadanih prilikom pokretanja konverzacije, određuje smjer konverzacije. Povezivanjem udaljenih usluga utvrđuje se korisnik lokalne baze podataka, certifikat korisnika i ime udaljene usluge te se pruža sigurnost dijaloga za konverzacije koje su usmjerene na udaljenu uslugu. Na slici 17-1 prikazan je tok poruka od početnog klijenta do cilja kojim se obrađuju poruke i pruža odgovor klijentu.

Programiranje Service Brokera SMO Service Broker klase namijenjene su programskom upravljanju Service Broker objektima. One ne podržavaju stvaranje konverzacija te slanje i primanje poruka. Slati i primati tokove asinkronih poruka možete putem T-SQL DML iskaza, o kojima će biti riječi kasnije u ovom poglavlju. Slika 17-2 prikazuje odnos između SMO klasa za programiranje u Service Brokeru.

Poglavlje 17: Service Broker | 389

Service broker baza podataka Pošalji poruku sa zahtjevom

Usluga

Početna aplikacija Red

Service broker Primi baza podataka

Primi

Red

Usluga

Pošalji poruku sa zahtjevom Ciljna aplikacija

Slika 17-1. Tok poruke u Service Brokeru

Preostali dio ovog poglavlja pruža opise i primjere upotrebe SMO Service Broker klasa. Za prevođenje i pokretanje primjera potrebne su vam reference na sljedeće sklopove: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.ServiceBrokerEnum • Microsoft.SqlServer.Smo Objekt ServiceBroker, opisan u gornjoj klasi unutar hijerarhije SMO Service Broker klasa, predstavlja implementaciju Service Brokera na SQL Server bazi podataka. Svojstvo ServiceBroker klase Database vraća implementaciju Service Brokera na bazu podataka.

Enumeriranje Service Broker objekata Ovaj primjer enumerira sve Service Broker objekte – tipove poruka, ugovore, redove, usluge, smjer i poveznice udaljenih usluga: using System; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo.Broker;

390 | Programiranje SQL Server 2005

Slika 17-2. Odnosi između Service Broker klasa

Poglavlje 17: Service Broker | 391

SubscriptionCondition ScheduledRule

Subscription ConditionEventRule

Subscription ScheduleRule

Subscription EventRule

SubscriptionField

Subscription Chronicle

Application DatabaseFile

ApplicationDatabase ApplicationDatabase FileGroup LogGroup

ApplicationDatabase Options

EventField

Distributer

NonHosted EventProvider

DeliveryChannel Arguments

VacumSchedule SubscriptionClass

Application

DeliveryChannel

Instance

EventClass

HostedEvent ProviderArgument

HostedEvent Provider

ProtocolDefinition

EventChronicle

NotificationServices

Content FormatterArgument

Content Formatter

Generator

ProtocolField

NotificationClass Protocol

NotificationClass

ProtocolRetry Schedule

Notification Field

Notification ComputerField

InstanceDatabase LogFile

InstanceDatabase Options

InstanceDatabase Field

InstanceDatabase FileGroup

class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["AdventureWorks"]; ServiceBroker sb = db.ServiceBroker; Console.WriteLine("MESSAGE TYPES:"); foreach (MessageType mt in sb.MessageTypes) Console.WriteLine(" " + mt.Name); Console.WriteLine(Environment.NewLine + "CONTRACTS:"); foreach (ServiceContract sc in sb.ServiceContracts) Console.WriteLine(sc.Name); Console.WriteLine(Environment.NewLine + "QUEUES:"); foreach (ServiceQueue sq in sb.Queues) Console.WriteLine(" " + sq.Name); Console.WriteLine(Environment.NewLine + "SERVICES:"); foreach (BrokerService bs in sb.Services) Console.WriteLine(" " + bs.Name); Console.WriteLine(Environment.NewLine + "ROUTES:"); foreach (ServiceRoute sr in sb.Routes) Console.WriteLine(" " + sr.Name); Console.WriteLine(Environment.NewLine + "REMOTE SERVICE BINDINGS:"); foreach (RemoteServiceBinding rsb in sb.RemoteServiceBindings) Console.WriteLine(" " + rsb.Name); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 17-3. Klasa ServiceBroker izlaže skup kolekcija sljedećih Service Broker objekata: tipova poruka, ugovora, redova, usluga, smjerova i poveznica udaljenih usluga. Sada ćemo obratiti pažnju na klase koje se koriste za programsko upravljanje navedenim objektima. Klase koje se koriste za upravljanje Server Broker tipovima poruka opisane se u tablici 17-1.

392 | Programiranje SQL Server 2005

Slika 17-3. Rezultati primjera enumeracije Service Broker objekata Tablica 17-1. SMO klase za upravljanje Service Broker tipovima poruka Klasa

Opis

MessageType

Predstavlja tip poruke.

MessageTypeCollection

Predstavlja kolekciju tipova poruka kao objekte MessageType. Svojstvo MesageType klase ServiceBroker vraća tipove poruka definirane Service Broker instancom.

MessageTypeEvents

Predstavlja postavke potrebne za obavijest o događaju tipa poruke. Objekt BrokerServiceEvents dobiven je s pomoću svojstva Events objekta MessageType i ne može biti stvoren kao samostalan objekt.

MessageTypeMapping

Predstavlja odnos između tipa poruke i ugovora usluge.

MessageTypeMappingCollection

Predstavlja kolekciju preslika tipova poruka kao objekte MessageTypeMapping. Svojstvo MessageTypeMappings klase ServiceContract vraća tipove poruka definirane na ugovoru usluge.

Poglavlje 17: Service Broker | 393

Klase namijenjene programskom upravljanju Service Broker ugovorima usluga opisane su u tablici 17-2. Tablica 17-2. SMO klase za upravljanje Service Broker ugovorima usluga Klasa

Opis

ServiceContract

Predstavlja ugovor.

ServiceContractCollection

Predstavlja kolekciju ugovora kao objekte ServiceContract. Svojstvo ServiceContracts klase ServiceBroker vraća ugovore definirane na Service Broker instanci.

ServiceContractEvents

Predstavlja postavke potrebne za obavijest o događaju ugovora usluge. Objekt ServiceContractEvents dobiven je s pomoću svojstva Events objekta ServiceContract i ne može biti stvoren kao samostalan objekt. Metoda SubscribeToEvents() klase ServiceContractEvents određuje događaje koje će primiti kao objekt ObjectEventSet.

ServiceContractMapping

Predstavlja kolekciju ugovora koji su preslikani na Service Broker uslugu.

ServiceContractMappingCollection

Predstavlja kolekciju preslika ugovora usluge kao objekte ServiceContractMapping. Svojstvo ServiceContractMappings klase BrokerService vraća ugovore koji su preslikani na Service Broker instancu.

Klase namijenjene programskom upravljanju Server Broker redovima poruka opisane su u tablici 17-3. Tablica 17-3. SMO klase za upravljanje Service Broker redovima poruka Klasa

Opis

ServiceQueue

Predstavlja red poruke.

ServiceQueueCollection

Predstavlja kolekciju redova ServiceQueue objektima. Svojstvo Queues klase ServiceBroker vraća redove definirane na ServiceBroker instanci.

ServiceQueueEvents

Predstavlja postavke za obavijest o događaju reda usluge. Objekt ServiceQueueEvents dobiven je s pomoću svojstva Events objekta ServiceQueue i ne može biti stvoren kao samostalan objekt. Metoda SubscribeToEvents() klase ServiceQueueEvents zadaje događaje koje će primiti kao objekt ServiceEventSet.

ServiceQueueEvent ServiceQueueEventSet

Predstavlja događaj reda usluge koji se može uključiti u objekt ServiceQueueE-

ventSet.

Predstavlja skup događaja redova usluga kao objekte ServiceQueueEvent.

Klase namijenjene programskom upravljanju Server Broker uslugama opisane su u tablici 17-4.

394 | Programiranje SQL Server 2005

Tablica 17-4. SMO klase za upravljanje Service Broker uslugama Klasa

Opis

BrokerService

Predstavlja Service Broker uslugu.

BrokerServiceCollection

Predstavlja kolekciju Service Broker usluga kao objekte BrokerService. Svojstvo Services klase ServiceBroker vraća Service Broker usluge definirane na Service Broker implementaciji.

BrokerServiceEvents

Predstavlja postavke za obavijest o događaju Service Broker usluge. Objekt BrokerServiceEvents dobiven je s pomoću svojstva Events objekta BrokerService i ne može biti stvoren kao samostalan objekt.

Metoda SubscribeToEvents() klase BrokerServiceEvents zadaje događaje koje će primiti kao objekt ObjectEventSet.

SMO klase koje se koriste za programsko upravljanje Server Broker smjerovima opisane su u tablici 17-5. Tablica 17-5. SMO klase za upravljanje Service Broker smjerovima Klasa

Opis

ServiceRoute

Predstavlja Service Broker smjer.

ServiceRouteCollection

Predstavlja kolekciju smjerova kao objekte ServiceRoute. Svojstvo Routes klase ServiceBroker vraća smjerove definirane na Service Broker instanci.

ServiceRouteEvents

Predstavlja postavke za obavijest o događaju smjera usluge. Objekt ServiceRouteEvents dobiven je s pomoću svojstva Events objekta ServiceRoute i ne može biti stvoren kao samostalan objekt. Metoda SubscribeToEvents() klase ServiceRouteEvents određuje događaje koje će primiti kao objekt ObjectEventSet.

SMO klase namijenjene programskom upravljanju Server Broker poveznicima udaljenih usluga opisane su u tablici 17-6. Tablica 17-6. SMO klase za upravljanje Service Broker poveznicama udaljenih usluga. Klasa

Opis

RemoteServiceBinding

Predstavlja postavke koje Service Broker koristi za sigurnost i provjeru vjerodostojnosti prilikom komuniciranja s udaljenom uslugom.

RemoteServiceBindingCollection

Predstavlja kolekciju poveznica udaljenih usluga kao objekte RemoteServiceBinding. Svojstvo RemoteServiceBindings klase ServiceBroker vraća poveznice udaljenih usluga definirane na Service Broker instanci.

RemoteServiceBindingEvents

Predstavlja postavke za obavijest o događaju poveznica udaljenih usluga. Objekt RemoteServiceBindingEvents dobiven je s pomoću svojstva Events objekta RemoteServiceBinding i ne može biti stvoren kao samostalan objekt. Metoda SubscribeToEvents() klase RemoteServiceBindingEvents zadaje događaje koje će primiti kao objekt ObjectEventSet.

Poglavlje 17: Service Broker | 395

Implementiranje Service Broker usluge Ovaj primjer stvara Service Broker objekte koje ćemo upotrijebiti u drugim primjerima nešto kasnije u ovom poglavlju. Stvaraju se sljedeći objekti: • Tipovi poruka sa zahtjevom i odgovorom s pomoću klase MessageType. • Ugovor koji preslikava tipove poruka sa zahtjevom i odgovorom na početne i ciljne uloge s pomoću klasa ServiceContract i MessageTypeMapping. • Početne i ciljne redove s pomoću klase ServiceQueue. • Usluge zahtjeva i odgovora s pomoću klase BrokerService. Ove usluge vezane su za odgovarajući ugovor putem klase ServiceContractMapping. Slijedi izvorni kod: using System; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo.Broker; class Program { static void Main(string[] args) { Server server = new Server("localhost"); Database db = server.Databases["ProgrammingSqlServer2005"]; ServiceBroker sb = db.ServiceBroker; // Stvaranje tipova poruka sa zahtjevom i odgovorom MessageType requestMessage = new MessageType(sb, "HelloWorldRequest"); requestMessage.MessageTypeValidation = MessageTypeValidation.Xml; requestMessage.Create( ); MessageType responseMessage = new MessageType(sb, "HelloWorldResponse"); responseMessage.MessageTypeValidation = MessageTypeValidation.Xml; responseMessage.Create( ); // Stvaranje ugovora usluge ServiceContract contract = new ServiceContract(sb, "HelloWorldContract"); contract.MessageTypeMappings.Add(new MessageTypeMapping( contract, "HelloWorldRequest", MessageSource.Initiator)); contract.MessageTypeMappings.Add(new MessageTypeMapping( contract, "HelloWorldResponse", MessageSource.Target)); contract.Create( ); // Stvaranje redova ServiceQueue initiatorQueue = new ServiceQueue(sb, "HelloWorldInitiator"); initiatorQueue.Create( ); ServiceQueue targetQueue = new ServiceQueue(sb, "HelloWorldTarget"); targetQueue.Create( );

396 | Programiranje SQL Server 2005

// Stvaranje usluga BrokerService requestService = new BrokerService(sb, "HelloWorldRequestService"); requestService.QueueName = "HelloWorldTarget"; requestService.ServiceContractMappings.Add( new ServiceContractMapping(requestService, "HelloWorldContract")); requestService.Create( ); BrokerService responseService = new BrokerService(sb, "HelloWorldResponseService"); responseService.QueueName = "HelloWorldInitiator"; responseService.ServiceContractMappings.Add( new ServiceContractMapping(responseService, "HelloWorldContract")); responseService.Create( ); Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Novostvorene objekte možete pogledati u Object Exploreru u SQL Server Management Studiju otvaranjem čvora Databases – ProgrammingSqlServer2005 – Service Broker. Ovaj primjer ne određuje sva moguća svojstva prilikom stvaranja objekata. Na primjer, ne navodi se vlasnik poruke, već je podrazumijevano određeno da je on Windows račun. Sada ćemo se osvrnuti na opći pristup stvaranju različitih objekata u ovom primjeru. Stvaranjem tipa poruke zadaje se ime poruke, vlasnik tipa poruke kao korisnik baze podataka ili kao uloga, te način na koji se poruka proglašava vrijednošću enumeracije MessageTypeValidation, kao što je opisano u tablici 17-7. Tablica 17-7. Enumeracija MessageTypeValidation Vrijednost

Opis

Empty

Tijelo poruke mora biti nula.

None

Potvrđivanje se ne provodi.

Xml

Tijelo poruke mora sadržavati dobro oblikovan XML.

XmlSchemaCollection

Tijelo poruke mora sadržavati XML koji potvrđuje kolekciju XML sheme određene svojstvom ValidationXmlSchemaCollection za tip poruke.

Stvaranjem ugovora zadaje se ime ugovora, vlasnik ugovora koji se definira kao korisnik baze podataka ili kao uloga, tipovi poruka koji su uključeni u ugovor, te krajnje točke (MessageSource.Initiator, MessageSource.InititatirAndTarget ili MessageSource.Target) koje mogu slati svaki tip poruke. Stvaranjem reda zadaje se ime reda, status (koji pokazuje je li red spreman za korištenje), zadržavanje (koje pokazuje jesu li dobivene poruke uklonjene iz reda) i,

Poglavlje 17: Service Broker | 397

opcionalno, pohranjena procedura koja se pokreće dospijećem poruke u red i služi za automatsku obradu poruke. Stvaranjem usluge određuje se ime usluge, vlasnik usluge koji se definira kao korisnik baze podataka ili kao uloga, red koji prima poruke za uslugu te ime jednog ili više ugovora za koje je usluga cilj. Usluga može započeti konverzaciju samo ako nije odabran nijedan ugovor. Stvaranjem smjera zadaje se ime smjera, vlasnik smjera koji se definira kao korisnik baze podataka ili kao uloga, ime udaljene usluge na koju smjer upućuje, baza podataka koja ugošćuje ciljnu uslugu, vrijeme tijekom kojeg SQL Server drži smjer u tablici usmjeravanja i mrežne adrese smjera. Osim toga, možete stvoriti i drugi objekt–poveznicu udaljene usluge. Stvaranjem poveznice udaljene usluge zadaje se ime poveznice udaljene usluge, vlasnik poveznice koji se definira kao korisnik baze podataka ili kao uloga, principal baze podataka koji sadrži certifikat povezan s udaljenom uslugom, te udaljena usluga koja se povezuje s korisnikom. Prethodni primjer odgovara sljedećem nizu T-SQL DML iskaza: USE [ProgrammingSqlServer2005] GO CREATE MESSAGE TYPE [HelloWorldRequest] VALIDATION = WELL_FORMED_XML CREATE MESSAGE TYPE [HelloWorldResponse] VALIDATION = WELL_FORMED_XML CREATE CONTRACT [HelloWorldContract] ( [HelloWorldRequest] SENT BY INITIATOR, [HelloWorldResponse] SENT BY TARGET ) CREATE QUEUE [HelloWorldInitiator] CREATE QUEUE [HelloWorldTarget] CREATE SERVICE [HelloWorldRequestService] ON QUEUE [HelloWorldTarget] ( [HelloWorldContract] ) CREATE SERVICE [HelloWorldResponseService] ON QUEUE [HelloWorldInitiator] ( [HelloWorldContract] )

Sljedeći niz T-SQL naredbi pokreće konverzaciju s usluge HelloWorldRequestService na uslugu HelloWorldResponseService putem HelloWorldContract i šalje poruku tipa HelloWorldRequest putem konverzacije: BEGIN TRANSACTION DECLARE @conversationHandle uniqueidentifier

398 | Programiranje SQL Server 2005

BEGIN DIALOG @conversationHandle FROM SERVICE [HelloWorldRequestService] TO SERVICE 'HelloWorldResponseService' ON CONTRACT [HelloWorldContract] WITH ENCRYPTION = OFF; SEND ON CONVERSATION @conversationHandle MESSAGE TYPE [HelloWorldRequest] ( CAST(N'Hello world request' AS XML) ) COMMIT

T-SQL naredba BEGIN DIALOG započinje konverzaciju između dvije usluge. Novoj konverzaciji sustav dodjeljuje identifikator konverzacije s tipom podatka uniqueidentifier. Sve poruke dio su konverzacije. Na početku konverzacije možete zadati konverzacijsku grupu. Ako to ne učinite, SQL Server će automatski stvoriti novu konverzacijsku grupu za novu konverzaciju. T-SQL naredba SEND šalje poruku do usluge koja koristi postojeću konverzaciju – konverzacija kojoj poruka pripada zadaje se identifikatorom konverzacije poput onog dobivenog naredbom BEGIN DIALOG u prethodnom primjeru. Ako naredba SEND nije prva naredba u nizu, prethodnu T-SQL naredbu završite točkom-zarezom (;). Sljedeći niz T-SQL naredbi vraća prvu poruku iz reda HelloWorldInitiator. Ako je ime tipa poruke HelloWorldRequest, odgovor se šalje (kao i prije, T-SQL naredbom SEND) kao dio konverzacije započete u prethodnom primjeru, a konverzacija se prekida. DECLARE @conversationHandle uniqueidentifier DECLARE @message_body nvarchar(MAX) DECLARE @message_type_name sysname; BEGIN TRANSACTION; RECEIVE TOP(1) @message_type_name = message_type_name, @conversationHandle = conversation_handle, @message_body = message_body FROM [HelloWorldInitiator] IF @message_type_name = 'HelloWorldRequest' BEGIN SEND ON CONVERSATION @conversationHandle MESSAGE TYPE [HelloWorldResponse] ( CAST(N'Hello world response' AS XML) ); END CONVERSATION @conversationHandle; END COMMIT

Poglavlje 17: Service Broker | 399

T-SQL naredba RECEIVE vraća jednu ili više poruka iz reda poruke. Naredba RECEIVE može zadati koji će identifikator konverzacije ili identifikator konverzacijske grupe vratiti određene poruke. Naredba RECEIVE sadrži i opcionalnu klauzulu WAITFOR koja zadaje vrijeme čekanja na poruku. Naredba RECEIVE uklanja poruku iz reda osim ako je svojstvo RETENTION reda postavljeno na on. Ako naredba RECEIVE nije prva naredba u nizu, prethodnu naredbu završite točkom-zarezom (;). T-SQL naredba END CONVERSATION prekida jednu stranu postojeće konverzacije. Konverzacija završava kada i inicijator i cilj prekinu konverzaciju ili kada konverzacija istekne, što je zadano argumentom LIFETIME u T-SQL naredbi BEGIN DIALOG. Po završetku konverzacije, Service Broker uklanja sve poruke konverzacije iz reda usluge. T-SQL naredba BEGIN CONVERSATION TIMER možete upotrijebiti za pokretanje mjerača vremena. Kada mjeraču istekne vrijeme, na lokalni red za konverzaciju stavlja se poruka tipa http://schemas.Microsoft.com/SQL/ServiceBroker/Messages/DialogTimer. Svaka strana konverzacije ima vlastiti mjerač vremena konverzacije. Osim navedenih naredbi, možete upotrijebiti i GET TRANSMISSION za vraćanje opisa zadnje pogreške u prijenosu za jednu stranu konverzacije. Ako je zadnji prijenos uspio, vraća se prazan niz. Poruku možete vidjeti slanjem upita redu HelloWorldTarget s pomoću T-SQL naredbe SELECT: SELECT * FROM HelloWorldTarget

Service Broker upravlja sadržajem reda. Ipak, iako možete upotrijebiti naredbe SELECT za slanje upita o sadržaju reda, red ne može biti cilj naredbi INSERT, UPDATE i DELETE. Ovaj niz T-SQL naredbi dobiva poruku s odgovorom od reda HelloWorldTarget, stvara odgovor i prekida konverzaciju: DECLARE @conversationHandle uniqueidentifier DECLARE @message_body nvarchar(MAX) DECLARE @message_type_name sysname; BEGIN TRANSACTION; RECEIVE TOP(1) @message_type_name = message_type_name, @conversationHandle = conversation_handle, @message_body = message_body FROM [HelloWorldTarget] IF @message_type_name = 'HelloWorldResponse' BEGIN PRINT @message_type_name; PRINT @conversationHandle;

400 | Programiranje SQL Server 2005

PRINT @message_body; END CONVERSATION @conversationHandle; END COMMIT

Dobiveni rezultati prikazani su na slici 17-4.

Slika 17-4. Rezultati primjera dobivanja odgovora

Poglavlje 17: Service Broker | 401

POGLAVLJE 18

Notification Services

Notification Services je programski kostur koji se temelji na XML-u i T-SQL-u. Namijenjen je izgradnji aplikacija za stvaranje i slanje poruka pretplatnicima. Obavijesti se mogu slati prema rasporedu ili kao odgovor na uvjete i događaje. Šalju se putem ugrađenih ili prilagođenih protokola za isporuku. Mogu se slati sustavima za slanje poruka poput elektroničke pošte i mobilnih telefona. Notifications Services aplikacije sadrže mnogo funkcija, među kojima su: Korisničke aplikacije Obavještavaju korisnike o statusu, promjeni usluga i proizvodima koji odgovaraju njihovim potrebama. Poslovne aplikacije Nadziru poslovne podatke i operacije unutar tvrtke. Aplikacije za zaposlenike Povezuju zaposlenike te ih pravodobno informiraju o novim zbivanjima.

Arhitektura Notification Services aplikacije temelje se na pretplatničkom modelu. Slijede ključni pojmovi koji opisuju sve sastavnice Notification Services aplikacije: Pretplatnik Korisnik ili aplikacija koja traži i dobiva obavijest. Pretplata Zahtjev za informacijom, mehanizam isporuke i odredište traženih obavijesti.

402

Događaj Informacija ili pojava zanimljiva pretplatniku. Obavijest Poruka s informacijom koju je zatražio pretplatnik. Slika 18-1 prikazuje odnos između navedenih pojmova. Pretplatnici Aplikacija za upravljanje pretplatom Pretplate Objekti upravljanja pretplatom

Događaji

Računalo pružatelj usluga

Generator

SQL server

Distributer

Obavijest

Datoteka za konfiguraciju instance Datoteka s definicijom aplikacije

Slika 18-1. Odnos između Notification Services sastavnica

Platforma Notification Services pohranjuje sistemske podatke te stvara i distribuira obavijesti. Sadrži sljedeće: • Notification Services stroj s računalom-pružateljem, generatorom i distributerom. • Notification Services bazu podataka. Notification Services instanca ugošćuje Notification Services aplikaciju. Aplikacija stvara i šalje poruke aplikacijskim pretplatnicima – korisnicima ili drugim aplikacijama. Pretplatnik stvara pretplate na aplikaciju. Aplikacija prati i sakuplja događaje.

Poglavlje 18: Notification Services | 403

Notification Services uspoređuje pretplatu i događaje te stvara, oblikuje i šalje obavijest pretplatniku kada su događaj i pretplata povezani. Aplikacijska baza podataka pohranjuje događaj, pretplatu, podatke o obavijesti i metapodatke o Notification Services aplikaciji. Aplikacije u Notification Services instanci mogu međusobno dijeliti pretplatnike i mehanizme isporuke tako da se mogu administrirati kao grupa. Aplikacija za upravljanje pretplatom upravlja podacima o pretplatniku i pretplati u kosturu Notification Services. Upravljanje pretplatom je postupak upravljanja pretplatnicima, informacijama koje ih zanimaju (pretplatama) i mjestom isporuke obavijesti (informacijama o uređaju). Upravljanje pretplatom obavlja Windows ili Web aplikacija s pomoću objekata za upravljanje pretplatom koji se nalaze u klasama Notification Services Management Objects (NMO) – to je kolekcija klasa namijenjena za programsko stvaranje Notification Services instanci i aplikacija i upravljanje s njima. Klase za upravljanje pretplatom namijenjene su pisanju i čitanju pretplatnika, pretplate i podataka o pretplatničkom uređaju s kostura Notification Services. Za podršku Notification Services aplikacijama i aplikacijama za upravljanje pretplatom, Notification Services pruža API koji pronalazi i čuva informacije o pretplati i pretplatniku, sakuplja i pohranjuje podatke o događaju, uspoređuje pretplate i događaje prije stvaranja obavijesti, oblikuje podatke o događaju u poruke prema protokolu isporuke te šalje poruke pretplatnicima. U preostalom dijelu poglavlja detaljnije ćemo se osvrnuti na ovaj proces. Pružatelj događaja (engl. provider) sakuplja podatke o događaju iz različitih izvora i predaje ih Notification Services aplikaciji koja koristi jedan poslužitelj događaja ili više njih. Notification Services šalje s pomoću tri standardna poslužitelja događaja: File System Watcher pružatelj događaja Pokreće se dodavanjem XML datoteke praćenoj mapi. ClassName ovog pružatelja događaja je FileSystemWatcherProvider. SQL Server pružatelj događaja Koristi T-SQL upit za dobivanje informacija iz baze podataka i stvaranje Notification Services događaja temeljenih na rezultatu. ClassName ovog pružatelja događaja glasi SQLProvider. Analysis Services pružatelj događaja Koristi statički ili dinamički višedimenzionalni izraz (MDX) kao upit za dobivanje informacija iz Analysis Service kocke. Stvara Notification Services događaje temeljene na rezultatu. O SQL Service Analysis Services (SSAS) i MDX upitima bit će više riječi u poglavlju 18. ClassName ovog pružatelja događaja je AnalysisServicesProvider. Ako standardni pružatelj događaja ne odgovara vašim potrebama, možete izgraditi prilagođeni.

404 | Programiranje SQL Server 2005

Pružatelj događaja može biti ugošćen ili neugošćen. Ugošćen (engl. hosted) pružatelj događaja izvršava se unutar Notification Services neprekidno ili prema rasporedu. Neugošćeni (engl. nonhosted) pružatelj događaja pokreće se kao vanjska aplikacija i predaje događaje prema rasporedu. Klasa događaja (engl. event class) predstavlja jedan tip događaja koji se može predati Notification Services aplikaciji i upotrijebiti za stvaranje obavijesti. Definicija klase događaja sadrži imena polja, tipove podataka za događaj i dodatne podatke. Klasa događaja koristi se za implementaciju pozadinskih objekata SQL Server baze podataka za pohranu podataka o događaju i dodatnih podataka. Kronika događaja (engl. event chronicle) sastoji se od dodatnih tablica za pohranu podataka o događaju. Obično se koristi za pohranu najnovijih podataka o događaju kao podrška redovnoj pretplati. Podaci se ažuriraju pri svakoj promjeni i koriste pri svakoj procjeni redovne pretplate. Pravilo kronike događaja sadrži T-SQL upite koji održavaju podatke o kronici događaja u pozadinskim SQL Server tablicama. Klasa pretplate (engl. subscription class) predstavlja jedan tip pretplate na Notification Services aplikaciju. Definicija klase pretplate sadrži oba polja za pohranu podataka o pretplati i pravilo o izdavanju obavijesti koje uspoređuje događaje s podacima o pretplati. SQL Server koristi klasu pretplate za implementaciju pozadinskih objekata za pohranu podataka o pretplati i dodatnih podataka u bazu podataka. Nakon što pružatelj događaja sakupi događaje, generator obrađuje pretplate uspoređujući ih s događajima primjenom pravila o izdavanju obavijesti. Postavkama generatora određeno je koje računalo pokreće generator i koliko dretvi generator može upotrijebiti prilikom obrade aplikacijskih pravila. Klasa obavijesti (engl. notification class) predstavlja jedan tip obavijesti koju daje Notification Services aplikacija. Definicija klase obavijesti sadrži polja i tipove podataka za definiranje podataka koji se šalju pretplatniku, informacije o formateru sadržaja te informacije o primjeni protokola isporuke pri slanju obavijesti. Klasa obavijesti koristi se za implementiranje pozadinskih objekata SQL Server baze podataka za pohranu podataka o obavijestima i dodatnih podataka. Distributer (engl. distributor) kojeg pokreće Notification Services stroj, upravlja oblikovanjem i isporukom obavijesti. Svakog distributerskog kvanta – konfigurirajućeg intervala – distributer traži radnu jedinicu – skup obavijesti za obradu. Ako ju pronađe, poziva formater sadržaja da preobliči podatke u obavijesti i pošalje oblikovane obavijesti pretplatniku putem određenog protokola isporuke. Formater sadržaja (engl. content formatter) oblikuje obavijest s neobrađenim podacima u čitljive poruke u svakoj kombinaciji pretplatničkog mjesta i uređaja. Formater sadržaja potreban je za svaku kombinaciju mjesta i uređaja. Oblikovana poruka može sadržavati obavijest s neobrađenim podacima, dinamički oblikovane podatke koji su sakupljeni za vrijeme oblikovanja i statički tekst kojeg određuje formater sadržaja.

Poglavlje 18: Notification Services | 405

Kanal isporuke (engl. delivery channel) je krajnja točka isporuke. Oblikovane obavijesti šalju se do jednog ili više kanala isporuke. Oni pakiraju obavijesti u pakete za protokol isporuke, a zatim ih šalju uslugama koje dostavljaju pretplatnicima poruke s obavijestima. Notification Services sadrži sljedeće standardne protokole isporuke: Simple Mail Transfer Protocol (SMTP) Stvara i usmjerava poruke s obavijestima za isporuku putem SMTP usluge. File Stvara i usmjerava obavijesti do tekstualnih datoteka. Namijenjen za testiranje aplikacije. Ako standardni protokol isporuke ne odgovara vašim potrebama, možete izgraditi prilagođeni. Kao dodatak standardnom načinu isporuke kojim se oblikuje i šalje samo jedna poruka u određeno vrijeme, Notifications Services nudi još dvije mogućnosti: zbirnu isporuku, kojom se više poruka s obavijestima za pretplatnika okuplja u jednu poruku te višestruku isporuku, kojom se jedna obavijest šalje većem broju korisnika.

Stvaranje Notification Services aplikacije Notifications Services instance i aplikacije možete stvoriti i konfigurirati s pomoću XML datoteka za konfiguraciju i SQL Server 2005 Management Studija ili, programski, upotrebom NMO-a. Aplikacijom koju ste stvorili i konfigurirali putem XML datoteka za konfiguraciju možete programski upravljati s pomoću NMO-a. Sljedeći odlomak objašnjava programiranje putem NMO-a. Kako biste stvorili i konfigurirali Notification Services aplikaciju putem XML datoteka za konfiguraciju, poduzmite sljedeće korake: 1. Stvorite i konfigurirajte Notification Services instancu. Dva su načina na koji to možete učiniti: • Stvorite datoteku za konfiguraciju instance (ICF- Instance Configuration File) za Notification Services instancu. ICF je XML datoteka koja opisuje Notification Services instancu. ICF imenuje instancu te sadrži metapodatke o instanci, SQL Server instancu koja ugošćuje bazu podataka instance, protokole isporuke, kanale isporuke i šifre. Datoteka za konfiguraciju također navodi aplikacije koje su ugošćene u instanci. • Upotrijebite NMO za programsko konfiguriranje Notification Services instance. 2. Stvorite i konfigurirajte Notification Services aplikaciju. U nju su uključeni struktura događaja, pretplate i obavijesti, podaci o konfiguraciji za distributera i generatora te postavke za pokretanje aplikacije. Aplikaciju možete stvoriti i konfigurirati na jedan od sljedeća dva načina: 406 | Programiranje SQL Server 2005

• Stvorite datoteku s definicijom aplikacije (engl. Application Definition File, ADF) za Notification Services aplikaciju. ADF je XML datoteka s metapodacima koji definiraju Notification Services aplikaciju. Potrebno je stvoriti ADF za svaku aplikaciju ugošćenu u Notification Services instanci. • Upotrijebite NMO za programsko konfiguriranje Notification Services instance. 3. Stvorite aplikaciju za upravljanje pretplatom koja dopušta korisnicima prijavu i upravljanje pretplatama i ciljnim uređajima. 4. Stvorite aplikaciju za upravljanje pretplatom s pomoću NMO klasa za upravljanje pretplatom. 5. Stvorite, prema potrebi, prilagođene pružatelje događaja, formatere sadržaja i protokole isporuke. 6. Instalirajte Notification Services aplikaciju. Za dodatne informacije o stvaranju i upotrebi ICF i ADF datoteka i shema za sve tipove datoteka, pogledajte Microsoft SQL Server 2005 Books Online.

Programiranje Notification Services rješenja Notification Services rješenje možete razviti konfiguriranjem Notification Services instance u IDF datoteci i definiranjem ADF datoteke za aplikaciju, o čemu je bilo riječi u prethodnom dijelu. To možete učiniti i konfiguriranjem i definiranjem instance s pomoću NMO klasa. Programiranje s NMO klasama glavna je tema ovog dijela. NMO sadrži klase namijenjene programskom stvaranju Notification Services instanci i aplikacija i upravljanju njima. Slika 18-2 prikazuje odnose između NMO klasa. NMO imenski prostor Microsoft.SqlServer.Management.Nmo sadrži klase za izgradnju Notification Services instanci i aplikacija. Imenski prostor Microsoft.SqlServer.Management.Nmo sadrži klase i sučelja za razvoj prilagođenih pružatelja događaja, formatera sadržaja i protokola isporuke. Također sadrži sučelja za upravljanje pretplatom. U preostalom dijelu ovog poglavlja opisane se NMO klase i dani primjeri njihove upotrebe. Za prevođenje i pokretanje primjera potrebne su vam reference na sljedeće sklopove: • Microsoft.SqlServer.Connection.Info • Microsoft.SqlServer.NotificationServices • Microsoft.SqlServer.Smo NotificationServices je najviše pozicionira klasa u hijerarhiji NMO klasa i predstavlja

Notification Services poslužitelj.

Poglavlje 18: Notification Services | 407

Slika 18-2. Hijerarhija NMO klasa

408 | Programiranje SQL Server 2005

SubscriptionCondition ScheduledRule

Subscription ConditionEventRule

Subscription ScheduleRule

Subscription EventRule

SubscriptionField

Subscription Chronicle

Application DatabaseFile

ApplicationDatabase ApplicationDatabase FileGroup LogGroup

ApplicationDatabase Options

EventField

Distributer

NonHosted EventProvider

DeliveryChannel Arguments

VacumSchedule SubscriptionClass

Application

DeliveryChannel

Instance

EventClass

HostedEvent ProviderArgument

HostedEvent Provider

ProtocolDefinition

EventChronicle

NotificationServices

Content FormatterArgument

Content Formatter

Generator

ProtocolField

NotificationClass Protocol

NotificationClass

ProtocolRetry Schedule

Notification Field

InstanceDatabase LogFile

InstanceDatabase File

Notification ComputerField

InstanceDatabase Options

InstanceDatabase FileGroup

Stvaranje Notification Services aplikacije i usluge U ovom će dijelu biti riječi o izradi potpune Notification Services aplikacije koja izdaje obavijesti putem datoteke i putem elektroničke pošte na temelju promjena cijene dionica. U ovom primjeru podaci o cijeni dionica svedeni su na simbol i cijenu. Stvorena su dva pretplatnika – jedan koji se obavještava putem tekstualne datoteke i jedan koji se obavještava putem elekroničke pošte. Svaki od tih pretplatnika nadzire jednu dionicu – simbole ABC i DEF. Prikazat ćemo aplikaciju koja stvara Notification Services aplikaciju StockWatch i dodaje joj dva pretplatnika sa pripadajućim pretplatama. Nakon toga slijedi detaljno objašnjenje različitih dijelova aplikacije. Poduzmite sljedeće korake kako biste stvorili Notification Services aplikaciju StockWatch s dva pretplatnika i pretplatom za svakog, pokrenuli uslugu i izdali obavijesti: 1. Stvorite C# konzolnu aplikaciju u mapi C:\PSS2005. Projekt nazovite NotificationServices.

2. Dodajte sljedeće reference na projekt: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.NotificationServices • Microsoft.SqlServer.Smo 3. Zamijenite kod u Program.cs kodom iz primjera 18-1. U preostalom dijelu poglavlja detaljno ćemo ga objasniti. Primjer 18-1. Primjer Notification Services using System; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Nmo; using ns = Microsoft.SqlServer.NotificationServices; class Program { private static Instance nsi; private static Application a; private private private private

const const const const

string string string string

baseDirectoryPath = @"C:\PSS2005\NotificationServices"; nsServer = "NSServerName"; serviceUserName = "NSUSerName"; servicePassword = "NSPassword";

static void Main(string[] args) { Server server = new Server("(local)"); // Stvara novu instancu

Poglavlje 18: Notification Services | 409

Primjer 18-1. Primjer Notification Services (nastavak) NotificationServices ns = server.NotificationServices; nsi = new Instance(ns, "StockWatch"); CreateDeliveryChannel(

);

// Stvara novu aplikaciju u instanci StockWatch a = new Application(nsi, "StockWatchApp"); a.BaseDirectoryPath = baseDirectoryPath; CreateEventClass( ); CreateSubscriptionClass( ); CreateNotificationClass( ); CreateHostedEventProvider( ); CreateGenerator( ); CreateDistributor( ); CreateVacuumSchedule( ); a.QuantumDuration = new TimeSpan(0, 0, 15); a.PerformanceQueryInterval = new TimeSpan(0, 0, 5); a.SubscriptionQuantumLimit = 1; a.ChronicleQuantumLimit = 1; a.VacuumRetentionAge = new TimeSpan(0, 0, 1); nsi.Applications.Add(a); Console.WriteLine("Added application."); nsi.Create( ); nsi.RegisterLocal(serviceUserName, servicePassword); nsi.Enable( ); Console.WriteLine("Application enabled." + Environment.NewLine); CreateSubscriber( ); CreateSubscription( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } private static void CreateDeliveryChannel( ) { DeliveryChannelArgument dca; // Dodaje kanal za isporuku datoteke DeliveryChannel dcFile = new DeliveryChannel(nsi, "StockWatchFileDeliveryChannel"); dcFile.ProtocolName = "File"; dca = new DeliveryChannelArgument(dcFile, "FileName"); dca.Value = baseDirectoryPath + @"\Notifications\FileNotifications.txt"; dcFile.DeliveryChannelArguments.Add(dca); nsi.DeliveryChannels.Add(dcFile); Console.WriteLine("Added delivery channel: " + dcFile.Name);

410 | Programiranje SQL Server 2005

Primjer 18-1. Primjer Notification Services (nastavak) // Dodaje kanal za isporuku elektroničke pošte DeliveryChannel dcEmail = new DeliveryChannel(nsi, "StockWatchEmailDeliveryChannel"); dcEmail.ProtocolName = "SMTP"; nsi.DeliveryChannels.Add(dcEmail); Console.WriteLine("Added delivery channel: " + dcEmail.Name); } private static void CreateEventClass( ) { EventClass ec = new EventClass(a, "StockWatchEvents"); EventField ef; ef = new EventField(ec, "Symbol"); ef.Type = "nvarchar(6)"; ec.EventFields.Add(ef); ef = new EventField(ec, "Price"); ef.Type = "float"; ec.EventFields.Add(ef); a.EventClasses.Add(ec); Console.WriteLine("Added event class: " + ec.Name); } private static void CreateSubscriptionClass( ) { SubscriptionClass sc = new SubscriptionClass(a, "StockWatchSubscriptions"); SubscriptionField sf; sf = new SubscriptionField(sc, sf.Type = "nvarchar(255)"; sc.SubscriptionFields.Add(sf); sf = new SubscriptionField(sc, sf.Type = "nvarchar(10)"; sc.SubscriptionFields.Add(sf); sf = new SubscriptionField(sc, sf.Type = "nvarchar(6)"; sc.SubscriptionFields.Add(sf); sf = new SubscriptionField(sc, sf.Type = "float"; sc.SubscriptionFields.Add(sf);

"DeviceName");

"SubscriberLocale");

"Symbol");

"Price");

SubscriptionEventRule ser = new SubscriptionEventRule(sc, "StockWatchSubscriptionsEventRule"); ser.Action = @"INSERT INTO StockWatchNotifications (" + "SubscriberId, DeviceName, SubscriberLocale, Symbol, Price) " + "SELECT s.SubscriberId, s.DeviceName, s.SubscriberLocale, " + "e.Symbol, e.Price " + "FROM StockWatchEvents e, StockWatchSubscriptions s " + "WHERE e.Symbol = s.Symbol";

Poglavlje 18: Notification Services | 411

Primjer 18-1. Primjer Notification Services (nastavak) ser.EventClassName = "StockWatchEvents"; sc.SubscriptionEventRules.Add(ser); a.SubscriptionClasses.Add(sc); Console.WriteLine("Added subscription class: " + sc.Name); } private static void CreateNotificationClass( ) { NotificationClass nc = new NotificationClass(a, "StockWatchNotifications"); NotificationField nf; nf = new NotificationField(nc, "Symbol"); nf.Type = "nvarchar(6)"; nc.NotificationFields.Add(nf); nf = new NotificationField(nc, "Price"); nf.Type = "float"; nc.NotificationFields.Add(nf); ContentFormatter cf = new ContentFormatter(nc, "XsltFormatter"); ContentFormatterArgument cfa; cfa = new ContentFormatterArgument(cf, "XsltBaseDirectoryPath"); cfa.Value = a.BaseDirectoryPath + @"\AppDefinition"; cf.ContentFormatterArguments.Add(cfa); cfa = new ContentFormatterArgument(cf, "XsltFileName"); cfa.Value = "StockWatch.xslt"; cf.ContentFormatterArguments.Add(cfa); nc.ContentFormatter = cf; nc.DigestDelivery = true; ProtocolField pf; // Dodaje protokol klase za obavijest putem datoteke NotificationClassProtocol ncpFile = new NotificationClassProtocol(nc, "File"); pf = new ProtocolField(ncpFile, "Symbol"); pf.FieldReference = "Symbol"; ncpFile.ProtocolFields.Add(pf); pf = new ProtocolField(ncpFile, "Price"); pf.FieldReference = "Price"; ncpFile.ProtocolFields.Add(pf); nc.NotificationClassProtocols.Add(ncpFile); // Dodaje protokol klase za obavijest putem elektroničke pošte NotificationClassProtocol ncpEmail = new NotificationClassProtocol(nc, "SMTP");

412 | Programiranje SQL Server 2005

Primjer 18-1. Primjer Notification Services (nastavak) pf = new ProtocolField(ncpEmail, "Subject"); pf.SqlExpression = "'Stock watch: ' + CONVERT(nvarchar(30), GETDATE( ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "BodyFormat"); pf.SqlExpression = "'html'"; ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "From"); pf.SqlExpression = "'[email protected]'"; ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "Priority"); pf.SqlExpression = "'Normal'"; ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "To"); pf.SqlExpression = "DeviceAddress"; ncpEmail.ProtocolFields.Add(pf);

))";

nc.NotificationClassProtocols.Add(ncpEmail); nc.ExpirationAge = new TimeSpan(1, 0, 0); a.NotificationClasses.Add(nc); Console.WriteLine("Added notification class: " + nc.Name); } private static void CreateHostedEventProvider( ) { HostedEventProvider hep = new HostedEventProvider(a, "StockWatchHEP"); hep.ClassName = "FileSystemWatcherProvider"; hep.SystemName = nsServer; HostedEventProviderArgument hepa; hepa = new HostedEventProviderArgument(hep, "WatchDirectory"); hepa.Value = baseDirectoryPath + @"\Events"; hep.HostedEventProviderArguments.Add(hepa); hepa = new HostedEventProviderArgument(hep, "SchemaFile"); hepa.Value = baseDirectoryPath + @"\AppDefinition\EventsSchema.xsd"; hep.HostedEventProviderArguments.Add(hepa); hepa = new HostedEventProviderArgument(hep, "EventClassName"); hepa.Value = "StockWatchEvents"; hep.HostedEventProviderArguments.Add(hepa); a.HostedEventProviders.Add(hep); } private static void CreateGenerator( ) { // Stvara novi generator za aplikaciju Generator g = new Generator(a, "StockWatchGenerator"); g.SystemName = nsServer; a.Generator = g;

Poglavlje 18: Notification Services | 413

Primjer 18-1. Primjer Notification Services (nastavak) Console.WriteLine("Created generator: " + g.Name); } private static void CreateDistributor( ) { Distributor d = new Distributor(a, "StockWatchDistributor"); d.SystemName = nsServer; d.QuantumDuration = new TimeSpan(0, 0, 15); a.Distributors.Add(d); Console.WriteLine("Added distributor: " + d.Name); } private static void CreateVacuumSchedule( ) { VacuumSchedule vs = new VacuumSchedule(a, "StockWatchVacuumSchedule"); vs.StartTime = new TimeSpan(0, 0, 0); a.VacuumSchedules.Add(vs); Console.WriteLine("Added vacuum schedule: " + vs.Name); } private static void CreateSubscriber( ) { ns.NSInstance swnsi = new ns.NSInstance("StockWatch"); ns.Subscriber s; ns.SubscriberDevice sd; // Stvara pretplatnik s = new ns.Subscriber(swnsi); s.SubscriberId = @"KristinHamilton"; s.Add( ); Console.WriteLine("Added subscriber: " + s.SubscriberId); // Stvara uređaj za pretplatu datotekom sd = new ns.SubscriberDevice( ); sd.Initialize(swnsi); sd.DeviceName = "StockWatchSubscriberDevice"; sd.SubscriberId = "KristinHamilton"; sd.DeviceTypeName = "File"; sd.DeviceAddress = "[email protected]"; sd.DeliveryChannelName = "StockWatchFileDeliveryChannel"; sd.Add( ); Console.WriteLine("Added subscriber file device."); // Stvara pretplatnik s = new ns.Subscriber(swnsi); s.SubscriberId = @"TonyHamilton"; s.Add( ); Console.WriteLine("Added subscriber: " + s.SubscriberId);

414 | Programiranje SQL Server 2005

Primjer 18-1. Primjer Notification Services (nastavak) // Stvara uređaj za pretplatu elektroničkom poštom sd = new ns.SubscriberDevice( ); sd.Initialize(swnsi); sd.DeviceName = "StockWatchSubscriberDevice"; sd.SubscriberId = "TonyHamilton"; sd.DeviceTypeName = "Email"; sd.DeviceAddress = "[email protected]"; sd.DeliveryChannelName = "StockWatchEmailDeliveryChannel"; sd.Add( ); Console.WriteLine("Added subscriber email device."); } private static void CreateSubscription( ) { ns.NSInstance swnsi = new ns.NSInstance("StockWatch"); ns.NSApplication a = new ns.NSApplication(swnsi, "StockWatchApp"); ns.Subscription s; // Dodaje pretplate s = new ns.Subscription( ); s.Initialize(a, "StockWatchSubscriptions"); s.SetFieldValue("DeviceName", "StockWatchSubscriberDevice"); s.SetFieldValue("SubscriberLocale", "en-us"); s.SubscriberId = "KristinHamilton"; s.SetFieldValue("Symbol", "ABC"); s.SetFieldValue("Price", "0.00"); s.Add( ); Console.WriteLine("Added subscription: " + s.SubscriberId); s = new ns.Subscription( ); s.Initialize(a, "StockWatchSubscriptions"); s.SetFieldValue("DeviceName", "StockWatchSubscriberDevice"); s.SetFieldValue("SubscriberLocale", "en-us"); s.SubscriberId = "TonyHamilton"; s.SetFieldValue("Symbol", "DEF"); s.SetFieldValue("Price", "0.00"); s.Add( ); Console.WriteLine("Added subscription: " + s.SubscriberId); } }

4. Zamijenite sljedeće konstantne vrijednosti niza od reda 13 do 15: NSServerName Poslužitelj koji pokreće komponente stroja Notification Services. Za ovaj primjer upotrijebite naziv lokalnog računala. NSUserName Korisnički račun pod kojim se usluga NS$tockWatch izvodi. NSPassword Lozinka za korisnički račun NSUserName. Poglavlje 18: Notification Services | 415

5. Prevedite i pokrenite kod. Rezultati su prikazani na slici 18-3.

Slika 18-3. Rezultati primjera Notification Services

6. Pri pokretanju NMO aplikacije, stvaraju se dvije baze podataka – StockWatchNSMain i StockWatchStockWatchApp. Provjerite sadrži li korisnički račun usluge naveden u koraku 4 barem članstvo u ulozi NSRunService za obje baze podataka. 7. Osvježite čvor Notification Services u Object Exploreru u SQL Server Management Studiju za prikaz nove Notification Services usluge, kao što je prikazano na slici 18-4.

Slika 18-4. Rezultati primjera StockWatch usluge

8. Desnom tipkom miša pritisnite uslugu StockWatch i odaberite opciju Start s kontekstnog izbornika kako biste pokrenuli uslugu. 9. Desnom tipkom miša pritisnite uslugu StockWatch i odaberite opciju Properties s kontekstnog izbornika za prikaz dijaloškog okvira Instance Properties (slika 18-5).

416 | Programiranje SQL Server 2005

Slika 18-5. Svojstva instance StockWatch aplikacije

10. Odaberite stranicu Windows Services za prikaz statusa usluge, kao što je prikazano na slici 18-6. Usluga bi se trebala izvoditi. 11. Provjerite je li SMTP usluga – komponenta Internet Information Services (IIS) – instalirana i pokrenuta. Za dodatne informacije pogledajte Microsoft SQL Server Books Online. 12. Stvorite sljedeće tri mape u mapi C:\PSS2005\NotificationServices: AppDefinition Mapa koja sadrži XSLT datoteku za transformaciju namijenjenu oblikovanju obavijesti (u ovom primjeru nazvanu StockWatch.xslt) i sheme za pružatelj događaja (EventSchema.xsd). Te datoteke objašnjene su u koracima 13 i 14. Events Mapa u kojoj su pohranjeni podaci o događajima u obliku XML datoteka (EventData.xml u ovom primjeru). Notifications Mapa u kojoj se stvaraju obavijesti datoteka.

Poglavlje 18: Notification Services | 417

Slika 18-6. Svojstva StockWatch instance na stranici Windows Services

13. Stvorite datoteku EventSchema.xsd, kao što je prikazano u primjeru 18-2, u mapi C: \PSS2005\NotificationServices\AppDefinition. Ova datoteka opisuje shemu pružatelja događaja u datoteci EventData.xml koju opisuje korak 15. Primjer 18-2. EventSchema.xsd

14. Stvorite datoteku StockWatch.xslt, kao što je prikazano u primjeru 18-3, u mapi C:\PSS2005\NotificationServices\AppDefinition. Ova datoteka oblikuje podatke u obavijestima, i onih putem datoteka i onih putem elektroničke pošte. Primjer 18-3. StockWatch.xslt

418 | Programiranje SQL Server 2005

Primjer 18-3. StockWatch.xslt (nastavak) StockWatch Price Update SQL Server StockWatch Notification Services The price of is now $.

15. Stvorite datoteku EventData.xml, kao što je prikazano u primjeru 18-4, u mapi C:\PSS2005\NotificationServices. Ova XML datoteka sadrži podatke o događajima. U ovom primjeru, događaji označeni simbolima ABC i DEF imaju pretplatu i stvaraju obavijesti. Događaj za simbol GHI nema pretplatu i ne stvara obavijesti. Primjer 18-4. EventData.xml ABC 3.83 DEF 5.75 GHI 1.22

16. Kopirajte datoteku EventData.xml u mapu C:\PSS2005\NotificatonServices\ Events kako biste prenijeli događaje. Pružatelj događaja File System Watcher čita podatke iz aplikacije, šalje ih aplikaciji StockWatchApp i mijenja nastavak datoteke događaja u .done nakon obrade datoteke. Ako se pri obradi datoteke javi pogreška, nastavak datoteke mijenja se u .err. 17. Potrebno je manje od minute kako bi se stvorila datoteka obavijesti FileNotification.txt u C:\PSS2005\NotificationServices\Notifications, kao što je prikazano na slici 18-7.

Poglavlje 18: Notification Services | 419

Slika 18-7. FileNotifications.txt

Također se stvara e-mail poruka prikazana na slici 18-8. Ona se nakratko javlja u mapi C:\Inetpub\mailroot\Queue u obliku datoteke s nastavkom .eml da bi se zatim premjestila u mapu C:\Inetpub\mailroot\Badmail budući da adresa elektroničke pošte nije valjana. Da biste poslali e-mail poruku, promijenite adresu elektroničke pošte korisnika TonyHamilton u metodi CreateSubscriber() iz primjera 18-1 promjenom svojstva objekta SubscriberDevice za tog korisnika. Možete uočiti da su obavijesti putem datoteke i putem elektroničke pošte oblikovane s pomoću XSLT datoteke za transformaciju StockWatch.xslt, o čemu je bilo riječi u 14. koraku. U preostalom dijelu poglavlja bavit ćemo se kodom koji stvara uslugu StockWatch, pretplatnike i pretplate.

Stvaranje Notification Services instance i aplikacije Notificaton Services instanca, nazvana StockWatch, i Notification Services aplikacija, nazvana StockWatchApp, stvorene su metodom Main() u primjeru 18-1. U sljedećem primjeru podebljani su dijelovi koda odgovorni za stvaranje Notification Services instance i aplikacije: static void Main(string[] args) { Server server = new Server("(local)");

420 | Programiranje SQL Server 2005

Slika 18-8. Elektronička pošta sa StockWatch obavijesti // Stvara novu instancu NotificationServices ns = server.NotificationServices; nsi = new Instance(ns, "StockWatch"); CreateDeliveryChannel(

);

// Stvara novu aplikaciju u instanci StockWatch a = new Application(nsi, "StockWatchApp"); a.BaseDirectoryPath = baseDirectoryPath; CreateEventClass( ); CreateSubscriptionClass( ); CreateNotificationClass( ); CreateHostedEventProvider( ); CreateGenerator( ); CreateDistributor( ); CreateVacuumSchedule( ); a.QuantumDuration = new TimeSpan(0, 0, 15); a.PerformanceQueryInterval = new TimeSpan(0, 0, 5); a.SubscriptionQuantumLimit = 1; a.ChronicleQuantumLimit = 1; a.VacuumRetentionAge = new TimeSpan(0, 0, 1); nsi.Applications.Add(a); Console.WriteLine("Added application."); nsi.Create(

);

Poglavlje 18: Notification Services | 421

nsi.RegisterLocal(serviceUserName, servicePassword); nsi.Enable( ); Console.WriteLine("Application enabled." + Environment.NewLine); CreateSubscriber( ); CreateSubscription( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); }

Objekt NotificationServices predstavlja Notification Services poslužitelja. Svojstvo Instance klase NotificationServices vraća objekt InstanceCollection koji sadrži kolekciju Notification Services instanci u obliku objekata Instance. Najmanje što morate učiniti jest definirati objekte DeliveryChannel i Application kako biste stvorili objekt Instance – u ovom primjeru to su učinile metode CreateDeliveryChannel() i Main(). Metoda RegisterLocal() klase Instance registrira Notification Services instancu na lokalnom računalu. Notification Services instancu možete registrirati i putem SQL Server Management Studija tako što ćete desnom tipkom miša pritisnuti instancu Notification Services i odabrati opciju Tasks ➝ Register s kontekstnog izbornika. Treći način registriranja Notification Services instance je s pomoću naredbe nscontrol register. Nakon prijave instance stvaraju se ili ažuriraju unosi u registru za instancu, stvaraju se brojači izvedbe, a može se stvoriti i Windows Service koja pokreće instancu. Metoda Enable() klase Instance uključuje sve komponente instance i aplikacije, uključuje kolekciju događaja, stvaranje i distribuciju obavijesti te upravljanje pretplatom. Instanca NotificationServices isključena je kada ju stvorite. NMO klase namijenjene upravljanju Notification Services instancama opisane su u tablici 18-1. Tablica 18-1. NMO klase za upravljanje Notification Services instancama Klasa

Opis

Instance

Predstavlja Notification Services instancu.

InstanceCollection

Predstavlja kolekciju instanci kao objekte Instance. Svojstvo Instance klase NotificationServices vraća Notification Services instance na poslužitelj.

Objekt Application predstavlja Notification Services aplikaciju. Najmanje što morate učiniti jest definirati objekte Generator i Distributor za objekt Application – u ovom primjeru to su učinile metode CreateGenerator() i CreateDistributor(). Prethodni primjer konfigurira objekt Application postavljanjem sljedećih svojstava: BaseDirectoryPath Zadaje putanju osnovne mape za ADF.

422 | Programiranje SQL Server 2005

QuantumDuration Zadaje učestalost kojom generator obrađuje posao. PerformanceQueryInterval Zadaje učestalost kojom aplikacija ažurira brojače izvedbe. SubscriptionQuantumLimit Zadaje koliko logički sat može kasniti za stvarnim satom bez ignoriranja pravila o pretplati. ChronicleQuantumLimit Zadaje koliko logički sat može kasniti za stvarnim satom bez ignoriranja pravila o kronici događaja. VacuumRetentionAge Zadaje minimalnu starost podataka o događajima i obavijestima u kojoj se oni smatraju suvišnima i smiju se ukloniti. NMO klase namijenjene upravljanju Notification Services aplikacijama opisane su u tablici 18-2. Tablica 18-2. NMO klase za upravljanje aplikacijama Klasa

Opis

Application

Predstavlja Notification Services aplikaciju.

ApplicationCollection

Predstavlja kolekciju Notification Services aplikacija kao objekte Application. Svojstvo Applications klase Instance vraća Notification Services aplikaciju ugošćenu u Notification Services instanci.

Stvaranje kanala isporuke Kanal za isporuku datoteke StockWatchFileDeliveryChannel i kanal za isporuku elektroničke pošte StockWatchEmailDeliveryChannel, stvoreni su metodom CreateDeliveryChannel() iz primjera 18-1. Slijedi kod: private static void CreateDeliveryChannel( ) { DeliveryChannelArgument dca; // Dodaje kanal za isporuku datoteke DeliveryChannel dcFile = new DeliveryChannel(nsi, "StockWatchFileDeliveryChannel"); dcFile.ProtocolName = "File"; dca = new DeliveryChannelArgument(dcFile, "FileName"); dca.Value = baseDirectoryPath + @"\Notifications\FileNotifications.txt"; dcFile.DeliveryChannelArguments.Add(dca); nsi.DeliveryChannels.Add(dcFile); Console.WriteLine("Added delivery channel: " + dcFile.Name); // Dodaje kanal za isporuku elektroničke pošte DeliveryChannel dcEmail =

Poglavlje 18: Notification Services | 423

new DeliveryChannel(nsi, "StockWatchEmailDeliveryChannel"); dcEmail.ProtocolName = "SMTP"; nsi.DeliveryChannels.Add(dcEmail); Console.WriteLine("Added delivery channel: " + dcEmail.Name); }

Prije njegova stvaranja, Notification Services instanci dodajte barem jedan kanal isporuke. Svojstvo ProtocolName objekta DeliveryChannel treba biti postavljeno na SMTP, File ili na ime prilagođenog protokola isporuke. NMO klase koje se koriste za upravljanje kanalima isporuke opisane su u tablici 18-3. Tablica 18-3. NMO klase za upravljanje kanalima isporuke Kanal isporuke

Opis

DeliveryChannel

Predstavlja kanal isporuke.

DeliveryChannelArgument

Predstavlja par ime-vrijednost koji zadaje postavke kanala isporuke i podatke o provjeri vjerodostojnosti za uslugu isporuke.

DeliveryChannelArgumentCollection

Predstavlja kolekciju argumenata kanala isporuke kao objekte DeliveryChannelArgument. Svojstvo DeliveryChannelArguments klase DeliveryChannel vraća argumente kanala isporuke za kanal isporuke.

DeliveryChannelCollection

Predstavlja kolekciju kanala isporuke kao objekte DeliveryChannel. Svojstvo DeliveryChannels klase Instance vraća kanale isporuke za Notification Services instancu.

Stvaranje klase događaja Klasa događaja StockWatchEvents stvorena je metodom CreateEventClass() u primjeru 18-1. Slijedi kod: private static void CreateEventClass( ) { EventClass ec = new EventClass(a, "StockWatchEvents"); EventField ef; ef = new EventField(ec, "Symbol"); ef.Type = "nvarchar(6)"; ec.EventFields.Add(ef); ef = new EventField(ec, "Price"); ef.Type = "float"; ec.EventFields.Add(ef); a.EventClasses.Add(ec); Console.WriteLine("Added event class: " + ec.Name); }

Klasa događaja predstavlja tip događaja koji koristi Notification Service aplikacija. Klasa događaja sadrži dva polja – polje Symbol tipa nvarchar (6) i polje Price tipa float.

424 | Programiranje SQL Server 2005

NMO klase za upravljanje klasama događaja, poljima i kronikama opisane su u tablici 18-4. Tablica 18-4. NMO klase za upravljanje događajima Klasa

Opis

EventChronicle

Kronika događaja.

EventChronicleCollection

Predstavlja kolekciju kronika događaja kao objekte EventChronicle. Svojstvo EventChronicles klase EventClass vraća kronike događaja za klasu događaja.

EventChronicleRule

Upit generatora o održavanju kronike događaja.

EventClass

Klasa događaja.

EventClassCollection

Predstavlja kolekciju klasa događaja kao objekte EventClass. Svojstvo EventClasses klase Application vraća klase događaja za Notification Services aplikaciju.

EventField

Polje u shemi klase događaja.

EventFieldCollection

Predstavlja kolekciju polja u shemi klase događaja kao objekte EventField. Svojstvo EventFields klase EventClass vraća polja događaja za klasu događaja.

Stvaranje klase pretplate i pravila događaja pretplate Klasa pretplate s jednim pravilom događaja pretplate stvorena je metodom CreateSubscription ClassMethod() u primjeru 18-1. Slijedi kod: private static void CreateSubscriptionClass( ) { SubscriptionClass sc = new SubscriptionClass(a, "StockWatchSubscriptions"); SubscriptionField sf; sf = new SubscriptionField(sc, sf.Type = "nvarchar(255)"; sc.SubscriptionFields.Add(sf); sf = new SubscriptionField(sc, sf.Type = "nvarchar(10)"; sc.SubscriptionFields.Add(sf); sf = new SubscriptionField(sc, sf.Type = "nvarchar(6)"; sc.SubscriptionFields.Add(sf); sf = new SubscriptionField(sc, sf.Type = "float"; sc.SubscriptionFields.Add(sf);

"DeviceName");

"SubscriberLocale");

"Symbol");

"Price");

SubscriptionEventRule ser = new SubscriptionEventRule(sc, "StockWatchSubscriptionsEventRule"); ser.Action = @"INSERT INTO StockWatchNotifications (" + "SubscriberId, DeviceName, SubscriberLocale, Symbol, Price) " + "SELECT s.SubscriberId, s.DeviceName, s.SubscriberLocale, " +

Poglavlje 18: Notification Services | 425

"e.Symbol, e.Price " + "FROM StockWatchEvents e, StockWatchSubscriptions s " + "WHERE e.Symbol = s.Symbol"; ser.EventClassName = "StockWatchEvents"; sc.SubscriptionEventRules.Add(ser); a.SubscriptionClasses.Add(sc); Console.WriteLine("Added subscription class: " + sc.Name); }

Objekt SubscriptionClass zadaje tip pretplate u Notification Services aplikaciji. Objekti SubscriptionField dodani objektu Subscription su polja u shemi klase pretplate. Objekt SubscriptionChronicle omogućuje da pohranite podatke o pretplati izvan tablica koje koristi klasa pretplate – u ovom primjeru ne koristi se kronika pretplate. NMO klase za upravljanje kronikama, klasama i poljima pretplate opisane su u tablici 18-5. Tablica 18-5. NMO klase za upravljanje kronikama, klasama i poljima pretplate Klasa

Opis

SubscriptionChronicle

Kronika pretplate.

SubscriptionChronicleCollection

Predstavlja kolekciju kronika pretplate kao objekte SubscriptionChronicle. Svojstvo SubscriptionChronicles klase SubscriptionClass vraća kronike pretplate za klasu pretplate.

SubscriptionClass

Klasa pretplate.

SubscriptionClassCollection

Predstavlja kolekciju klasa pretplate kao objekte SubscriptionClass. Svojstvo SubscriptionClasses klase Application vraća klase pretplate za Notification Services aplikaciju.

SubscriptionField

Predstavlja polje u shemi klase pretplate.

SubscriptionFieldCollection

Predstavlja kolekciju polja kao objekte SubscriptionField. Svojstvo SubscriptionFields klase SubscriptionClass vraća polja za shemu klase pretplate.

Objekt SubscriptionEventRule predstavlja pravilo koje T-SQL upitima stvara obavijesti po dolasku niza događaja. Svojstvo Action predstavlja T-SQL upit za objekt SubscriptionEventRule. U ovom primjeru, obavijesti se izdaju kada simbol dionice određenog događaja odgovora simbolu dionice koji je naveden u pretplati. NMO klase za upravljanje različitim tipovima pravila pretplate opisane su u tablici 18-6.

426 | Programiranje SQL Server 2005

Tablica 18-6. NMO klase za upravljanje pravilima pretplate Klasa

Opis

SubscriptionConditionEventRule

Pravilo pretplate koje generator pokreće nad pretplatama koje koriste uvjete za stvaranje obavijesti.

SubscriptionConditionEventRuleCollection

Predstavlja kolekciju pravila događaja uvjeta pretplate kao objekte SubscriptionConditionEventRule. Svojstvo SubscriptionConditionEventRules klase SubscriptionClass vraća pravila događaja uvjeta pretplate za klasu preplate.

SubscriptionConditionScheduledRule

Predstavlja pravilo pretplate koje generator pokreće nad planiranim pretplatama koje uvjetima stvaraju obavijesti.

SubscriptionConditionScheduledRuleCollection

Predstavlja kolekciju planiranih pravila uvjeta pretplate kao objekte SubscriptionConditionScheduledRule. Svojstvo SubscriptionConditionScheduledRules klase SubscriptionClass vraća planirana pravila uvjeta pretplate za klasu pretplate.

SubscriptionEventRule

Predstavlja pravilo događaja koje sadrži jednostavne (neuvjetovane) akcije.

SubscriptionEventRuleCollection

Predstavlja kolekciju pravila događaja pretplate kao objekte SubscriptionEventRule. Svojstvo SubscriptinEventRules klase SubscriptionClass vraća pravila događaja pretplate za klasu pretplate.

SubscriptionScheduledRule

Predstavlja planirano pravilo koje sadrži akcije koje ne koriste uvjete za stvaranje obavijesti.

SubscriptionScheduledRuleCollection

Predstavlja kolekciju planiranih pravila kao objekte SubscriptionScheduledRule. Svojstvo SubscriptionScheduledRules klase SubscriptionClass vraća planirana pravila za klasu pretplate.

Stvaranje klase obavijesti, formatera sadržaja i protokola klase obavijesti Klasa obavijesti StockWatchNotifications, formater sadržaja XsltFormatter i dva protokola klase obavijesti, File i SMTP, stvoreni su metodom CreateNotificationClass() u primjeru 18-1. Slijedi kod: private static void CreateNotificationClass( ) { NotificationClass nc = new NotificationClass(a, "StockWatchNotifications"); NotificationField nf; nf = new NotificationField(nc, "Symbol");

Poglavlje 18: Notification Services | 427

nf.Type = "nvarchar(6)"; nc.NotificationFields.Add(nf); nf = new NotificationField(nc, "Price"); nf.Type = "float"; nc.NotificationFields.Add(nf); ContentFormatter cf = new ContentFormatter(nc, "XsltFormatter"); ContentFormatterArgument cfa; cfa = new ContentFormatterArgument(cf, "XsltBaseDirectoryPath"); cfa.Value = a.BaseDirectoryPath + @"\AppDefinition"; cf.ContentFormatterArguments.Add(cfa); cfa = new ContentFormatterArgument(cf, "XsltFileName"); cfa.Value = "StockWatch.xslt"; cf.ContentFormatterArguments.Add(cfa); nc.ContentFormatter = cf; nc.DigestDelivery = true; ProtocolField pf; // Dodaje protokol klase za obavijest putem datoteke NotificationClassProtocol ncpFile = new NotificationClassProtocol(nc, "File"); pf = new ProtocolField(ncpFile, "Symbol"); pf.FieldReference = "Symbol"; ncpFile.ProtocolFields.Add(pf); pf = new ProtocolField(ncpFile, "Price"); pf.FieldReference = "Price"; ncpFile.ProtocolFields.Add(pf); nc.NotificationClassProtocols.Add(ncpFile); // Dodaje protokol klase za obavijest putem elektroničke pošte NotificationClassProtocol ncpEmail = new NotificationClassProtocol(nc, "SMTP"); pf = new ProtocolField(ncpEmail, "Subject"); pf.SqlExpression = "'Stock watch: ' + CONVERT(nvarchar(30), GETDATE( ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "BodyFormat"); pf.SqlExpression = "'html'"; ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "From"); pf.SqlExpression = "'[email protected]'"; ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "Priority"); pf.SqlExpression = "'Normal'"; ncpEmail.ProtocolFields.Add(pf); pf = new ProtocolField(ncpEmail, "To"); pf.SqlExpression = "DeviceAddress";

428 | Programiranje SQL Server 2005

))";

ncpEmail.ProtocolFields.Add(pf); nc.NotificationClassProtocols.Add(ncpEmail); nc.ExpirationAge = new TimeSpan(1, 0, 0); a.NotificationClasses.Add(nc); Console.WriteLine("Added notification class: " + nc.Name); }

Objekt NotificationClass predstavlja tip obavijesti koji podržava Notification Services aplikacija. Objekt NotificationField predstavlja polje u shemi klase obavijesti. Klasa obavijesti u ovom primjeru ima dva polja – polje Symbol tipa nvarchar (6) i polje Price tipa float. NMO klase za upravljanje klasama obavijesti i poljima opisane su u tablici 18-7. Tablica 18-7. NMO klase za upravljanje klasama obavijesti i poljima Klasa

Opis

NotificationClass

Klasa obavijesti.

NotificationClassCollection

Predstavlja kolekciju klasa obavijesti kao objekte NotificationClass. Svojstvo NotificationClasses klase Application vraća klase obavijesti za Notification Services aplikaciju.

NotificationComputedField

Izračunato polje u shemi klase obavijesti.

NotificationComputedFieldCollection

Predstavlja kolekciju izračunatih polja kao objekte NotificationComputedField. Svojstvo NotificationComputedFields klase NotificationClass vraća izračunata polja za klasu obavijesti.

NotificationField

Neizračunato polje u shemi klase obavijesti.

NotificationFieldCollection

Predstavlja kolekciju polja kao objekte NotificationField. Svojstvo NotificationFields klase NotificationClass vraća polja za klasu obavijesti.

Formater sadržaja oblikuje obavijesti za klasu obavijesti. Svaka klasa obavijesti sadrži jedan formater sadržaja koji može izvoditi različita oblikovanja, ovisno o vrijednostima polja u obavijesti. Formater sadržaja koristi tri argumenta: XsltBaseDirectoryPath Korijenska mapa za sve XSLT datoteke. XsltFileName Ime XSLT datoteke za pretvorbu neobrađenih podataka u obavijestima u oblikovane podatke za isporuku obavijesti.

Poglavlje 18: Notification Services | 429

DisableEscaping Opcionalni logički argument koji ukazuje da podaci o događaju sadrže ili HTML ili XML podatke koji sprječavaju daljnju pretvorbu. Podrazumijevana vrijednost je false. NMO klase za upravljanje formaterima sadržaja opisane su u tablici 18-8. Tablica 18-8. NMO klase za upravljanje formaterima sadržaja Klasa

Opis

ContentFormatter

Formater sadržaja. Svojstvo ContentFormatter klase NotificationClass vraća formater sadržaja za klasu obavijesti.

ContentFormatterArgument

Par ime-vrijednost za argument kojim se pokreće formater sadržaja.

ContentFormatterArgumentCollection

Predstavlja kolekciju argumenata za iniciranje kao objekte ContentFormatterArgument. Svojstvo ContentFormatterArguments klase ContentFormatter vraća argumente za iniciranje za formater sadržaja.

Protokol klase obavijesti predstavlja protokol isporuke za klasu obavijesti. Objekt ProtocolField predstavlja polje zaglavlja protokola koje koristi neki protokol isporuke. Zaglavlja polja protokola različita su za obavijesti putem datoteka i obavijesti putem elektroničke pošte – proučite kod i obavijesti putem datoteke i elektroničke pošte prikazane na slikama 18-7 i 18-8 kako biste vidjeli rezultat postavljanja polja protokola. Vrijednost objekta ProtocolField postavlja se svojstvom SqlExpression ili svojstvom FieldReference, tako da sami možete odabrati hoćete li vrijednost polja protokola odrediti T-SQL izrazom ili poljem obavijesti. NMO klase za upravljanje protokolima opisane su u tablici 18-9. Tablica 18-9. NMO klase za upravljanje protokolima Klasa

Opis

NotificationClassProtocol

Predstavlja protokol isporuke za klasu obavijesti.

NotificationClassProtocolCollection

Predstavlja kolekciju protokola klase obavijesti kao objekte NotificationClassProtocol. Svojstvo NotificationClassProtocols klase NotificationClass vraća klase isporuke za klasu obavijesti.

ProtocolDefinition

Predstavlja prilagođeni protokol isporuke.

ProtocolDefinitionCollection

Predstavlja kolekciju prilagođenih protokola isporuke kao objekte ProtocolDefinition. Svojstvo ProtocolDefinitions klase Instance vraća prilagođene protokole isporuke za Notification Services instancu.

ProtocolField

Predstavlja polje zaglavlja protokola.

430 | Programiranje SQL Server 2005

Tablica 18-9. NMO klase za upravljanje protokolima (nastavak) Klasa

Opis

ProtocolFieldCollection

Predstavlja kolekciju polja zaglavlja protokola kao objekte ProtocolField. Svojstvo ProtocolFields klase NotificationClassProtocol vraća polja zaglavlja protokola za protokol isporuke.

ProtocolRetrySchedule

Predstavlja interval u rasporedu ponovnih pokušaja.

ProtocolRetryScheduleCollection

Predstavlja kolekciju intervala ponovnih pokušaja kao objekte ProtocolRetrySchedule. Svojstvo ProtocolRetrySchedules klase NotificationClassProtocol vraća rasporede ponovnih pokušaja za obavijesti poslane protokolom isporuke.

Stvaranje pružatelja događaja Ugošćeni pružatelj događaja stvoren je metodom CreateHostedEventProvider() u primjeru 18-1. Slijedi kod: private static void CreateHostedEventProvider( ) { HostedEventProvider hep = new HostedEventProvider(a, "StockWatchHEP"); hep.ClassName = "FileSystemWatcherProvider"; hep.SystemName = nsServer; HostedEventProviderArgument hepa; hepa = new HostedEventProviderArgument(hep, "WatchDirectory"); hepa.Value = baseDirectoryPath + @"\Events"; hep.HostedEventProviderArguments.Add(hepa); hepa = new HostedEventProviderArgument(hep, "SchemaFile"); hepa.Value = baseDirectoryPath + @"\AppDefinition\EventsSchema.xsd"; hep.HostedEventProviderArguments.Add(hepa); hepa = new HostedEventProviderArgument(hep, "EventClassName"); hepa.Value = "StockWatchEvents"; hep.HostedEventProviderArguments.Add(hepa); a.HostedEventProviders.Add(hep); }

Pružatelji događaja prikupljaju podatke o događaju i šalju ih klasi događaja. Ugošćene pružatelje događaja pokreće Notification Services stroj. Za razliku od njih, neugošćeni pružatelji događaja pokreću se izvan stroja i nisu povezani s Notification Services. Svojstvo ClassName klase HostedEventProvider određuje klasu koja implementira pružatelja događaja. Notification Services ima tri ugrađena pružatelja događaja o kojima je bilo riječi nešto ranije u ovom poglavlju. Možete upotrijebiti i prilagođeni pružatelj događaja. U ovom primjeru upotrijebljen je File System Watcher pružatelj događaja (čiji je ClassName FileSystemWatcherProvider), koji sakuplja događaje iz klase događaja

Poglavlje 18: Notification Services | 431

StockWatchEvents smještene u datoteci iz mape C:\PSS2005\NotificationServices\

Events. Datoteka događaja mora biti u skladu sa shemom definiranom u datoteci C:\ PSS2005\NotificationServices\AppDefinition\EventsSchema.xsd. NMO klase za upravljanje ugošćenim i neugošćenim pružateljima događaja opisane su u tablici 18-10. Tablica 18-10. NMO klase za upravljanje ugošćenim i neugošćenim pružateljima događaja Klasa

Opis

HostedEventProvider

Ugošćeni pružatelj događaja za Notification Services aplikaciju.

HostedEventProviderArgument

Par ime-vrijednost koji zadaje konfiguraciju ugošćenog pružatelja događaja.

HostedEventProviderArgumentCollection

Predstavlja kolekciju argumenata ugošćenih pružatelja događaja kao objekte HostedEventProviderArgument. Svojstvo HostedEventProviderArguments klase HostedEventProvider vraća argumente ugošćenog pružatelja događaja za ugošćenog pružatelja događaja.

HostedEventProviderCollection

Predstavlja kolekciju ugošćenih pružatelja događaja kao objekte HostedEventProvider. Svojstvo HostedEventProviders klase Application vraća ugošćene pružatelje događaja za Notification Services aplikaciju.

NonHostedEventProvider

Predstavlja neugošćenog pružatelja događaja.

NonHostedEventProviderCollection

Predstavlja kolekciju neugošćenih pružatelja događaja kao objekte NonHostedEventProvider. Svojstvo NonHostedEventProviders klase Application vraća neugošćene pružatelje događaja za Notification Services aplikaciju.

Stvaranje generatora Generator StockWatchGenerator stvoren je metodom CreateGenerator() u primjeru 181. Slijedi kod: private static void CreateGenerator( ) { // Stvara novi generator za aplikaciju Generator g = new Generator(a, "StockWatchGenerator"); g.SystemName = nsServer; a.Generator = g; Console.WriteLine("Created generator: " + g.Name); }

Objekt Generator predstavlja generator za Notification Services aplikaciju. Svojstvo Generator klase Application vraća generator za aplikaciju. Svojstvo Generator objekta Application morate zadati prije dodavanja aplikacije Notification Services instanci. Aplikacija ima samo jedan generator koji obrađuje pravila za aplikaciju.

432 | Programiranje SQL Server 2005

Potrebno je zadati svojstvo SystemName klase Generator, no ono ne može biti localhost, ., IP adresa ili niz koji sadrži obrnutu kosu crtu (\).

Stvaranje distributera Distributer StockWatchDistributor stvoren je metodom CreateDistributor() u primjeru 18-1. Slijedi kod: private static void CreateDistributor( ) { Distributor d = new Distributor(a, "StockWatchDistributor"); d.SystemName = nsServer; d.QuantumDuration = new TimeSpan(0, 0, 15); a.Distributors.Add(d); Console.WriteLine("Added distributor: " + d.Name); }

Objekt Distributor predstavlja distributer za Notification Services aplikaciju. Svaka aplikacija treba imati jedan distributer koji će nadzirati obradu i distribuciju obavijesti. Ako aplikacija sadrži više distributera, oni se trebaju instalirati na različitim poslužiteljima. Svojstvo QuantumDuration određuje interval prozivanja radne jedinice distributera, koji u ovom primjeru iznosi 15 sekundi. NMO klase za upravljanje distributerima opisane su u tablici 18-11. Tablica 18-11. NMO klase za upravljanje distributerima Klasa

Opis

Distributor

Distributer za Notification Services aplikaciju.

DistributorCollection

Predstavlja kolekciju distributera kao objekte Distributor. Svojstvo Distributors klase Application vraća distributere za distribuciju obavijesti kanalu isporuke za Notification Service aplikaciju.

Stvaranje rasporeda čišćenja Raspored čišćenja StockWatchVacuumSchedule stvoren je metodom CreateVacuumSchedule() u primjeru 18-1. Slijedi kod: private static void CreateVacuumSchedule( ) { VacuumSchedule vs = new VacuumSchedule(a, "StockWatchVacuumSchedule"); vs.StartTime = new TimeSpan(0, 0, 0); a.VacuumSchedules.Add(vs); Console.WriteLine("Added vacuum schedule: " + vs.Name); }

Poglavlje 18: Notification Services | 433

Čišćenjem se svakodnevno uklanjanju stari podaci o događajima i obavijestima iz aplikacijske baze podataka. Svojstvo StartTime po koordiniranom svjetskom vremenu (UTC) zadaje početak postupka uklanjanja podataka. Iako je opcija za zadavanje rasporeda čišćenja opcionalna, stari se podaci neće ukloniti iz baze podataka ako prethodno nije zadan raspored čišćenja. NMO klase za upravljanje rasporedom čišćenja opisane su u tablici 18-12. Tablica 18-12. NMO klase za upravljanje rasporedima čišćenja Klasa

Opis

VacuumSchedule

Raspored uklanjanja podataka

VacuumScheduleCollection

Predstavlja kolekciju rasporeda uklanjanja podataka kao objekte VacuumSchedule. Svojstvo VacuumSchedules klase Application vraća rasporede uklanjanja podataka za aplikaciju.

Stvaranje pretplatnika i pretplatničkog uređaja Dva pretplatnika, svaki sa svojim pretplatničkim uređajem, stvoreni su metodom CreateSubscriber() u primjeru 18-1. Slijedi kod: private static void CreateSubscriber( ) { ns.NSInstance swnsi = new ns.NSInstance("StockWatch"); ns.Subscriber s; ns.SubscriberDevice sd; // Stvara pretplatnika s = new ns.Subscriber(swnsi); s.SubscriberId = @"KristinHamilton"; s.Add( ); Console.WriteLine("Added subscriber: " + s.SubscriberId); // Stvara uređaj za pretplatu datotekom sd = new ns.SubscriberDevice( ); sd.Initialize(swnsi); sd.DeviceName = "StockWatchSubscriberDevice"; sd.SubscriberId = "KristinHamilton"; sd.DeviceTypeName = "File"; sd.DeviceAddress = "[email protected]"; sd.DeliveryChannelName = "StockWatchFileDeliveryChannel"; sd.Add( ); Console.WriteLine("Added subscriber file device."); // Stvara pretplatnika s = new ns.Subscriber(swnsi); s.SubscriberId = @"TonyHamilton"; s.Add( ); Console.WriteLine("Added subscriber: " + s.SubscriberId);

434 | Programiranje SQL Server 2005

// Stvara uređaj za pretplatu elektroničkom poštom sd = new ns.SubscriberDevice( ); sd.Initialize(swnsi); sd.DeviceName = "StockWatchSubscriberDevice"; sd.SubscriberId = "TonyHamilton"; sd.DeviceTypeName = "Email"; sd.DeviceAddress = "[email protected]"; sd.DeliveryChannelName = "StockWatchEmailDeliveryChannel"; sd.Add( ); Console.WriteLine("Added subscriber email device."); }

Klasa NSInstance predstavlja Notification Services instancu prijavljenu u Windows registru. Klasa Subscriber predstavlja pretplatnika u Notification Services instanci. Klasa SubscriberEnumeration predstavlja kolekciju pretplatnika kao objekte Subscriber u Notification Services instanci. Klasa SubscriberEnumeration koristi se za vraćanje objekta Subscriber iz kolekcije pretplatnika u Notification Services instancu. Metoda Delete() uklanja pretplatnika, metoda Add() dodaje pretplatnika, a metoda Update() ažurira podatke o postojećem pretplatniku. Sljedeći kod briše pretplatnika AnySubscriber s Notification Services instance nazvane HelloWorld: NSInstance nins = new NSInstance("HelloWorld"); SubscriberEnumeration se = new SubscriberEnumeration(nins); se["AnySubscriber"].Delete( );

Klasa SubscriberDevice predstavlja uređaj koji može primiti obavijesti. Svakom pretplatniku dodaje se po jedan pretplatnički uređaj. Svaki pretplatnički uređaj sadrži sljedeća svojstva: DeviceName Ime pretplatničkog uređaja. SubscriberId Identifikator pretplatnika povezanog s pretplatničkim uređajem. DeviceTypeName Ime tipa pretplatničkog uređaja. DeviceAddress Kontakt adresa uređaja. DeliveryChannelName Ime kanala isporuke kojeg koristi uređaj. U ovom primjeru kanal isporuke StockWatchFileDeliveryChannel dodijeljen je jednom pretplatniku, a StockWatchEmailDeliveryChannel drugom. Ovi su kanali isporuke stvoreni u kodu opisanom nešto ranije u ovom poglavlju.

Poglavlje 18: Notification Services | 435

Klasa SubscriptionDeviceEnumeration vraća objekt SubscriberDevice iz kolekcije uređaja za pretplatnika. Metoda Delete() uklanja uređaj, metoda Add() dodaje uređaj, a metoda Update() ažurira podatke o postojećem uređaju.

Stvaranje pretplate Dvije pretplate stvorene su metodom CreateSubscription() u primjeru 18-1. Slijedi kod: private static void CreateSubscription( ) { ns.NSInstance swnsi = new ns.NSInstance("StockWatch"); ns.NSApplication a = new ns.NSApplication(swnsi, "StockWatchApp"); ns.Subscription s; // Dodaje pretplate s = new ns.Subscription( ); s.Initialize(a, "StockWatchSubscriptions"); s.SetFieldValue("DeviceName", "StockWatchSubscriberDevice"); s.SetFieldValue("SubscriberLocale", "en-us"); s.SubscriberId = "KristinHamilton"; s.SetFieldValue("Symbol", "ABC"); s.SetFieldValue("Price", "0.00"); s.Add( ); Console.WriteLine("Added subscription: " + s.SubscriberId); s = new ns.Subscription( ); s.Initialize(a, "StockWatchSubscriptions"); s.SetFieldValue("DeviceName", "StockWatchSubscriberDevice"); s.SetFieldValue("SubscriberLocale", "en-us"); s.SubscriberId = "TonyHamilton"; s.SetFieldValue("Symbol", "DEF"); s.SetFieldValue("Price", "0.00"); s.Add( ); Console.WriteLine("Added subscription: " + s.SubscriberId); }

Klasa NSApplication predstavlja Notification Services aplikaciju. Klasa Subscription predstavlja pretplatu u Notification Services aplikaciji. Obje pretplate koriste pretplatnički uređaj StockWatchSubscriberDevice čije je stvaranje opisano ranije u ovom poglavlju. Pretplata za KristinHamilton je pretplata za događaje simbola dionice DEF. Rezultate možete vidjeti na obavijestima prikazanim na slikama 18-7 i 18-8. Klasa SubscriptionEnumeration predstavlja kolekciju pretplata kao objekte Subscription u Notification Services aplikaciji. S pomoću klase SubscriptionEnumeration možete iterirati kroz kolekciju pretplata za aplikaciju i upravljati pojedinim preplatama u kolekciji. Te dvije klase implementirane su u imenskom prostoru Microsoft. SqlServer.NotificationServices.

436 | Programiranje SQL Server 2005

Enumeriranje baze podataka Notification Services instance Ovaj primjer enumerira grupu datoteka, datoteke iz baze podataka i datoteke dnevnika za Notification Services instancu StockWatch koju smo stvorili u primjeru 18-1: using System; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Nmo; class Program { static void Main(string[] args) { Server server = new Server("(local)"); NotificationServices ns = server.NotificationServices; Instance ins = ns.Instances["StockWatch"]; InstanceDatabaseOptions ido = ins.InstanceDatabaseOptions; Console.WriteLine("INSTANCE DATABASE OPTIONS:"); Console.WriteLine(" Name: " + ido.Name); Console.WriteLine(" DefaultFileGroup: " + ido.DefaultFileGroup); Console.WriteLine(Environment.NewLine + "FILE GROUPS:"); foreach (InstanceDatabaseFileGroup idfg in ido.InstanceDatabaseFileGroups) { Console.WriteLine(" Name: " + idfg.Name); Console.WriteLine(Environment.NewLine + "DATABASE FILES"); foreach (InstanceDatabaseFile idf in idfg.InstanceDatabaseFiles) Console.WriteLine(" Name: " + idf.Name); } Console.WriteLine(Environment.NewLine + "LOG FILES:"); foreach (InstanceDatabaseLogFile idlf in ido.InstanceDatabaseLogFiles) Console.WriteLine(" Name: " + idlf.Name); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 18-9. Svaka Notification Services instanca ima jednu bazu podataka koja može sadržavati jednu ili više grupa datoteka. Ako definirate grupe datoteka, jednu grupu morate nazvati PRIMARY. Upotrijebite SQL Server Management Studio ako trebate promijeniti bazu podataka Notification Services instance nakon stvaranja instance.

Poglavlje 18: Notification Services | 437

Slika 18-9. Rezultati primjera enumeracije baze podataka Notification Services instance

NMO klase za upravljanje instancama baze podataka, grupama datoteka, datotekama i datotekama dnevnika opisane su u tablici 18-13. Tablica 18-13. NMO klase za upravljanje instancama baze podataka Instanca

Opis

InstanceDatabaseFile

Predstavlja instancu datoteke iz baze podataka.

InstanceDatabaseFileCollection

Predstavlja kolekciju instanci baza podataka kao objekte InstanceDatabase. Svojstvo InstanceDatabaseFiles klase InstanceDatabaseFileGroup vraća instancu iz grupe datoteka za bazu podataka.

InstanceDatabaseFileGroup

Predstavlja grupu datoteka iz aplikacijske baze podataka.

InstanceDatabaseFileGroupCollection

Predstavlja kolekciju grupa datoteka iz baze podataka kao objekte InstanceDatabaseFileGroup. Svojstvo InstanceDatabaseFileGroups klase InstanceDatabaseOptions vraća grupe datoteka iz baze podataka u aplikaciji.

InstanceDatabaseLogFile

Predstavlja datoteku dnevnika baze podataka.

InstanceDatabaseLogFileCollection

Predstavlja kolekciju datoteka dnevnika baze podataka kao objekte InstanceDatabaseLogFile. Svojstvo InstanceDatabaseLogFiles klase InstanceDatabaseOptions vraća datoteke dnevnika baze podataka u aplikaciji.

InstanceDatabaseOptions

Predstavlja opcije baze podataka za bazu podataka. Svojstvo InstanceDatabaseOptions klase Instance vraća svojstva baze podataka za instancu.

Enumeriranje baze podataka Notification Services aplikacije Ovaj primjer enumerira grupu datoteka, datoteke baze podataka i datoteke dnevnika za Notification Services aplikaciju HelloWorldApp koju smo stvorili u primjeru 18-1: using System; using Microsoft.SqlServer.Management.Smo; using Microsoft.SqlServer.Management.Nmo; class Program {

438 | Programiranje SQL Server 2005

static void Main(string[] args) { Server server = new Server("(local)"); NotificationServices ns = server.NotificationServices; Instance ins = ns.Instances["StockWatch"]; Application a = ins.Applications["StockWatchApp"]; ApplicationDatabaseOptions ado = a.ApplicationDatabaseOptions; Console.WriteLine("APPLICATION DATABASE OPTIONS:"); Console.WriteLine(" Name: " + ado.Name); Console.WriteLine(" DefaultFileGroup: " + ado.DefaultFileGroup); Console.WriteLine(Environment.NewLine + "FILE GROUPS:"); foreach (ApplicationDatabaseFileGroup adfg in ado.ApplicationDatabaseFileGroups) { Console.WriteLine(" Name: " + adfg.Name); Console.WriteLine(Environment.NewLine + "DATABASE FILES"); foreach (ApplicationDatabaseFile adf in adfg.ApplicationDatabaseFiles) Console.WriteLine(" Name: " + adf.Name); } Console.WriteLine(Environment.NewLine + "LOG FILES:"); foreach (ApplicationDatabaseLogFile adlf in ado.ApplicationDatabaseLogFiles) Console.WriteLine(" Name: " + adlf.Name); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 18-10.

Slika 18-10. Rezultati primjera enumeracije baze podataka Notification Services aplikacije

Svaka Notification Services aplikacija ima jednu bazu podataka koja može sadržavati jednu ili više grupa datoteka. Ako definirate grupe datoteka, jednu grupu morate nazvati PRIMARY. Upotrijebite SQL Server Management Studio ako trebate promijeniti bazu podataka Notification Services aplikacije nakon stvaranja instance.

Poglavlje 18: Notification Services | 439

NMO klase za upravljanje aplikacijskom bazom podataka, grupama datoteka, datotekama i datotekama dnevnika opisane su u tablici 18-14. Tablica 18-14. NMO klase za upravljanje aplikacijskim bazama podataka Klasa

Opis

ApplicationDatabaseFile

Datoteka aplikacijske baze podataka.

ApplicationDatabaseFileCollection

Predstavlja kolekciju aplikacijskih baza podataka kao objekte ApplicationDatabaseFile. Svojstvo ApplicationDatabaseFiles klase ApplicationDatabaseFileGroup vraća aplikacijske baze podataka u grupu datoteka aplikacijske baze podataka.

ApplicationDatabaseFileGroup ApplicationDatabaseFileGroupCollection

Predstavlja grupa datoteka iz aplikacijske baze podataka. Predstavlja kolekciju grupa datoteka iz aplikacijske baze podataka kao objekte

ApplicationDatabaseFileGroup. Svojstvo ApplicationDatabaseFileGroups klase ApplicationDatabaseOptions vraća grupe

datoteka iz aplikacijske baze podataka u aplikaciji.

ApplicatinDatabaseLogFile

Predstavlja datoteku dnevnika aplikacijske baze podataka.

ApplicatinDatabaseLogFileCollection

Predstavlja kolekciju datoteka dnevnika aplikacijske baze podataka kao objekte ApplicationDatabaseLogFile. Svojstvo ApplicationDatabaseLogFiles klase ApplicationDatabaseOptions vraća datoteke dnevnika aplikacijske baze podataka u

aplikaciji.

ApplicationDatabaseOptions

Predstavlja opcije baze podataka za aplikacijsku bazu podataka. Svojstvo ApplicationDatabaseOptions klase Application vraća svojstva baze podataka za aplikaciju.

440 | Programiranje SQL Server 2005

POGLAVLJE 19

Replikacija

Replikacija (engl. replication) je postupak kopiranja i distribuiranja podataka i objekata iz jedne baze podataka u drugu koji sadrži mehanizam za sinkronizaciju podataka. Podaci se mogu replicirati s jednog poslužitelja na drugi ili s poslužitelja na klijenta. Prije samog programiranja replikacije, potrebno je upoznati se s nekoliko ključnih pojmova: Izdavač SQL Server instanca koja svoje podatke čini dostupnima kroz replikaciju, uočava promjene u podacima i sadrži informacije o publikacijama i člancima. Distributer SQL Server instanca koja pohranjuje metapodatke o replikaciji za jednog ili više izdavača. Svaki distributer ima bazu podataka distribucije u kojoj su pohranjene transakcije, metapodaci, te podaci o prošlim aktivnostima. Kada jedna SQL Server instanca vrši funkciju i izdavača i distributera, distributer se zove lokalni distributer (engl. local distributor). Kada su izdavač i distributer smješteni na različitim instancama SQL Servera, distributer se zove udaljeni distributer (engl. remote distributor). Pretplatnik SQL Server instanca koji prima replicirane podatke. Publikacija Kolekcija s jednim ili više članaka. Publikacija može biti gurnuta do pretplatnika ili ju on može izvući. Članak Objekt baze podataka koji je uključen u publikaciju. Pretplata Zahtjev za publikacijom kojim je zadano mjesto i vrijeme primitka publikacije.

441

SQL Server 2005 pruža tri vrste replikacije: Snapshot Distribuira podatke kakvi jesu u određenom trenutku. Snimka stanja stvara se i šalje pretplatnicima prilikom sinkronizacije. Izdani podaci se ne ažuriraju. Transactional Nastale promjene u shemi i podacima odmah se šalju pretplatnicima. Promjene u podacima pridodaju se podacima o pretplatniku istim redoslijedom i unutar istih transakcijskih granica u kojima su se javile na izdavaču. Time se jamči dosljednost transakcije u svakoj publikaciji. Transakcijska replikacija najčešće započinje snimkom stanja sheme i podataka i koristi se u scenarijima replikacije između dva poslužitelja. Merge Promjene u shemi i podacima prate se okidačima. Podaci su sinkronizirani kada je pretplatnik povezan s izdavačem. Dodaju se sve promjene nastale nakon zadnje sinkronizacije. Replikacija udruživanjem podataka najčešće započinje snimkom stanja sheme i podataka. Obično se koristi prilikom replikacije između poslužitelja i klijenta. Replikaciju možete implementirati i njome možete upravljati putem SQL Server Management Studija, Windows Synchronization Managera ili programski, putem API sučelja za replikaciju. U preostalom dijelu poglavlja bavit ćemo se trećim načinom, programskim implementiranjem replikacije i programskim upravljanjem replikacijom. Za dodatne informacije o druge dvije metode pogledajte Microsoft SQL Server Books Online. Za izvršavanje zadataka vezanih uz replikaciju, potreban je skup programa koji se zovu agenti. Agenti su opisani u izdvojenom odlomku „Agenti replikacije“. Replikaciju možete implementirati ako poduzmete sljedeće korake: 1. Konfigurirajte izdavača i distributera. 2. Definirajte publikaciju – objekte iz baze podataka, tip replikacije i filtriranje – i tip replikacije. 3. Zadajte lokaciju za pohranu datoteka sa snimkama stanja i početak inicijalne sinkronizacije. 4. Stvorite pretplate. 5. Sinkronizirajte podatke, uključujući i inicijalnu sinkronizaciju sa snimkom stanja.

Programiranje replikacije SQL Server Replication Management Objects (RMO) je kolekcija imenskih prostora koja čini dio programa SQL Server 2005 i služi za programiranje svih aspekata SQL Server 2005 aplikacije. RMO zamjena je za funkcionalnost replikacije kolekcije SQL-DMO.

442 | Programiranje SQL Server 2005

Agenti replikacije Za izvršavanje zadataka vezanih uz replikaciju potreban je skup programa zvanih agenti. Postoje različiti agenti: Replication Distribution Agent Pridodaje inicijalnu snimku stanja pretplatniku i seli transakcije iz baze podataka distribucije do pretplatnika. Za pretplate guranjem pokreće ga distributer, a za pretplate izvlačenjem pretplatnik. Koristi se za replikaciju snimkom stanja i transakcijsku replikaciju. Replication Log Reader Agent Seli transakcije označene za replikaciju iz dnevnika transakcije na izdavaču u bazu podataka distribucije. Koristi se za transakcijsku replikaciju. Replication Merge Agent Pridodaje inicijalnu snimku stanja pretplatniku, te ažurira i usklađuje pretplatnika i izdavača s novonastalim promjenama. Za pretplate guranjem pokreće ga distributer, a za pretplate izvlačenjem pretplatnik. Koristi se za replikaciju udruživanjem podataka. Replication Queue Reader Agent Prenosi promjene nastale u pretplatniku natrag do izdavača. Pokreće ga distributer. Koristi se za transakcijsku replikaciju s opcijom ažuriranja u redu. Replication Snapshot Agent Priprema datoteke sa snimkama stanja koje sadrže sheme i inicijalne podatke za izdane tablice, pohranjuje datoteke u mapu sa snimkama stanja i čuva podatke o sinkronizacijama u bazi podataka. Pokreće ga distributer. Koristi se za sve tipove replikacije.

RMO je kompatibilan s inačicama SQL Server 2000 i SQL Server 7.0, tako da replikacijama možete upravljati u okolišu koji sadrži elemente različitih inačica SQL Servera. Kroz sljedeće primjere upoznat ćete se s klasama za replikaciju i njihovom primjenom. U primjerima se koristi replikacija udruživanjem podataka koja je vrlo slična transakcijskoj replikaciji. Za prevođenje i pokretanje sljedećih primjera potrebne su vam reference na sljedeće sklopove: • Microsoft.SqlServer.ConnectionInfo • Microsoft.SqlServer.Replication.NET Programming Interface Uz određene primjere navedene su dodatne reference na sklopove koje taj primjer zahtijeva. Objekt ReplicationServer je najviše pozicionirana klasa unutar hijerarhije RMO klasa. Predstavlja instancu SQL Servera uključenu u replikaciju. Poslužitelj može preuzeti ulogu distributera, izdavača, pretplatnika ili kombinaciju navedenih uloga.

Poglavlje 19: Replikacija | 443

Preduvjet Većina primjera u ovom poglavlju nastavlja se jedan na drugi. Prije programiranja učinite par stvari. Ako je replikacija omogućena, onemogućite ju kako biste mogli pokrenuti prva dva primjera kojima se instalira distributer i stvara izdavač. Replikaciju ćete onemogućiti ako desnom tipkom miša pritisnete čvor Replication u Object Exploreru SQL Server Management Studija, odaberete opciju Disable Replication s kontekstnog izbornika te slijedite upute čarobnjaka. Stvorite bazu podataka ReplicationDestination tako što ćete desnom tipkom miša pritisnuti čvor Databases u Object Exploreru i odabrati opciju New Databases s kontekstnog izbornika. U dijaloškom okviru New Database postavite popis Database na ReplicationDestination, prihvatite ostale podrazumijevane postavke i pritisnite OK kako bi se stvorila baza podataka. Provjerite je li postavka ispravna poduzimanjem sljedećih koraka: 1. Desnom tipkom miša pritisnite čvor Databases u Object Exploreru i odaberite opciju Refresh s kontekstnog izbornika. 2. Proširite čvor Databases u Object Exploreru pritiskom na znak plus. 3. Desnom tipkom miša pritisnite čvor Replication u Object Exploreru i odaberite opciju Refresh s kontekstnog izbornika. 4. Proširite čvor Replication u Object Exploreru pritiskom na znak plus. 5. Desnom tipkom miša pritisnite čvor Replication u Object Exploreru. Trebao bi se pojaviti kontekstni izbornik, kao što je prikazano na slici 19-1. Također biste trebali vidjeti novu bazu podataka ReplicationDestination.

Instaliranje distributera U ovom primjeru naučit ćete kako instalirati distributer na lokalnu instancu SQL Servera. Prvo se instancira objekt ServerConnection koji predstavlja lokalni stroj, a potom se stvara objekt ReplicationServer koji se temelji na objektu ServerConnection. Zatim se stvara objekt DistributionDatabase po imenu distribution, povezan s objektom ServerConnection nazvanim sc. U bazi podataka distribucije pohranjeni su podaci o replikaciji na distributeru. Na kraju, metoda InstallDistributor() klase ReplicationServer instalira distributer na trenutno povezanoj ili udaljenoj instanci SQL Servera. Baza podataka distribucije stvorena je kao baza podataka sustava. Lozinka metode InstallDistributor() mora biti u skladu s pravilima o lozinkama. Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication;

444 | Programiranje SQL Server 2005

Slika 19-1. Potrebna konfiguracija class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); // Stvara distributer ReplicationServer dist = new ReplicationServer(sc); // Instalira distributer DistributionDatabase dDb = new DistributionDatabase( "distribution", sc); dist.InstallDistributor("password1", dDb); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Nakon izvođenja primjera provjerite je li distributer instaliran tako što ćete desnom tipkom miša pritisnuti čvor Replication u Object Exploreru. Trebao bi se otvoriti kontekstni izbornik, kao što je prikazano na slici 19-2. Opcija Configuration Distribution s kontekstnog izbornika zamijenjena je dvjema novim opcijama – Distributor Properties i Disable Publishing and Distribution. Poglavlje 19: Replikacija | 445

Slika 19-2. Kontekstni izbornik Replication nakon instalacije distributera

Novu bazu podataka distribucije vidjet ćete ako u Object Exploreru SQL Server Management Studija desnom tipkom miša pritisnete čvor Replication i odaberete opciju Distributor Properties s kontekstnog izbornika. Svojstva distributera prikazana su u dijaloškom okviru Distributor Properties, što možete vidjeti na slici 19-3. RMO klase za programsko upravljanje distribucijom i objektima distributera opisane su u tablici 19-1. Tablica 19-1. RMO klase za upravljanje bazama podataka za distribuciju Klasa

Opis

DistributionDatabase

Predstavlja bazu podataka distribucije u kojoj su pohranjeni podaci o replikaciji na distributeru.

DistributionDatabaseCollection

Predstavlja kolekciju objekata DistributionDatabase. Svojstvo DistributionDatabases klase ReplicationServer vraća objekt DistributionDatabaseCollection koji sadrži sve baze podataka distribucije na distributeru.

Stvaranje izdavača Ovim primjerom stvara se izdavač na lokalnoj instanci SQL Servera. Prvo se instancira objekt DistributionPublisher koji se povezuje s ciljnim objektom ServerConnection. Klasa DistributionPublisher predstavlja računalo koje ima funkciju i izdavača i distributera. 446 | Programiranje SQL Server 2005

Slika 19-3. Dijaloški okvir Distributor Properties

Zatim se postavlja nekoliko svojstava objekta DistributionPublisher i poziva metoda Create(). Svojstvo DistributionDatabase povezuje objekt DistributionPublisher s objektom DistributionDatabase koji ste stvorili u prethodnom primjeru. Svojstvo PublisherSecurity pristupa sigurnosnom kontekstu kao objekt ConnectionSecurityContext. Njime se koristi agent replikacije za povezivanje s izdavačem distribucije. Objekt ConnectionSecurityContext određuje režim provjere vjerodostojnosti i, ako je odabrana SQL Server provjera vjerodostojnosti, prijavu i lozinku. Prije izvođenja primjera, zamijenite argument ServerName u konstruktoru DistributionPublisher imenom svog poslužitelja baze podataka i stvorite mapu C:\PSS2005\Replication.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program {

Poglavlje 19: Replikacija | 447

static void Main(string[] args) { ServerConnection sc = new ServerConnection("(local)"); DistributionPublisher dp = new DistributionPublisher( "ServerName", sc); dp.DistributionDatabase = "distribution"; dp.WorkingDirectory = @"C:\PSS2005\Replication"; dp.PublisherSecurity.WindowsAuthentication = true; dp.Create( ); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Nakon izvođenja primjera možete provjeriti je li izdavač stvoren tako što ćete desnom tipkom miša pritisnuti čvor Replication u Object Exploreru. Trebao bi se pojaviti kontekstni izbornik, kao što je prikazano na slici 19-4. Nova opcija, Publisher Properties, dodana je na kontekstni izbornik.

Slika 19-4. Kontekstni izbornik Replication nakon stvaranja izdavača

448 | Programiranje SQL Server 2005

RMO klase za programsko upravljanje izdavačima opisane su u tablici 19-2. Tablica 19-2. RMO klase za upravljanje izdavačima Klasa

Opis

DistributionPublisher

Predstavlja računalo koje ima funkciju i izdavača i distributera.

DistributionPublisherCollection

Predstavlja kolekciju objekata DistributionPublisher. Svojstvo DistributionPublishers klase ReplicationServer vraća objekt DistributionPublisherCollection koji sadrži sve izdavače kojima je SQL Server instanca distributer.

PublisherConnectionSecurityContext

Predstavlja informacije o prijavi prilikom povezivanja na instancu poslužitelja izdavača. Svojstvo PublisherSecurity klase PullSubscription vraća sigurnosni kontekst koji koristi agent sinkronizacije pri povezivanju s izdavačem.

Kao što smo već ranije spomenuli, svojstvo PublisherSecurity klase PublisherSubscriber pristupa sigurnosnom kontekstu kao objekt ConnectionSecurityContext koji koristi agent replikacije za povezivanje s izdavačem distribucije. RMO klasa za programsko upravljanje informacijama o sigurnosnom kontekstu opisana je u tablici 19-3. Tablica 19-3. RMO klasa za upravljanje informacijama o sigurnosnom kontekstu povezivanja Klasa

Opis

ConnectionSecurityContext

Predstavlja informacije za pristupanje pretplatnicima, distributerima i izdavačima SQL Server replikacije. Informacije o sigurnosnom kontekstu povezivanja određuju režim provjere vjerodostojnosti i, ako je odabrana SQL Server provjera vjerodostojnosti, korisničko ime i lozinku.

Pripremanje baze podataka za objavljivanje Ovim primjerom omogućuje se objavljivanje baze podataka AdventureWorks udruživanjem. Prvo se stvara objekt ReplicationDatabase koji se zatim povezuje s bazom podataka AdventureWorks. ReplicationDatabase predstavlja bazu podataka replikacije za izdavača ili pretplatnika. Svojstva EnableMergePublishing i EnableTransPublishing klase ReplicationDatabase provjeravaju je li bazu podataka moguće upotrijebiti za publikaciju putem transakcijske replikacije i replikacije udruživanjem. Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program {

Poglavlje 19: Replikacija | 449

static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); ReplicationDatabase rDb = new ReplicationDatabase( "AdventureWorks", sc); rDb.EnabledMergePublishing = true; sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Kôd ovog primjera omogućuje samo objavljivanje baze podataka AdventureDatabase udruživanjem. On ništa ne objavljuje. Iz sljedećih primjera naučit ćete kako objaviti članak.

Nakon izvođenja koda, provjerite je li baza podataka AdventureWorks omogućena za objavljivanje udruživanjem tako što ćete otvoriti čvor Replication ➝ Publisher Properties u Object Exploreru te odabrati stranicu Publication Databases. Slika 195. prikazuje bazu podataka AdventureWorks čije je objavljivanje udruživanjem sada omogućeno.

Stvaranje publikacije U ovom primjeru stvara se publikacija udruživanjem AdventureWorks_MergePub za bazu podataka AdventureWorks. Prvo se instancira objekt MergePublication, a zatim se postavljaju svojstva Name, DatabaseName, ConnectionContext i Status. Na kraju se poziva metoda Create(). Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); MergePublication mp = new MergePublication( mp.Name = "AdventureWorks_MergePub"; mp.DatabaseName = "AdventureWorks"; mp.ConnectionContext = sc;

450 | Programiranje SQL Server 2005

);

mp.Status = State.Active; mp.Create( ); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Slika 19-5. Dijaloški okvir Publisher Properties s bazom podataka AdventureWorks

Nakon izvođenja primjera, novu publikaciju možete vidjeti u Object Exploreru ako osvježite i proširite čvor Replication ➝ Local Publications, kao što je prikazano na slici 19-6. Publikacija neće objaviti ništa, budući da nema definirane članke. Sljedeći odjeljak govori o objavljivanju članaka.

RMO klase za upravljanje publikacijama opisane su u tablici 19-4.

Poglavlje 19: Replikacija | 451

Slika 19-6. Rezultati primjera stvaranja publikacije Tablica 19-4. RMO klase za upravljanje publikacijama Klasa

Opis

DistributionPublication

Predstavlja informacije (samo za čitanje) o distributerskoj slici publikacije snimkom stanja, transakcijom ili udruživanjem.

DistributionPublicationCollection

Predstavlja kolekciju objekata DistributionPublication. Svojstvo DistributionDatabases klase DistributionPublisher vraća objekt DistributionPublicationCollection sa svim publikacijama distribucije definirane na bazi podataka distribucije.

MergeDynamicSnapshotJob

Predstavlja informacije o poslu agenta snimke stanja koji stvara podatke o snimci stanja za pretplatu na publikaciju udruživanjem s parametriziranim filtrom reda. Metoda EnumDynamicSnapshotJobs() klase MergePublication vraća objekt ArrayList dinamičkih snimaka stanja za publikaciju udruživanjem.

MergePartition

Predstavlja informacije o particiji pretplatnika za publikaciju udruživanjem s parametriziranim filtrom reda. Metoda EnumMergePartitions() klase MergePublication vraća objekt ArrayList particije pretplatnika za publikaciju udruživanjem.

MergePublication

Predstavlja publikaciju udruživanjem. Metoda EnumMergePublications() klase ReplicationDatabase vraća objekt ArrayList publikacija udruživanjem koje koriste bazu podataka replikacije.

MergePublicationCollection

Predstavlja kolekciju objekata MergePublication. Svojstvo MergePublications klase ReplicationDatabase vraća objekt MergePublicationCollection koji sadrži sve publikacije udruživanjem definirane na bazi podataka replikacije. Svojstvo MergePublications klase DistributionPublisher vraća objekt MergePublicationCollection koji sadrži sve publikacije udruživanjem definirane na izdavaču distribucije.

PublicationAccess

Predstavlja informacije o prijavi u popisu pristupa publikaciji (PAL – publication access list) za publikaciju.

TransPublication

Predstavlja transakcijsku publikaciju ili publikaciju snimkom stanja.

452 | Programiranje SQL Server 2005

Tablica 19-4. RMO klase za upravljanje publikacijama (nastavak) Klasa

Opis

TransPublicationCollection

Predstavlja kolekciju objekata TransPublication. Svojstvo TransPublications klase ReplicationDatabase vraća objekt TransPublicationCollection koji sadrži sve transakcijske publikacije i publikacije snimkom stanja definirane na bazi podataka replikacije. Svojstvo TransPublications klase DistributionPublisher vraća objekt TransPublicationCollection koji sadrži sve transakcijske publikacije i publikacije snimkom stanja definirane na izdavaču distribucije.

Stvaranje članka Ovaj primjer stvara članak Article_1 u publikaciji udruživanjem AdventureWorks_MergePub koju smo stvorili ranije u ovom poglavlju. S postupkom stvaranja članka već ste upoznati: 1. Instancirajte odgovarajući objekt, u ovom slučaju, objekt MergeArticle (koji predstavlja članak u publikaciji udruživanjem). 2. Postavite potrebna svojstva. 3. Pozovite Create() metodu objekta. Sljedeća svojstva određuju objekt MergeArticle: Name Ime pod kojim SQL Server pohranjuje članak. PublicationName Ime publikacije udruživanjem pod kojim se članak izlaže za replikaciju. DatabaseName Ime pozadinske baze podataka. ConnectionContext Objekt ServerConnection koji predstavlja ciljni stroj. SourceObjectName Ime objekta u bazi podataka. SourceObjectOwner Ime vlasnika (ili sheme) objekta iz baze podataka koji se izdaje. Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program

Poglavlje 19: Replikacija | 453

{ static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); MergeArticle ma = new MergeArticle( ); ma.Name = "Article_1"; ma.PublicationName = "AdventureWorks_MergePub"; ma.DatabaseName = "AdventureWorks"; ma.ConnectionContext = sc; ma.SourceObjectName = "Vendor"; ma.SourceObjectOwner = "Purchasing"; ma.Create( ); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Nakon izvođenja koda, publikaciju možete vidjeti ako desnom tipkom miša pritisnete čvor Replication ➝ Local Publications ➝ [Adventure Works]: AdventureWorks_MergePub u Object Exploreru i odaberete opciju Properties s kontekstnog izbornika. Odaberite stranicu Articles u dijaloškom okviru Publication Properties za prikaz članaka za objavljivanje, kao što je prikazano na slici 19-7.

Slika 19-7. Rezultati primjera stvaranja članka 454 | Programiranje SQL Server 2005

RMO klase za upravljanje publikacijama opisane su u tablici 19-5. Tablica 19-5. RMO klase za upravljanje člancima Klasa

Opis

ArticleConflict

Predstavlja informacije o tablici konflikata replikacije udruživanjem. Metoda EnumConflictTables() objekta ReplicationDatabase vraća objekt ArrayList s informacijama o konfliktima za sve publikacije udruživanjem i pretplate.

DistributionArticle

Predstavlja informacije (samo za čitanje) o distributerskoj slici članaka snimkom stanja, transakcijom ili udruživanjem

DistributionArticleCollection

Predstavlja kolekciju objekata DistributionArticle. Svojstvo DistributionArticles klase DistributionPublication vraća objekt DistributionArticleCollection koji sadrži sve članke distribucije definirane na publikaciji distribucije.

MergeArticle

Predstavlja članak u publikaciji udruživanjem. Metoda EnumArticles() klase MergePublication vraća ArrayList objekt članaka u publikaciji.

MergeArticleCollection

Predstavlja kolekciju objekata MergeArticle. Svojstvo MergeArticles klase MergePublication vraća objekt MergeArticleCollection koji sadrži sve članke u publikaciji udruživanjem.

MergeJoinFilter

Predstavlja odnos filtra za spajanje ili logičkih zapisa između članaka udruživanjem. Metoda EnumMergeJoinFilters() klase MergeArticle vraća ArrayList objekt filtra za spajanje definiranih za članak udruživanjem.

TransArticle

Predstavlja članak u publikaciji transakcijom ili snimkom stanja. Metoda EnumArticles() klase TransPublication vraća ArrayList objekt članaka u publikaciji.

TransArticleCollection

Predstavlja kolekciju objekata TransArticle. Svojstvo TransArticles klase TransPublication vraća objekt TransArticleCollection koji sadrži sve članke iz publikacije transakcijom ili snimkom stanja.

Enumeriranje stavki dostupnih za replikaciju Ovaj primjer enumerira tablice i stupce iz baze podataka koji se mogu replicirati. Za enumeraciju se koristi metoda EnumReplicationTables() klase ReplicationDatabase. Ta metoda vraća objekt ArrayList koji sadrže objekti ReplicationTable. Pretražuje se objekt ArrayList i poziva metoda EnumReplicationColumns() za svaki objekt ReplicationTable. U primjeru su navedena imena i tipovi podataka za svaki pronađeni stupac. Slijedi izvorni kod primjera: using System; using System.Collections; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program {

Poglavlje 19: Replikacija | 455

static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); ReplicationDatabase rDb = new ReplicationDatabase( "AdventureWorks", sc); ArrayList ta = rDb.EnumReplicationTables( ); for (int i = 0; i < ta.Count; i++) { ReplicationTable t = (ReplicationTable)ta[i]; Console.WriteLine(t.OwnerName + "." + t.Name); ArrayList ca = t.EnumReplicationColumns( ); for (int j = 0; j < ca.Count; j++) { ReplicationColumn c = (ReplicationColumn)ca[j]; Console.WriteLine(" " + c.Name + " " + c.Datatype); } Console.WriteLine(Environment.NewLine); } sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Dio rezultata prikazan je na slici 19-8.

Slika 19-8. Rezultati primjera enumeracije stavki za replikaciju

456 | Programiranje SQL Server 2005

RMO klase za upravljanje stavkama za replikaciju opisane su u tablici 19-6. Tablica 19-6. RMO klase za upravljanje objektima koji se repliciraju Klasa

Opis

HeterogeneousColumn

Predstavlja stupac u tablici na izdavaču koji nije dio SQL Servera. Metoda EnumHeterogeneousColumns() klase ReplicationServer vraća objekt ArrayList iz heterogenih stupaca u tablicu koja se može replicirati.

HeterogenousTable

Predstavlja tablicu na izdavaču koji nije dio SQL Servera. Metoda EnumHeterogenousTables() klase ReplicationServer vraća objekt ArrayList iz heterogenih tablica koje se mogu replicirati.

IdentityRangeInfo

Predstavlja postavke za upravljanje rasponom identiteta izdanog članka kada izvorna tablica sadrži stupac s identitetom. Metoda EnumIdentityRangeInfo() klase ReplicationTable vraća ArrayList objekt informacija o rasponu identiteta članaka koji se temelje na tablici.

ReplicationColumn

Predstavlja informacije o stupcu (u tablici) koji sudjeluje u replikaciji. Metoda EnumReplicationColumns() klase ReplicationTable vraća objekt ArrayList stupca koji se može replicirati.

ReplicationDatabase

Predstavlja bazu podataka replikacije publikacije ili pretplate.

ReplicationDatabaseCollection

Predstavlja kolekciju baza podataka replikacije. Metoda EnumReplicationDatabases() klase ReplicationServer vraća objekt ArrayList svih baza podataka dostupnih za replikaciju na poslužitelju replikacije.

ReplicationSchemaBoundView

Predstavlja informacije o pogledu vezanom uz shemu koji sudjeluje u replikaciji. Metoda EnumReplicationSchemaBoundViews() klase ReplicationDatabase vraća objekt ArrayList pogleda vezanih za shemu koji se mogu replicirati.

ReplicationStoredProcedure

Predstavlja informacije o pohranjenoj proceduri koja sudjeluje u replikaciji. Metoda EnumReplicationStoredProcedures() klase ReplicationDatabase vraća objekt ArrayList pohranjenih procedura koje se mogu replicirati.

ReplicationTable

Predstavlja informacije o tablici koja sudjeluje u replikaciji. Metoda EnumReplicationTables() klase ReplicationDatabase vraća objekt ArrayList iz tablica koje se mogu replicirati.

ReplicationUserDefinedAggregate

Predstavlja informacije o korisnički definiranom agregatu koji sudjeluje u replikaciji. Metoda EnumReplicationUserDefinedAggregates() klase ReplicationDatabase vraća objekt ArrayList korisnički definiranih agregata koji se mogu replicirati.

ReplicationUserDefinedFunction

Predstavlja informacije o korisnički definiranoj funkciji koja sudjeluje u replikaciji. Metoda EnumReplicationUserDefinedFunctions() klase ReplicationDatabase vraća objekt ArrayList korisnički definiranih funkcija koje se mogu replicirati.

ReplicationView

Predstavlja informacije o korisnički definiranom pogledu koji sudjeluje u replikaciji. Metoda EnumReplicationViews() klase ReplicationDatabase vraća objekt ArrayList pogleda koji se mogu replicirati.

Poglavlje 19: Replikacija | 457

Filtriranje članka Ovaj primjer dijeli članke, koje smo prethodno stvorili vodoravno (po redovima) i okomito (po stupcima). To čini s pomoću klase MergeArticle koja izlaže jedno svojstvo i dvije metode. Svojstvo FilterClause klase MergeArticle definira podgrupe redova koji su dostupni članku. Taj postupak sličan je vodoravnoj podjeli podataka. Sintaksa iskaza za filtar istovjetna je sintaksi T-SQL naredbe WHERE, osim što ne sadrži riječ WHERE. U ovom primjeru potpuna WHERE naredba glasi WHERE CreditRating = 1 AND PreferredVendorStatus = 'true'. Bit će objavljeni samo oni zapisi koji odgovaraju ovom kriteriju. Metode AddReplicationColumns() i RemoveReplicatedColumns() dodaju i uklanjaju stupce sa članka. Taj postupak sličan je okomitoj podjeli podataka. Samo se stupci koji mogu imati null vrijednost i oni s podrazumijevanom vrijednošću mogu ukloniti s okomite particije. U ovom primjeru uklanja se stupac PurchasingWebServiceURL sa članka. Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); ReplicationDatabase rDb = new ReplicationDatabase( "AdventureWorks", sc); MergeArticle ma = rDb.MergePublications["AdventureWorks_MergePub"]. MergeArticles["Article_1"]; ma.FilterClause = "CreditRating = 1 AND PreferredVendorStatus = 'true'"; ma.RemoveReplicatedColumns(new string[] {"PurchasingWebServiceURL"}); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Članak možete proučiti ako desnom tipkom miša pritisnete čvor Replication ➝ Local Publications ➝ [AdventureWorks] : AdventureWorks_MergePub u Object Exploreru i odaberete opciju Properties s kontekstnog izbornika. Odaberite stranicu Articles kako biste vidjeli kako je stupac PurchasingWebServiceURL uklonjen sa članka, kao što je prikazano na slici 19-9.

458 | Programiranje SQL Server 2005

Slika 19-9. Dijaloški okvir Publication Properties

Filtar koji ste dodali možete proučiti ako odaberete stranicu Filter Rows u dijaloškom okviru Publication Properties i filtrirane tablice Vendor (Purchasing) te pritisnete gumb Edit kojim se otvara dijaloški okvir Edit Filter, kao što je prikazano na slici 19-10.

Registriranje pretplatnika Ovaj primjer stvara pretplatnika Subscriber_1 s pomoću klase RegisteredSubscriber na vrlo jednostavan način: 1. Instancira objekt RegisteredSubscriber povezujući ga s objektom ServerConnection koji predstavlja ciljni SQL Server. 2. Poziva metodu Create(). Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common;

Poglavlje 19: Replikacija | 459

Slika 19-10. Dijaloški okvir Edit Filter using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); RegisteredSubscriber rs = new RegisteredSubscriber("Subscriber_1", sc); rs.Create( ); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Procedura sp_helpsubsciberinfo pohranjena u sustavu vraća informacije o registriranim pretplatnicima.

460 | Programiranje SQL Server 2005

RMO klase za upravljanje pretplatnicima služe za povratnu kompatibilnost, budući da u SQL Serveru više nije potrebno eksplicitno registrirati pretplatnika na izdavaču. Te su klase opisane u tablici 19-7. Tablica 19-7. RMO klase za upravljanje pretplatnicima Klasa

Opis

RegisteredSubscriber

Predstavlja pretplatnika koji je registriran na izdavaču ili distributeru. Metoda EnumRegisteredSubscribers() klasa DistributionPublisher i ReplicationServer vraća objekt ArrayList registriranih pretplatnika.

RegisteredSubscriberCollection

Svojstvo RegisteredSubscribers klasa DistributionPublisher i ReplicationServer vraća objekt RegisteredSubscriberCollection koji sadrži sve registrirane pretplatnike.

Stvaranje pretplate U ovom primjeru stvara se pretplata udruživanjem i izvlačenjem za publikaciju AdventureWorks_MergePub koju smo prethodno stvorili. Postupak je uobičajen i poziva se samo jedna dodatna metoda: 1. Instancira se objekt MergePullSubscription. 2. Postavljaju se svojstva. 3. Poziva se Create() metoda objekta. 4. Poziva se metoda Refresh(). Postavljaju se sljedeća svojstva: ConnectionContext Ciljna instanca SQL Servera. DatabaseName Ime baze podataka pretplate. PublisherName Ime povezano s objektom DistributionPublisher prilikom njegova stvaranja. PublicationDBName Ime koje je izdavač dodijelio bazi podataka. PublicationName Ime koje je dodijeljeno publikaciji. SubscriberType Vrijednost iz enumeracije MergeSubscriberType. CreateSyncAgentByDefault Postavljanjem ovog svojstva klase MergePullSubscription stvara se posao agenta kojim se sinkronizira pretplata. Poglavlje 19: Replikacija | 461

Morate poduzeti i dva dodatna koraka: 1. Konfigurirajte objekt MergePublication tako da dopušta izvlačenje. 2. Registrirajte pretplatu izvlačenjem i udruživanjem na izdavaču. Poduzmite sljedeće korake kako biste konfigurirali objekt MergePublication (AdventureWorks_MergePub), omogućili izvlačenje te registrirali pretplatu: 1. Instancirajte objekt MergePublication i povežite ga s AdventureWorks_MergePub. 2. Učitajte svojstva publikacije. 3. Provjerite ukazuje li svojstvo Attribute na to da publikacija podržava izvlačenje. 4. Ako publikacija ne podržava izvlačenje, promijenite Attributes te pozovite metode CommitPropertyChanges() i Refresh() na objektu MergePublication. 5. Pozovite metodu MakePullSubscriptionWellKnown na objektu MergePublication. Prije izvođenja primjera, zamijenite argument ServerName, koji smo upotrijebili za postavljanje svojstva MergePullSubscription.PublisherName i u metodi MergePublication.MakePullSubscription(), imenom poslužitelja baze podataka.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); // Stvara pretplatu izvlačenjem MergePullSubscription mps = new MergePullSubscription( mps.ConnectionContext = sc; mps.PublisherName = "ServerName"; mps.PublicationDBName = "AdventureWorks"; mps.PublicationName = "AdventureWorks_MergePub"; mps.DatabaseName = "ReplicationDestination"; mps.SubscriberType = MergeSubscriberType.Local; mps.CreateSyncAgentByDefault = true; mps.Create( ); MergePublication mp = new MergePublication( "AdventureWorks_MergePub", "AdventureWorks", sc); mp.LoadProperties( ); // Dozvoljava izvlačenje ako već nije dozvoljeno

462 | Programiranje SQL Server 2005

);

if ((mp.Attributes & PublicationAttributes.AllowPull) == 0) { mp.Attributes = mp.Attributes | PublicationAttributes.AllowPull; mp.CommitPropertyChanges( ); mp.Refresh( ); } // Registrira pretplatu izvlačenjem i udruživanjem podataka na izdavaču mp.MakePullSubscriptionWellKnown( "ServerName", "ReplicationDestination", mps.SyncType, mps.SubscriberType, mps.Priority); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Kako biste proučili pretplatu, osvježite i proširite čvor Replication ➝ Local Subscription u Objekt Exploreru, desnom tipkom miša pritisnite lokalnu pretplatu [ReplicationDestination] – [ServerName].[AdventureWorks]: AdventureWorks_MergePub i odaberite opciju Properties s kontekstnog izbornika za prikaz dijaloškog okvira Subscription Properties. Na slici 19-11. prikazani su detalji vezani uz novu pretplatu. Postavljanjem svojstva CreateSyncAgentByDefault klase MergePullSubscription stvara se posao agenta kojim se sinkronizira pretplata. Otvorite SQL Server Agent jobs odabirom opcije SQL Server Agent ➝ Jobs i vidjet ćete novostvoreni posao replikacije udruživanjem. RMO klase za upravljanje pretplatama opisane su u tablici 19-8. Tablica 19-8. RMO klase za upravljanje pretplatama Klasa

Opis

DistributionSubscription

Predstavlja informacije (samo za čitanje) o distributerskoj slici replikacije putem snimke stanja ili transakcije. Namijenjena je stvaranju pretplate na heterogenu publikaciju.

DistributionSubscriptionCollection

Predstavlja kolekciju objekata DistributionSubscription. Svojstvo DistributionSubscriptions klase DistributionPublication vraća objekt DistributionPublicationCollection koji sadrži sve pretplate distribucije definirane na publikaciji distribucije.

LastValidationDateTime

Predstavlja datum i vrijeme zadnje potvrde pretplate udruživanjem.

MergePullSubscription

Predstavlja pretplatu izvlačenjem na publikaciju udruživanjem. Svojstvo EnumMergePullSubscriptions klase ReplicationDatabase vraća objekt ArrayList svih pretplata udruživanjem i izvlačenjem koje se koriste bazom podataka.

Poglavlje 19: Replikacija | 463

Tablica 19-8. RMO klase za upravljanje pretplatama (nastavak) Klasa

Opis

MergePullSubscriptionCollection

Predstavlja kolekciju objekata MergePullSubscription. Svojstvo MergePullSubscriptions klase ReplicationDatabase vraća objekt MergePullSubscriptionCollection koji sadrži sve pretplate izvlačenjem i udruživanjem definirane na bazi podataka replikacije.

MergeSubscription

Predstavlja pretplatu na publikaciju udruživanjem.

MergeSubscriptionCollection

Predstavlja kolekciju objekata MergeSubscription. Svojstvo MergeSubscriptions klase ReplicationDatabase vraća objekt MergeSubscriptionCollection koji sadrži pretplate guranjem i udruživanjem definirane na bazi podataka replikacije.

SubscriptionBackupInformation

Predstavlja informacije o uređajima za podršku koji se koriste za postavljanje „početne pretplate iz podrške“.

SubscriberSubscription

Predstavlja jednostavan objekt s ograničenim informacijama o pretplati na pretplatničkom poslužitelju.

TransPullSubscription

Predstavlja pretplatu izvlačenjem na publikacije putem transakcije ili snimke stanja. Svojstvo EnumTransPullSubscriptions klase ReplicationDatabase vraća objekt ArrayList svih pretplata izvlačenjem i udruživanjem koje se koriste bazom podataka.

TransPullSubscriptionCollection

Predstavlja kolekciju objekata TransPullSubscription. Svojstvo TransPullSubscriptions klase ReplicationDatabase vraća objekt TransPullSubscriptionCollection koji sadrži sve pretplate izvlačenjem putem transakcije i snimke stanja definirane na bazi podataka replikacije.

TransSubscription

Predstavlja pretplatu na publikaciju putem transakcije ili snimke stanja.

TransSubscriptionCollection

Predstavlja kolekciju objekata TransSubscription. Svojstvo TransSubscriptions klase ReplicationDatabase vraća objekt TransSubscriptionCollection koji sadrži sve pretplate putem transakcije ili snimke stanja definirane na bazi podataka replikacije.

Stvaranje početne snimke stanja Ovim primjerom stvara se početna snimka stanja koja inicijalizira pretplatnika za novu pretplatu. Koristi se klasa SnapshotGenerationAgent koja predstavlja agenta snimke stanja. Prvo se stvara instanca ove klase, a zatim se postavljaju sljedeća svojstva: Publisher Ime izdavača distribucije. PublisherDatabase Ime baze podataka koja se objavljuje za replikaciju. Publication Ime publikacije. 464 | Programiranje SQL Server 2005

Slika 19-11. Dijaloški okvir Subscription Properties

Distributor Ime distributera (u ovom slučaju ono je isto kao Publisher). PublisherSecurityMode Vrijednost enumeracije SecurityMode (u ovom slučaju, SecurityMode.Integrated). DistributorSecurityMode Vrijednost enumeracije SecurityMode (u ovom slučaju, SecurityMode.Integrated). ReplicationType Vrijednost enumeracije ReplicationType (u ovom slučaju, ReplicationType.Merge). Na kraju se poziva metoda GenerateSnapshot() klase SnapshotGenerationAgent. U ovom slučaju, metoda GenerateSnapshot() sinkrono pokreće agenta snimke stanja kako bi se stvorila početna snimka stanja za publikaciju udruživanjem AdventureWorks_MergePub.

Poglavlje 19: Replikacija | 465

Za prevođenje i izvođenje ovog primjera potrebno je dodati referencu na sklop Microsoft.SqlServer.Replication.dll koji je podrazumijevano instaliran u mapi C:\Program Files\Microsoft SQL Server\90\SDK\ Assemblies. Prije izvođenja primjera, zamijenite argument ServeName, kojim se postavljaju svojstva SnapshotGenerationAgent.Publisher i SnapshotGenerationAgent.Distributor, imenom poslužitelja baze podataka.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { SnapshotGenerationAgent sga = new SnapshotGenerationAgent( sga.Publisher = "ServerName"; sga.PublisherDatabase = "AdventureWorks"; sga.Publication = "AdventureWorks_MergePub"; sga.Distributor = "ServerName"; sga.PublisherSecurityMode = SecurityMode.Integrated; sga.DistributorSecurityMode = SecurityMode.Integrated; sga.ReplicationType = ReplicationType.Merge; sga.GenerateSnapshot( );

);

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Dio rezultata prikazan je na slici 19-12. Metoda StartSnapshotGenerationAgentJob() klase MergePublication i TransPublication asinkrono stvara snimku stanja.

Sinkroniziranje pretplate na početnu snimku stanja Za ovaj primjer upotrijebit ćemo snimku stanja koju smo stvorili ranije U ovom poglavlju. Njome ćemo inicijalizirati pretplatnika pri prvoj sinkronizaciji podataka. Prije izvođenja primjera zamijenite argument ServerName, kojim se postavlja svojstvo MergePullSubscription.PublisherName, imenom poslužitelja baze podataka.

466 | Programiranje SQL Server 2005

Slika 19-12. Dio rezultata primjera stvaranja početne snimke stanja

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); MergePullSubscription mps = new MergePullSubscription( mps.ConnectionContext = sc; mps.DatabaseName = "ReplicationDestination"; mps.PublisherName = "ServerName"; mps.PublicationDBName = "AdventureWorks"; mps.PublicationName = "AdventureWorks_MergePub"; mps.LoadProperties( ); mps.SynchronizeWithJob( ); sc.Disconnect(

);

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Nakon izvođenja koda, stvara se tablica Vendor u pretplatničkoj bazi podataka ReplicationDatabase.

Metoda SynchronizeWithJob() klase MergeSubscription, MergePullSubscription, TransSubscription i TransPullSubscription pokreće posao agenta za udruživanje koji

Poglavlje 19: Replikacija | 467

sinkronizira pretplatu. Snimka stanja se premješta i pridodaje pretplatniku pri prvoj sinkronizaciji pretplate. Odabirom opcije View Synchronization Status s kontekstnog izbornika za lokalnu pretplatu, prikazat će se status zadnje sinkronizacije koji može biti: Applied the snapshot and merged 0 data change(s) (0 insert(s), 0 update(s), 0 delete(s), 0 conflict(s)).

Pri drugom izvođenju koda snimka stanja se ne prenosi, a status zadnje sinkronizacije može glasiti: Merge completed with no data changes processed.

Tijekom replikacije moguće je promijeniti podatke u više čvorova, što znači da promjene u jednom čvoru mogu biti u konfliktu s onima u drugom. RMO klase za upravljanje informacijama o konfliktu u replikacijama putem udruživanja i transakcije opisane su u tablici 19-9. Tablica 19-9. RMO klase za upravljanje konfliktima u replikacijama Klasa

Opis

MergeConflictCount

Informacija o broju konflikata za članak tablice u replikaciji udruživanjem. Metoda EnumMergeConflictCounts() klase ReplicationDatabase vraća ArrayList objekt konflikata u publikaciji udruživanjem ili bazi podataka pretplate.

TransConflictCount

Predstavlja informaciju o broju konflikata za članak tablice u transakcijskoj replikaciji. Metoda EnumTransConflictCounts() klase ReplicationDatabase vraća ArrayList objekt konflikata u transakcijskoj publikaciji ili bazi podataka pretplate.

Vraćanje rezultata iz agenta za povijest Ovaj primjer donosi informacije o statusu zadnje pokrenute sinkronizacije. To čini s pomoću metode LastAgentJobHistoryInfo() klase MergePullSubscription, koja vraća informacije u obliku objekta AgentJobHistoryInfo. Klasa MergePullSubscription vraća rezultate zadnjeg pokretanja agenta replikacije. Zatim prikazuje svojstva LastRunDateTime i Status toga objekta. Prije izvođenja primjera, zamijenite argument ServerName koji se koristi za postavljanje svojstva MergePullSubscription.PublisherName, imenom poslužitelja baze podataka.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program

468 | Programiranje SQL Server 2005

{ static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); MergePullSubscription mps = new MergePullSubscription( mps.ConnectionContext = sc; mps.DatabaseName = "ReplicationDestination"; mps.PublisherName = "ServerName"; mps.PublicationDBName = "AdventureWorks"; mps.PublicationName = "AdventureWorks_MergePub"; mps.LoadProperties( );

);

AgentJobHistoryInfo ajhi = mps.LastAgentJobHistoryInfo( ); Console.WriteLine("Last Run Date/Time: " + ajhi.LastRunDateTime); Console.WriteLine("Status: " + ajhi.Status); sc.Disconnect(

);

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 19-13.

Slika 19-13. Rezultati primjera uzimanja povijesti agenta

RMO klase za upravljanje agentima opisane su u tablici 19-10. Tablica 19-10. RMO klase za upravljanje agentima Klasa

Opis

AgentJobHistoryInfo

Predstavlja rezultate zadnjeg pokretanja agenta replikacije. Svojstvo LastAgentJobHistoryInfo klasa MergePullSubscription i TransPullSubscription vraća objekt AgentJobHistoryInfo s informacijama o zadnje pokrenutom poslu sinkronizacije.

AgentProfile

Predstavlja profil agenta replikacije. Metoda EnumAgentProfiles() klase ReplicationServer vraća objekt ArrayList svih profila agenata replikacije koje

podržava poslužitelj.

Profili agenata replikacije definiraju podrazumijevane vrijednosti prilikom stvaranja poslova za agente.

Poglavlje 19: Replikacija | 469

Tablica 19-10. RMO klase za upravljanje agentima (nastavak) Klasa

Opis

AgentProfileParameter

Predstavlja parametar u profilu agenta za replikaciju. Metoda EnumParameter() klase AgentProfile vraća objekt ArrayList s informacijama o parametrima za profil agenta replikacije.

AgenProfileParameterInfo

Predstavlja informacije o parametru agenta replikacije. Metoda EnumParameter() klase AgentProfile vraća objekt ArrayList s informacijama o parametrima za profil agenta replikacije.

Zadavanje redoslijeda replikacije Ovim primjerom zadano je da pretplata, o čijem stvaranju je bilo riječi pod naslovom „Stvaranje pretplate“, izvlači podatke o replikaciji iz publikacije svakih pet minuta. U tu svrhu postavlja se nekoliko svojstava objekta MergePullSubscription: AgentSchedule.FrequencyType Uzima vrijednost iz enumeracije ScheduleFrequencyType (u ovom slučaju, ScheduleFrequencyType.Daily). AgentSchedule.FrequencySubDay Uzima vrijednost iz enumeracije ScheduleFrequencySubDay (u ovom slučaju, ScheduleFrequencySubDay.Minute). AgentSchedule.FrequencySubDayInterval Zadaje broj stavki u AgentSchedule.FrequencySubDay. U primjeru je zadano da se replikacija pokreće svakih sat vremena. Na kraju se poziva metoda CommitPropertyChanges() na objektu MergePullSubscription. Prije izvođenja primjera, zamijenite argument ServerName koji se koristi za postavljanje svojstva MergePullSubscription.PublisherName s imenom poslužitelja baze podataka.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); MergePullSubscription mps = new MergePullSubscription( mps.ConnectionContext = sc;

470 | Programiranje SQL Server 2005

);

mps.DatabaseName = "ReplicationDestination"; mps.PublisherName = "ServerName"; mps.PublicationDBName = "AdventureWorks"; mps.PublicationName = "AdventureWorks_MergePub"; mps.LoadProperties( ); mps.AgentSchedule.FrequencyType = ScheduleFrequencyType.Daily; mps.AgentSchedule.FrequencySubDay = ScheduleFrequencySubDay.Hour; mps.AgentSchedule.FrequencySubDayInterval = 1; mps.CommitPropertyChanges( ); sc.Disconnect(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Nakon izvođenja primjera, novi raspored poslova u Object Exploreru možete vidjeti ako osvježite SQL Server Agent ➝ Jobs, desnom tipkom miša pritisnete posao ServerName – AdventureWorks – AdventureWorks_MergePub – ServerName – ReplicationDestination – 0. i odaberete opciju Properties s kontekstnog izbornika, nakon čega će se

otvoriti dijaloški okvir Job Properties prikazan na slici 19-14.

Slika 19-14. Dijaloški okvir Job Properties

Poglavlje 19: Replikacija | 471

Odaberite stranicu Schedules, a zatim pritisnite gumb Edit za prikaz dijaloškog okvira Job Schedules Properties, kao što je prikazano na slici 19-15.

Slika 19-15. Dijaloški okvir Job Schedule Properties

RMO klase za upravljanje agentima replikacije opisane su u tablici 19-11. Tablica 19-11. RMO klase za upravljanje agentima replikacije Klasa

Opis

ReplicationAgentSchedule

Predstavlja raspored poslova agenta replikacije. Svojstvo AgentSchedule klasa PullSubscription i TransPullSubscription vraća objekt AgentSchedule.

ReplicationStatusAndWarning

Predstavlja informacije o statusu agenta replikacije i upozorenje o pragu nadzora.

Potvrda podataka o pretplatniku U ovom primjeru potvrđuje se pretplata na publikaciju AdventureWorks_MergePub o čijem stvaranju je bilo riječi pod naslovom „Stvaranje publikacije“. Prvo se poziva 472 | Programiranje SQL Server 2005

metoda Subscription() klase MergePublication, koja zadaje pretplatu koja će biti potvrđena u sljedećoj sinkronizaciji. Pozivanjem metode MergePullSubscription.SynchronizeWithJob() pokreće se sinkronizacija. Prije izvođenja primjera, zamijenite argument ServerName, koji se koristi u konstruktoru MergePublication.ValidateSubscription() i služi za postavljanje svojstva MergePullSubscription.PublisherName s imenom poslužitelja baze podataka.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); // Određuje pretplatu za potvrđivanje MergePublication mp = new MergePublication( ); mp.ConnectionContext = sc; mp.Name = "AdventureWorks_MergePub"; mp.DatabaseName = "AdventureWorks"; mp.LoadProperties( ); mp.ValidateSubscription("ServerName", "ReplicationDestination", ValidationOption.Checksum80); // Sinkronizira pretplatu MergePullSubscription mps = new MergePullSubscription( mps.ConnectionContext = sc; mps.DatabaseName = "ReplicationDestination"; mps.PublisherName = "ServerName"; mps.PublicationDBName = "AdventureWorks"; mps.PublicationName = "AdventureWorks_MergePub"; mps.LoadProperties( ); mps.SynchronizeWithJob( ); sc.Disconnect(

);

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Metoda ValidateSubscription() klase MergePublication zadaje pretplatu koja će se potvrditi u sljedećoj sinkronizaciji. Za prikaz pretplate, osvježite i proširite čvor Replication ➝ Local Subscriptions u Object Exploreru, desnom tipkom miša pritisnite Poglavlje 19: Replikacija | 473

lokalnu pretplatu [ReplicationDestination] – [ServerName].[AdventureWorks]: AdventureWorks_MergePub i odaberite opciju View Job History s kontekstnog izbornika nakon čega će se otvoriti dijaloški okvir Log File Viewer. Detaljni rezultati potvrđivanja navedeni su u donjem oknu, kao što je prikazano na slici 19-16.

Slika 19-16. Dijaloški okvir Log File Viewer

Nadziranje replikacije Ovaj primjer donosi sažete i detaljne informacije o sesiji udruživanja s pomoću tri klase: MergeSubscriberMonitor Predstavlja poslužiteljsko nadziranje pretplata na publikacije udruživanjem. MergeSessionSummary Predstavlja informacije o sesiji agenta za udruživanje. Poziv na metodu MergeSubscriberMonitor.GetSessionsSummary() vraća polje objekata MergeSessionSummary.

474 | Programiranje SQL Server 2005

MergeSessionDetail Predstavlja informacije o koraku u sesiji agenta za udruživanje. Poziv na metodu MergeSubscriberMonitor.GetSessionDetails() vraća polje objekata MergeSessionDetail. U primjeru su navedena svojstva StartTime, Duration i Status svih objekata MergeSessionSummary. Također, pozivanjem metode MergeSubscriberMonitor.GetSessionDetails() dobivaju se detalji o svim koracima i prikazuju se svojstva DetailType i Message. Prije izvođenja primjera, zamijenite argument ServerName, koji se koristi za postavljanje svojstva MergeSubscriberMonitor.Publisher, imenom poslužitelja baze podataka.

Slijedi izvorni kod primjera: using System; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Replication; class Program { static void Main(string[] args) { ServerConnection sc = new ServerConnection("localhost"); MergeSubscriberMonitor msm = new MergeSubscriberMonitor(sc); msm.Publisher = "ServerName"; msm.Publication = "AdventureWorks_MergePub"; msm.PublisherDB = "AdventureWorks"; msm.SubscriberDB = "ReplicationDestination"; // Prikazuje sažete informacije o sesiji udruživanja MergeSessionSummary[] mssa = msm.GetSessionsSummary( ); foreach (MergeSessionSummary mss in mssa) { Console.WriteLine(mss.StartTime + ", " + mss.Duration + ", " + mss.Status); // Prikazuje sažete informacije o sesiji udruživanja za sesiju MergeSessionDetail[] msda = msm.GetSessionDetails(mssa[0].SessionId); foreach (MergeSessionDetail msd in msda) Console.WriteLine(" " + msd.DetailType + ": " + msd.Message); Console.WriteLine(

);

} sc.Disconnect(

);

Console.WriteLine(Environment.NewLine + "Press any key to continue.");

Poglavlje 19: Replikacija | 475

Console.ReadKey(

);

} }

Dio rezultata prikazan je na slici 19-17.

Slika 19-17. Rezultati primjera nadziranja replikacije

RMO klase za upravljanje nadzorom i pristupom informacijama o sesiji udruživanja prikazane su u tablicama 19-12 i 19-13. Tablica 19-12. RMO klase za upravljanje nadzorom Klasa

Opis

MergeSubscriberMonitor

Predstavlja poslužiteljski nadzor pretplata na publikacije udruživanjem.

MonitorThreshold

Predstavlja mjeru praga za nadzor publikacije. Metoda EnumMonitorThresholds() klase PublicationMonitor vraća objekt ArrayList pragova nadzora definiranih na publikaciji.

PendingCommandInfo

Predstavlja informacije o neizvršenim naredbama za pretplatu na transakcijsku publikaciju. Svojstvo TransPendingCommandInfo klase PublicationMonitor vraća informacije o neizvršenim naredbama za pretplatu.

PublicationMonitor

Predstavlja nadzor publikacije od strane izdavača.

PublicationMonitorCollection

Svojstvo PublicationMonitors klase PublisherMonitor vraća objekt PublicationMonitorCollection koji sadrži informacije o nadzoru publikacije.

PublisherMonitor

Predstavlja nadzor izdavača od strane distributera.

PublisherMonitorCollection

Svojstvo PublisherMonitors klase ReplicationMonitor vraća objekt PublisherMonitorCollection koji sadrži informacije o nadzoru izdavača.

ReplicationMonitor

Predstavlja nadzor poslužitelja replikacije.

TracerToken

Predstavlja informacije o token sustavima za praćenje. Metoda EnumTracerTokens() klase PublicationMonitor vraća objekt ArrayList token sustava za praćenje koji su umetnuti u nadziranu transakcijsku publikaciju.

476 | Programiranje SQL Server 2005

Tablica 19-13. RMO klase za upravljanje informacijama o sesiji udruživanja Klasa

Opis

MergeSessionDetail

Predstavlja informacije o koraku u sesiji agenta za udruživanje. Metoda GetSessionDetails() klase SubscriberMonitor vraća polje objekata MergeSessionDetail s detaljnim informacijama o agentu za udruživanje.

MergeSessionError

Predstavlja informacije o pogreškama tijekom sesije agenta za udruživanje. Svojstvo Errors klase MergeSessionSummary vraća objekt MergeSessionSummary.

MergeSessionSummary

Predstavlja informacije o sesiji agenta za udruživanje.

Metode za obradu poslovne logike Poslovnu logiku možete izvesti u sklopovima upravljanog koda tijekom procesa sinkronizacije udruživanja. Tijekom sinkronizacije moguća je prilagođena obrada uvjeta, poput promjena podataka, konflikata i pogrešaka. Takvi se sklopovi zovu metode za obradu poslovne logike. U istu svrhu možete upotrijebiti prilagođene ili standardne COM programe za razlučivanje. RMO klase za upravljanje metodama za obradu poslovne logike i COM programima za razlučivanje opisane su u tablici 19-14. Tablica 19-14. RMO klase za upravljanje metodama za obradu poslovne logike i COM programima za razlučivanje Klasa

Opis

BusinessLogicHandler

Predstavlja poslužiteljsku registraciju sklopa upravljanog koda koji implementira metodu za obradu poslovne logike. Metoda EnumBusinessLogicHandlers() klase ReplicationServer vraća objekt ArrayList metoda za obradu poslovne logike na poslužitelju.

CustomResolver

Predstavlja registraciju COM programa za razlučivanje na poslužitelju koji se koristi za replikaciju udruživanjem. Metoda EnumCustomResolvers() klase ReplicationServer vraća objekt ArrayList prilagođenih programa za razlučivanje konflikata registriranih na SQL Server instanci.

Za dodatne informacije o implementaciji prilagođene poslovne logike s pomoću metoda za obradu poslovne logike i COM programa za razlučivanje, pogledajte Microsoft Server 2005 Books Online.

Poglavlje 19: Replikacija | 477

POGLAVLJE 20

SQL Server Analysis Services (SSAS)

SQL Server Analysis Services (SSAS) pruža mogućnosti online analitičke obrade (OLAP – Online Analytic Processing) i pronalaženja podataka kombinacijom klijentskih i poslužiteljskih komponenata. Skladište podataka (engl. data warehouse) je spremište podataka kojim se prevladavaju problemi strateške analize podataka u bazi podataka za online obradu podataka (OLTP – Online Transaction Processing). OLTP baza podataka podrška je svakodnevnoj poslovnoj aktivnosti organizacije. Konfigurirana je tako da dopušta aplikacijama brzo pisanje podataka za jednu transakciju. Skladište podataka pruža korisnicima jednostavan pristup informacijama važnim za donošenje poslovnih odluka. Dimenzijske tablice (engl. dimensional tables) čuvaju informacije koje se koriste za kategoriziranje i hijerarhijsko organiziranje informacija pohranjenih u činjeničnim tablicama. Stupce u dimenzijskim tablicama nazivamo atributima. Atributi služe za hijerarhijsko organiziranje redova u dimenzijskim tablicama na način koji najbolje odgovara poslovnim korisnicima. OLAP je kombinacija proizvoda i procesa s pomoću kojih se grupiraju velike količine heterogenih podataka i interaktivno proučavaju rezultati u dimenzionalnom modelu. Razvio se iz potrebe za interaktivnim pretraživanjem većih količina informacija iz skladišta podataka. Poput skladišta podataka, OLAP podatke prikazuje dimenzionalnim modelom. No, za razliku od skladišta podataka koji podatke najčešće pohranjuje u relacijskoj bazi podataka, OLAP koristi kocke – višedimenzionalne strukture podataka koje su hijerarhijski organizirane prema poslovnim atributima za svaku dimenziju kocke, pri čemu svaka ćelija sadrži jednu ili više mjera. Ovo poglavlje donosi pregled SSAS-a, jezika koje on koristi, programskog postavljanja upita u vezi podataka i metapodataka, te programskog upravljanja SSAS instancom i njenim objektima. Budući da je SSAS vrlo zahvalna tema, ovo će poglavlje samo pružiti uvod u ključne elemente i pojmove vezane uz SSAS. Za opširnije informacije o SSAS-u, pogledajte Microsoft SQL Server 2005 Books Online. 478

Prije početka Primjeri u ovom poglavlju koriste pokaznu SSAS bazu podataka Adventure Works DW (Standard Edition ili Enterprise Edition). Ako ju do sada niste instalirali, slijedite upute pod naslovom „Running Setup to Install AdventureWorks Sample Databases and Samples“ na stranici Microsoft SQL Server 2005 Books Online. Bazu podataka prije upotrebe morate obraditi. Desnom tipkom miša pritisnite bazu podataka u Object Exploreru i odaberite opciju Process s kontekstnog izbornika. Pogledajte SSAS baze podataka u Object Exploreru i provjerite je li baza podataka Adventure Works DW dostupna. To ćete učiniti na sljedeći način: 1. Otvorite SQL Server Management Studio. 2. Odaberite View ➝ Registered Server Types ➝ Analysis Services. 3. Desnom tipkom miša pritisnite Analysis Services server u prozoru Registered Servers i odaberite opciju Connect ➝ Object Explorer s kontekstnog izbornika. 4. Proširite čvor Databases ispod registriranog Analysis Services poslužitelja za prikaz novoinstalirane baze podataka Analysis Services Tutorial, kao što je prikazano na slici 20-1.

Slika 20-1. Prikaz baze podataka Analysis Services Tutorial u Object Exploreru

Pregled SSAS-a Skladište podataka služi kao homogeno spremište podataka iz različitih izvora. Organizirano je tako da omogućava učinkovitu analitičku obradu upita, a ne transakcija. Poslovni podaci u skladištima podataka prikazuju se dimenzionalnim modelima. Podaci se pohranjuju u dvije vrste tablica – činjenične tablice (engl. fact tables) i dimenzijske tablice (engl. dimensional tables). Činjenične tablice sadrže brojčane informacije o izvedbi dobivene iz transakcijskih podataka. Stupci u činjeničnim tablicama mogu biti mjere ili atributi. Mjera (engl. measure) je kvantitativni poslovni podatak obično izražen brojem. Atribut povezuje mjere s redom u dimenzijskoj tablici. Višedimenzionalni podaci prikazuju se strukturama koje se zovu kocke (engl. cubes). Svaka kocka predstavlja grupu podataka koju zovemo mjera i hijerarhijski je organizirana Poglavlje 20: SQL Server Analysis Services (SSAS) | 479

prema jednoj ili više dimenzija. Dimenzije organiziraju podatke unutar kocke na temelju hijerarhija i atributa, a ne tablica. Kocke se najčešće grade od podataka iz izvora međusobno povezanih podataka. Član je stavka dimenzije koja predstavlja jednu ili više instanci podataka, što nalikuje zapisima u bazi podataka. Članovi dimenzije smješteni su na različitim razinama u hijerarhiji, što omogućava lako pretraživanje i grupiranje podataka unutar kocke. Svaki atribut u definiciji hijerarhije odgovara određenoj razini u hijerarhiji, od najsažetijih do najdetaljnijih. Na primjer, dimenzija Geography organizira hijerarhiju u razine na temelju svojstava Country, State i City. Član najniže razine zove se list, a članovu ostalih razina ne-listovi. Vrijednosti više podataka koje nazivamo mjere nalaze se na sjecištima u dimenziji. Mjera je posebna dimenzija koja predstavlja podatke organizirane u skladu s drugim dimenzijama u kocki. Sve kocke moraju imati dimenziju mjere. Izračunate mjere možete stvoriti izvođenjem iz postojećih mjera.

SSAS baza podataka SSAS baza podataka spremište je svih objekata potrebnih za SSAS rješenje, kao što je opisano u tablici 20-1. Tablica 20-1. Objekti SSAS baze podataka Objekt baze podataka

Opis

Data source

Učahuruje informacije o vezi specifičnoj za pružatelja koje se koriste za pristup izvornim podacima.

Data-source view

Logički model temeljen na jednom ili više izvora podataka koji stvara sloj apstrakcije na izvornim podacima.

Cube

Višedimenzionalna struktura podataka hijerarhijski organizirana prema poslovnom atributu s jednostavnim i povratnim mehanizmom za slanje upita.

Dimension

Kombinacija hijerarhija i atributa za kategoriziranje podataka prema područjima interesa unutar kocke.

Data-mining structure

Struktura podataka koja definira domenu podataka za izradu modela za pronalaženje podataka.

Data-mining model

Podaci iz strukture za pronalaženje podataka koji se obrađuju s pomoću algoritma za zadavanje pravila i predložaka za ispunjavanje modela za pronalaženje podataka.

Role

Upravlja sigurnošću baza podataka, kocki i modela za pronalaženje podataka.

Assembly

Upravljani CLR kod koji proširuje poslovne mogućnosti jezika MDX i DMX.

SSAS jezici SSAS koristi sljedeće jezike za slanje upita i manipuliranje podacima i shemama: Multidimensional Expression (MDX) Koristi se za preradu i dobivanje podataka iz višedimenzionalnih objekata i rad s njima. 480 | Programiranje SQL Server 2005

Data Mining Extensions (DMX) Koristi se za stvaranje modela za pronalaženje podataka i rad s njima. XML for Analysis (XMLA) Besplatan protokol temeljen na SOAP-u za mrežno pristupanje standardnim višedimenzionalnim izvorima podataka, uključujući i SSAS izvore podataka. Analysis Services Scripting Language (ASSL) Koristi se za stvaranje i instaliranje SSAS objekata te rad s njima. Slijedi podrobniji opis pojedinih SSAS jezika.

Multidimensional Expressions (MDX) Relacijska baza podataka predstavlja podatke u dvodimenzionalnom obliku s pomoću stupaca i redova. Sjecište stupca i reda označava polje koje sadrži jednu vrijednost podatka. T-SQL naredba SELECT postavlja upite na relacijski organizirane podatke, dok naredba WHERE zadaje stupce i ograničava dobivene vrijednosti. MDX je skriptni jezik temeljen na iskazima koji se koristi za definiranje, dobivanje i manipuliranje višedimenzionalnim objektima i podacima. Iako je MDX sličan jeziku T-SQL, on se ne nastavlja na njega. Jezik MDX pruža sljedeće: • Data Manipulation Language (DML) za uzimanje i obradu podataka iz višedimenzionalnih objekata • Data Definition Language (DDL) za stvaranje, mijenjanje i brisanje višedimenzionalnih objekata. • Skriptni jezik za upravljanje dosegom, kontekstom i kontrolama unutar MDX skripta. • Operatore i funkcije, ugrađene i korisnički definirane, za manipuliranje podacima dobivenim iz višedimenzionalnih objekata. Svaki MDX izraz sadrži klauzulu SELECT za slanje zahtjeva za podacima, klauzulu FROM za zadavanje izvora podataka i klauzulu WHERE za filtriranje podataka. Ti elementi, zajedno s drugim ključnim riječima, služe za izdvajanje višedimenzionalnih podataka iz kocaka i manipuliranje podacima dobivenim putem ugrađenih i korisnički definiranih funkcija. MDX također sadrži DDL koji upravlja SSAS objektima. MDX vraća rezultate upita u vezi kocke u strukturi koja se zove skup ćelija, koja odgovara rezultatima koje vraćaju T-SQL iskazi postavljeni na relacijske baze podataka. Kocka sadrži kolekciju ćelija. Ćelija je određena sjecištem člana svake dimenzije kocke. Sadrži jednu mjeru zajedno s njenim svojstvima, poput tipa i formata podataka. Ntorka (tuple) je izraz koji sadrži uređenu kolekciju jednog člana svake dimenzije koja na jedinstven način definira ćeliju. Skup je uređena kolekcija n-torki.

Poglavlje 20: SQL Server Analysis Services (SSAS) | 481

Naredba SELECT koristi se u jeziku MDX za dobivanje podataka iz kocke. Jednostavna naredba SELECT sadrži klauzulu SELECT i klauzulu FROM s opcionalnom klauzulom WHERE. Sljedeći primjer izvodi MDX upit SELECT na kocki Adventure Works u bazi podataka Adventure Works DW. Desnom tipkom miša pritisnite tu bazu podataka u Object Exploreru i odaberite opciju New Query ➝ MDX s kontekstnog izbornika. Izvedite sljedeći upit kako biste dobili skup ćelija iz kocke Adventure Works: SELECT {[Measures].[Sales Amount], [Measures].[Gross Profit Margin]} ON COLUMNS, {[Product].[Product Model Categories].[Category]} ON ROWS FROM [Adventure Works] WHERE ([Sales Territory Country].[United States])

Rezultati su prikazani na slici 20-2.

Slika 20-2. Rezultati MDX upita

Prethodni primjer definira dvije osi upita – Sales Amount i Gross Profit Margin kao stupce i [Product].[Product Model Categories].[Category] kao red – i ograničava podatke dobivene iz mjere na United States. U jeziku T-SQL polja određena naredbom SELECT, zajedno s klauzulom WHERE, koriste se za ograničavanje podataka dobivenih upitom. U jeziku MDX, klauzula SELECT određuje dobivene dimenzije i članove koji se nazivaju dimenzijama osi upita. Klauzula WHERE ograničava podatke dobivene u skupu ćelija prema kriteriju za dimenzije i članove. U ovom slučaju, dobiveni podaci se nazivaju dimenzije osi rezanja. Klauzula SELECT određuje osi upita – rubove – za skup ćelija dobivenih MDX upitom. Svaka dimenzija osi povezana je s brojem, počevši od broja 0 koji se postepeno povećava bez prekida. Prvih pet osi mogu biti označene aliasima COLUMNS, ROWS, PAGES, SECTIONS i CHAPTERS. Ako u jednom upitu zadate više od dvije dimenzije, njih nećete moći vidjeti u prozoru Results u SQL Server Management Studiju. U upitu možete upotrijebiti izračunatu mjeru s pomoću klauzule WITH MEMBER, kao što je prikazano u sljedećem primjeru: WITH MEMBER [Measures].[Total Amount] AS '[Measures].[Sales Amount] + [Measures].[Tax Amount]' SELECT {[Measures].[Total Amount]} ON COLUMNS, {[Product].[Product Model Categories].[Category]} ON ROWS FROM [Adventure Works] WHERE ([Sales Territory Country].[United States])

482 | Programiranje SQL Server 2005

Rezultati su prikazani na slici 20-3.

Slika 20-3. Rezultati MDX upita s klauzulom WITH MEMBER

Data Mining Extension (DMX) Jezik DMX koristi se za stvaranje novih struktura modela za pronalaženje podataka, probnih modela i modela za upravljanje, te za predviđanje i pregledavanje modela. DMX sadrži DML i DDL iskaze, funkcije i operatore. OLE DB određuje strukturu za pohranu definicije modela za pronalaženje podataka i jezik za stvaranje, upravljanje i rad s modelima za pronalaženje podataka. S ovom strukturom možete upotrijebiti DMX za stvaranje i rad s modelima. Postoje dva tipa DMX iskaza – iskazi za manipulaciju podacima i iskazi za definiciju podataka. DMX iskazima za manipulaciju podacima možete pregledavati i stvarati predviđanja o postojećim modelima, a DMX iskazima za definiciju podataka možete stvarati, uvesti, izvesti i ispustiti modele i strukture za pretraživanje podataka iz baze podataka. Novi DMX iskaz stvorit ćete ako desnom tipkom miša pritisnete SSAS bazu podataka u Object Exploreru i odaberete opciju New Query ➝ DMX s kontekstnog izbornika. Za primjer, izvršite sljedeći DMX iskaz za manipulaciju podacima koji vraća informacije o grupi redova u shemi Forecasting modela za pretraživanje podataka. SELECT MODEL_CATALOG, MODEL_NAME, ATTRIBUTE_NAME, NODE_NAME, NODE_UNIQUE_NAME, NODE_DISTRIBUTION FROM [Forecasting].CONTENT

Rezultati su prikazani na slici 20-4.

XML for Analysis (XMLA) XMLA je XML protokol temeljen na SOAP-u koji se koristi za otvoreni pristup podacima iz bilo kojeg višedimenzionalnog izvora podataka na mreži. XMLA omogućuje postavljanje upita i pretraživanje višedimenzionalnih podataka putem Web usluga. Otvorena XMLA specifikacija sadrži dvije metode – Discover i Execute – koje obrađuju ulazne i izlazne informacije u SSAS instanci.

Poglavlje 20: SQL Server Analysis Services (SSAS) | 483

Slika 20-4. Rezultati DMX iskaza za manipulaciju podacima

Metoda Discover vraća informacije i metapodatke od Web usluge. Metoda Execute izvršava naredbe usmjerene na XMLA izvore podataka. XMLA je prirodni protokol za SQL Server 2005. Njime se služi klijentska aplikacija za komuniciranje sa SSAS instancama. SSAS koristi XMLA isključivo za komuniciranje s klijentskim aplikacijama i značajno proširuje specifikaciju XMLA 1.1. Sljedeći primjer prikazuje XMLA upit Query jednak prvom upitu koji smo upotrijebili ranije u poglavlju pod naslovom „Multidimensional Expressions (MDX)“. Stvorite novi XMLA upit u SQL Server Management Studiju tako što ćete desnom tipkom miša pritisnuti SSAS instancu i odabrati opciju New Query ➝ XMLA s kontekstnog izbornika. SELECT {[Measures].[Sales Amount], [Measures].[Gross Profit Margin]} ON COLUMNS, {[Product].[Product Model Categories].[Category]} ON ROWS FROM [Adventure Works] WHERE ([Sales Territory Country].[United States]) Adventure Works DW Standard Edition Multidimensional ClusterFormat

Rezultati su vraćeni u elementu XML dokumenta koji je djelomično prikazan na slici 20-5. U sljedećem primjeru koristi se XMLA upit Discover za vraćanje dostupnih izvora podataka za SSAS poslužitelj i informacija potrebnih za spajanje na njih: DISCOVER_DATASOURCES

484 | Programiranje SQL Server 2005



Slika 20-5. Dio rezultata dobivenih XMLA metodom Execute

Rezultati su vraćeni u elementu XML dokumenta čiji je dio prikazan na slici 20-6.

Slika 20-6. Dio rezultata dobivenih XMLA metodom Discover

Parametar Request zadaje tip informacija koje bi metoda Discover trebala vratiti. Parametar Restrictions filtrira skup dobivenih rezultata na temelju vrijednosti iz stupaca. Element Properties zadaje svojstva metode Discover.

Poglavlje 20: SQL Server Analysis Services (SSAS) | 485

Analysis Services Scripting Language (ASSL) ASSL je dijalekt SOAP poruka kojim klijentske aplikacije komuniciraju sa SSAS instancama. Sastoji se od dva dijela: • DDL koji definira SSAS instancu, bazu podataka i objekte iz baze podataka koje instanca sadrži. Koriste ga klijentske aplikacije za opisivanje, stvaranje, mijenjanje i instaliranje SSAS objekata. • Naredbeni jezik koji putem protokola XMLA šalje akcije u SSAS instancu. Za dodatne informacije o jeziku ASSL pogledajte Microsoft SQL Server Books Online.

Razvoj Analysis Service bazu podataka možete stvoriti putem SQL Server Management Studija. Desnom tipkom miša pritisnite mapu Database za Analysis Server instancu i odaberite opciju New Database s kontekstnog izbornika, nakon čega će se otvoriti dijaloški okvir New Database. Iako Analysis Services bazu podataka ne možete stvoriti putem Business Inteligence Development Studija i Visual Studija 2005, objekte već postojeće Analysis Services baze podataka možete definirati putem SQL Server Management Studija ili Business Intelligence Development Studija. SSAS rješenja možete razvijati i instalirati, te s njima upravljati putem Business Intelligence Development Studija ili SQL Server Management Studija. Business Intelligence Development Studio služi za stvaranje rješenja poslovne inteligencije – SSAS ili projekata izvješća. SQL Server Management Studio služi za upravljanje Analysis Services instancama, te za stvaranje Analysis Services objekata i rad s pomoću SSAS Scripts Project projekata, čiji opis upravo slijedi.

SSAS Project SSAS projekt sadrži definicije objekata, kao što su izvori podataka, pogledi izvora podataka, dimenzije i kocke za SSAS bazu podataka pohranjene u XML datotekama. Ti projekti čine dio SSAS rješenja u koji mogu biti uključeni i projekti drugih SQL Server komponenata. SSAS projekt koji ne ovisi o određenoj SSAS instanci možete stvoriti putem Business Intelligence Development Studija.

SSAS Scripts Project SSAS Scripts Project sadrži skripte napisane na jezicima MDX, DMX i XMLA. Omogućuje grupiranje povezanih skripta u svrhu programiranja i upravljanja. Možete ga stvoriti s pomoću SQL Server Management Studija.

486 | Programiranje SQL Server 2005

Pristup podacima s pomoću ADOMD.NET-a ADOMD.NET je .NET Framework pružatelj podataka koji klijentskim aplikacijama omogućuje pristup višedimenzionalnim izvorima podataka kakav je SSAS. ADOMD. NET koristi XMLA 1.1 za komuniciranje s izvorima podataka. Imenski prostor ADOMD.NET-a Microsoft.AnalysisServices.AdomdClient implementiran je u sklopu Microsoft.AnalysisServices.AdomsClient.dll. On je podrazumijevano smješten u mapi C:\Program Files\Microsoft. NET\ADOMD.NET\90. U ovom dijelu poglavlja objasnit ćemo kako upotrijebiti ADOMD.NET za dobivanje podataka i metapodataka od SSAS instance. Potrebna vam je referenca na sklop Microsoft.AnalysisServices.AdomdClient kako biste mogli prevesti i pokrenuti primjere.

Postavljanje upita u SSAS bazu podataka Sada ćete naučiti kako upotrijebiti ADOMD.NET za dobivanje višedimenzionalnih podataka s upravljane klijentske aplikacije. Prvi primjer prikazuje kako upotrijebiti ADOMD.NET pružatelj podataka za dobivanje podataka s kocke AdventureWorks s pomoću MDX upita koji ispunjava čitač podataka: using System; using System.Data; using Microsoft.AnalysisServices.AdomdClient; class Program { static void Main(string[] args) { AdomdConnection conn = new AdomdConnection( "Data Source=localhost;Catalog=Adventure Works DW Standard Edition"); conn.Open( ); string commandText = "SELECT {[Measures].[Sales Amount], " + "[Measures].[Gross Profit Margin]} ON COLUMNS, " + "{[Product].[Product Model Categories].[Category]} ON ROWS " + "FROM [Adventure Works] " + "WHERE ([Sales Territory Country].[United States])"; AdomdCommand cmd = new AdomdCommand(commandText, conn); AdomdDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); // Stvara redove u DataReader-u while (dr.Read( )) { for (int i = 0; i < dr.FieldCount; i++) Console.Write(dr[i] + (i == dr.FieldCount - 1 ? "" : ", ")); Console.WriteLine(

);

}

Poglavlje 20: SQL Server Analysis Services (SSAS) | 487

dr.Close( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati prikazani na slici 20-7 odgovaraju rezultatima dobivenim izvođenjem istog upita u prethodnom dijelu ovom poglavlju pod naslovom „Multidimensional Expressions (MDX)“.

Slika 20-7. Rezultati ADOMD.NET upita

Klasa AdomdConnection predstavlja vezu s izvorom višedimenzionalnih podataka. Klasa AdomdDataReader dobiva tok podataka (samo za čitanje i prosljeđivanje) s izvora podataka. Slična je drugim klasama čitača podataka u ADO.NET-u. Tijekom izvođenja koda stižu tokovi rezultata, što znači da podacima možete pristupiti čim je prvi red dostupan i ne morate čekati na ukupan rezultat. Objekt AdomdDataReader stvoren je pozivanjem metode Execute() ili ExecuteReader() objekta AdomdCommand. Metoda Read() objekta AdomdDataReader vraća sljedeći red rezultata. Klasa CellSet u ADOMD.NET-u skup je ćelija u memoriji kojim se može manipulirati dok nije povezan s izvorom podataka i koji se kasnije može sinkronizirati s izvorom podataka. Klasa CellSet podudarna je s klasom DataSet u ADO.NET-u. Sljedeći primjer prikazuje kako se klasom CellSet manipulira podacima koji su izdvojeni iz kocke Adventure Works: using System; using System.Data; using Microsoft.AnalysisServices.AdomdClient; class Program { static void Main(string[] args) { AdomdConnection conn = new AdomdConnection( "Data Source=localhost;Catalog=Adventure Works DW Standard Edition"); conn.Open( ); string commandText = "SELECT {[Measures].[Sales Amount], " + "[Measures].[Gross Profit Margin]} ON COLUMNS, " + "{[Product].[Product Model Categories].[Category]} ON ROWS " + "FROM [Adventure Works] " +

488 | Programiranje SQL Server 2005

"WHERE ([Sales Territory Country].[United States])"; AdomdCommand cmd = new AdomdCommand(commandText, conn); CellSet cs = cmd.ExecuteCellSet( ); // Iterira kroz položaje redova i stupaca foreach (Position pRow in cs.Axes[1].Positions) { foreach (Position pCol in cs.Axes[0].Positions) { // Dobiva formatiranu vrijednost na temelju položaja redova i stupaca Console.Write( cs[pCol.Ordinal, pRow.Ordinal].FormattedValue + ", "); } Console.WriteLine( ); } conn.Close(

);

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 20-8.

Slika 20-8. Rezultati primjera s ADOMD.NET klasom CellSet

Rezultati odgovaraju onima dobivenim izvođenjem prvog upita u prethodnom dijelu poglavlja pod naslovom „Multidimensional Expressions (MDX)“. Klasa CellSet sadrži kolekciju objekata Cell koji su hijerarhijski organizirani prema n-torkama i osima zadanim svojstvima Axes i FilterAxis. Ćelijama u skupu ćelija pristupa se putem indeksa. Par indeksa odgovara stupcu i redu, a polje indeksa dimenzijama skupa ćelija s više od dvije dimenzije. Sljedeći primjer vraća skup ćelija u obliku objekta XmlReader i koristi objekt XmlDocument za prikaz sadržaja objekta XmlReader na konzoli: using System; using System.Data; using System.Xml; using Microsoft.AnalysisServices.AdomdClient;

Poglavlje 20: SQL Server Analysis Services (SSAS) | 489

class Program { static void Main(string[] args) { AdomdConnection conn = new AdomdConnection( "Data Source=localhost;Catalog=Adventure Works DW Standard Edition"); conn.Open( ); string commandText = "SELECT {[Measures].[Sales Amount], " + "[Measures].[Gross Profit Margin]} ON COLUMNS, " + "{[Product].[Product Model Categories].[Category]} ON ROWS " + "FROM [Adventure Works] " + "WHERE ([Sales Territory Country].[United States])"; AdomdCommand cmd = new AdomdCommand(commandText, conn); XmlReader xr = cmd.ExecuteXmlReader( ); XmlDocument xd = new XmlDocument( ); xd.Load(xr); Console.WriteLine(xd.InnerXml); xr.Close( ); conn.Close( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Podaci dobiveni u XML dokumentu prikazani su na slici 20-9.

Slika 20-9. Rezultati primjera s ADOMD.NET objektom XmlDocument

Metoda ExecuteXmlReader() klase AdomdCommand vraća skup ćelija u obliku objekta XmlReader. Isto kao i u primjeru pod naslovom „XML for Analysis (XMLA)“, rezultati su vraćeni u elementu XML dokumenta.

490 | Programiranje SQL Server 2005

Dobivanje informacija o shemi Skup redova u shemi sadrži metapodatke, te informacije o nadzoru i podršci iz SSAS instance. U ovom dijelu poglavlja naučit ćete kako upotrijebiti ADOMD.NET za dobivanje informacija o shemi s upravljane klijentske aplikacije. Sljedeći primjer prikazuje kako se s pomoću klase AdomdDataReader mogu dobiti informacije o skupu ćelija u shemi: using System; using System.Data; using Microsoft.AnalysisServices.AdomdClient; class Program { static void Main(string[] args) { AdomdConnection conn = new AdomdConnection( "Data Source=localhost;Catalog=Adventure Works DW Standard Edition"); conn.Open( ); string commandText = "SELECT {[Measures].[Sales Amount], " + "[Measures].[Gross Profit Margin]} ON COLUMNS, " + "{[Product].[Product Model Categories].[Category]} ON ROWS " + "FROM [Adventure Works] " + "WHERE ([Sales Territory Country].[United States])"; AdomdCommand cmd = new AdomdCommand(commandText, conn); AdomdDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); // Vraća informacije o shemi u tablicu DataTable dt = dr.GetSchemaTable( ); foreach (DataRow row in dt.Rows) { foreach (DataColumn col in dt.Columns) Console.WriteLine(col.ColumnName + " = " + row[col].ToString( Console.WriteLine(

));

);

} dr.Close(

);

Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Dio rezultata prikazan je na slici 20-10.

Poglavlje 20: SQL Server Analysis Services (SSAS) | 491

Slika 20-10. Dio rezultata primjera uzimanja informacija o skupu ćelija u shemi

Metoda GetSchemaTable() klase AdomdDataReader vraća objekt DataTable koji sadrži informacije o skupu ćelija u shemi. Svaki red u objektu DataTable odgovara stupcu u skupu ćelija. Stupci objekta DataTable sadrže svojstva stupca u skupu ćelija. Povezivanjem sa SSAS instancom također se mogu dobiti informacije o shemi za objekte u SSAS instanci, kao što je prikazano u sljedećem primjeru: using System; using System.Data; using Microsoft.AnalysisServices.AdomdClient; class Program { static void Main(string[] args) { AdomdConnection conn = new AdomdConnection( "Data Source=localhost;Catalog=Analysis Services Tutorial"); conn.Open( ); DataSet ds = conn.GetSchemaDataSet(AdomdSchemaGuid.Dimensions, null); DataTable dt = ds.Tables[0]; foreach(DataRow row in dt.Rows) { foreach (DataColumn col in dt.Columns) Console.WriteLine(col.ColumnName + " = " + row[col].ToString( )); Console.WriteLine( ); } conn.Close( );

492 | Programiranje SQL Server 2005

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Dio rezultata prikazan je na slici 20-11.

Slika 20-11. Dio rezultata primjera dobivanja informacija o shemi

Metoda GetSchemaDataSet() klase AdomdConnection vraća informacije o shemi objekata koji su zadani argumentima metode. U prethodnom primjeru upotrijebljena je preopterećena metoda GetSchemaDataSet() koja uzima dva argumenta. Prvi argument GUID identifikatorom određuje tip objekta kao statičko polje klase AdomdSchemaGuid. Drugi argument sadrži polje ograničenja koje vraća informacije za podgrupu objekata.

Upravljanje SSAS objektima SSAS podržava API sučelja za upravljanje koja služe za stvaranje, prilagođavanje i obradu SSAS objekata, te upravljanje SSAS instancama. Sada ćemo se osvrnuti na dvije grupe objekata: Analysis Management Objects (AMO) i Decision Support Objects (DSO).

Analysis Management Objects (AMO) AMO je .NET Framework sklop s hijerarhijom klasa namijenjenim programskom stvaranju, prilagođavanju i obradi SSAS objekata, te upravljanju SSAS instancama. Imenski prostor AMO objekata Microsoft.AnalysisServices implementiran je u sklopu Microsoft.AnalysisServices.dll koji je podrazumijevano smješten u mapi C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies.

Poglavlje 20: SQL Server Analysis Services (SSAS) | 493

Sljedeći primjer prikazuje kako se s pomoću AMO objekata dobivaju informacije o kolekcijama ključeva u SSAS bazi podataka, u ovom slučaju, bazi podataka Adventure Works DW. Za prevođenje i pokretanje primjera, potrebna vam je referenca na sklop Microsoft.Analysis Services. using System; using System.Data; using Microsoft.AnalysisServices; class Program { static void Main(string[] args) { Server server = new Server( ); server.Connect( "Data Source=localhost;Catalog=Adventure Works DW Standard Edition"); Database db = server.Databases["Adventure Works DW Standard Edition"]; Console.WriteLine("DATA SOURCES:"); foreach (DataSource ds in db.DataSources) Console.WriteLine(ds.Name); Console.WriteLine(Environment.NewLine + "DATA SOURCE VIEWS:"); foreach (DataSourceView dsv in db.DataSourceViews) Console.WriteLine(dsv.Name); Console.WriteLine(Environment.NewLine + "CUBES:"); foreach (Cube c in db.Cubes) Console.WriteLine(c.Name); Console.WriteLine(Environment.NewLine + "DIMENSIONS:"); foreach (Dimension d in db.Dimensions) Console.WriteLine(d.Name); Console.WriteLine(Environment.NewLine + "MINING STRUCTURES:"); foreach (MiningStructure ms in db.MiningStructures) Console.WriteLine(ms.Name); Console.WriteLine(Environment.NewLine + "ROLES:"); foreach (Role r in db.Roles) Console.WriteLine(r.Name); Console.WriteLine(Environment.NewLine + "ASSEMBLIES:"); foreach (Assembly a in db.Assemblies) Console.WriteLine(a.Name); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Rezultati su prikazani na slici 20-12. 494 | Programiranje SQL Server 2005

Slika 20-12. Rezultati primjera s AMO objektima

Klasa Server je najviše pozicionirana klasa u hijerarhiji AMO klasa i predstavlja SSAS implementaciju. Pozovite metodu Connect() klase Server kako biste se povezali sa SSAS instancom. Svojstvo Databases klase Server sadrži kolekciju baza podataka u SSAS instanci u obliku Database objekata. Klasa Database sadrži kolekciju svojstava koja pruža pristup kolekcijama objekata u bazi podataka, uključujući i izvore podataka, poglede izvora podataka, kocke, dimenzije, strukture za pronalaženje podataka, uloge i sklopove. Navedene kolekcije i njihovi objekti sadrže metode i svojstva za postavljanje upita i manipuliranje objektima iz baze podataka.

Decision Support Objects (DSO) DSO je COM biblioteka namijenjena stvaranju aplikacija za programsko upravljanje SSAS objektima. Postojeće aplikacije trebali biste premjestiti u AMO i koristiti AMO umjesto DSO objekata, budući da će DSO biti uklonjen iz sljedeće inačice SQL Servera. Za dodatne informacije o DSO objektima, pogledajte Microsoft SQL Server 2005 Books Online.

Poglavlje 20: SQL Server Analysis Services (SSAS) | 495

POGLAVLJE 21

SQL Server Mobile Edition

Microsoft SQL Server Mobile Edition (SQL Server Mobile) nastavak je inačice Microsoft SQL Server 2000 Windows CE Edition 2.0 (SQL Server CE). Proširuje poslovna rješenja na aplikacije za prijenosne uređaje te pruža funkcionalnost relacijske baze podataka u malom i dosljedan programski model. SQL Server Mobile najčešće se koristi na uređajima koji koriste Windows CE 5.0, Windows XP Tablet PC Edition, Mobile Pocket PC i Mobile Smartphone. No, možete ga pokrenuti i na klasičnom Windows operacijskom sustavu u svrhu programiranja i testiranja. SQL Server Mobile integriran je s .NET Compact Frameworkom – dijelom .NET Frameworka koji pruža okolinu nezavisnu o hardveru za pokretanje aplikacija na računalnim uređajima s ograničenim resursima. SQL Server Mobile možete instalirati kao dio aplikacije Microsoft .NET Compact Framework ili nezavisno na pametnom uređaju. .NET Compact Framework Data Provider za SQL Server Mobile u imenskom prostoru System. Data.SqlServerCe pruža pristup podacima iz .NET Compact Framework aplikacija. Pristupanje udaljenim podacima i replikacija udruživanjem podataka šalju podatke sa SQL Servera u SQL Server Mobile na podržanim uređajima. Tim podacima možete manipulirati dok niste spojeni na mrežu i sinkronizirati ih s poslužiteljem kada se spojite na mrežu. SQL Server Mobile baza podataka smještena je u datoteci s nastavkom imena .sdf. Može biti velika najviše 4GB. Uređaji koji pokreću SQL Server Mobile, kao i samostalna računala koja pokreću SQL Server Management Studio, mogu pristupati podacima i mijenjati ih. SQL Server Mobile podržava pristup bazama podataka od strane više korisnika. Putem SQL Server Management Studija možete upravljati SQL Server Mobile bazom podataka. Mogućnost upravljanja SQL Server Mobilea u sklopu SQL Server Management Studija ograničena je na skupinu funkcija za upravljanje SQL Server 2005 bazom podataka. Mnogi se zadaci ne mogu izvesti korištenjem grafičkih alata, već samo T-SQL naredbi. SQL Server Mobile ne podržava SMO (SQL Server Management Objects) objekte. 496

Okolina SQL Server Mobile sadrži klijentsku okolinu koja ugošćuje aplikaciju i pohranjuje podatke izvan mreže te poslužiteljsku okolinu koja služi kao glavno spremište podataka. Tehnologije za povezivanje, čiji opis upravo slijedi, povremeno sinkroniziraju podatke između klijentskih i poslužiteljskih okolina.

Klijent Klijentska okolina sadrži instancu SQL Server Mobilea i klijentsku aplikaciju razvijenu s pomoću .NET Compact Frameworka. SQL Server Mobile klijentska okolina sadrži sljedeće: • Alate za postavljanje, konfiguriranje, pristupanje i mijenjanje podataka. • API sučelja za izradu aplikacija koje će pristupati SQL Server Mobile podacima. • Procesor upita koji gramatički analizira, prevodi, postavlja i izvodi SQL izraze, upite i naredbe. SQL Server Mobile podržava SQL gramatiku jezika T-SQL koji je podržan u SQL Serveru 2005. • SQL Server Mobile Database Engine za upravljanje pohranjenim podacima i pronalaženje umetnutih, obrisanih i mijenjanih zapisa. Služi kao podrška replikaciji i povezivanju s pristupom udaljenim podacima (RDA, Remote Data Access). • SQL Server Mobile Client Agent, koji podržava povezivanje implementiranjem objekata Replication, RemoteDataAccess i Engine te pruža programsku kontrolu povezivanja na SQL Server.

Server Poslužiteljska okolina sadrži sljedeće: • SQL Server 2005, koji pruža pohranu, upravljanje i analizu podataka na strani poslužitelja. • SQL Server Mobile Server Agent za obradu zahtjeva za prijenos HTTP podataka i shema od strane SQL Server Mobile Client Agenta. • Internet Information Services (IIS) s protokolom kojim se klijentski uređaji povezuju na poslužitelje za prijenos i razmjenu podataka putem replikacije ili RDA.

Preduvjeti Sljedeći programi potrebni su za razvoj SQL Server Mobile aplikacija: • Windows 2000 SP4 ili noviji, Windows XP SP1 ili noviji, ili Windows Server 2003. • Visual Studio 2005 u razvojnoj okolini.

Poglavlje 21: SQL Server Mobile Edition | 497

• .NET Framework 2.0 u poslužiteljskoj okolini. • Microsoft ActiveSync 3.7.1 ili noviji u razvojnoj ili poslužiteljskoj okolini. ActiveSync možete besplatno preuzeti sa Microsoftovih stranica. Ako koristite Windows XP SP2, omogućite HTTP pristup postavljanjem Windows vatrozida na sljedeći način: 1. Odaberite Control Panel ➝ Windows Firewall. 2. Odaberite karticu Advanced u dijaloškom okviru Windows Firewall. 3. Pritisnite gumb Settings u okviru Network Connection Settings. 4. Odaberite karticu Services. 5. Potvrdite polje Web Server (HTTP). 6. Pritisnite gumb OK u oba dijaloška okvira za potvrdu unesenih promjena.

Programiranje SQL Server Mobile rješenja Klase SQL Server Mobile pružatelja podataka u imenskom prostoru Microsoft.Data. Sql ServerCe pružaju programski pristup SQL Server Mobile bazama podataka s upravljane aplikacije pokrenute na podržanom uređaju. Te su klase slične klasama u .NET pružatelju podataka za SQL Server. S pomoću njih se možete povezati sa SQL Server Mobile bazom podataka, izvršiti naredbe, dobiti i osvježiti skupove rezultata, raditi s podacima izvan mreže i sinkronizirati lokalno ažuriranje s bazom podataka. SQL Server Mobile pružatelj podataka ne podržava skupne upite i ugniježđene transakcije. Sljedeći dio poglavlja donosi opis SQL Server Mobile klasa i primjere koji prikazuju kako se one koriste. Za prevođenje i pokretanje primjera potrebna vam je referenca na sklop System.Data.SqlServerCe. Referencu ćete dodati ako odaberete Microsoft SQL Mobile na kartici .NET u dijaloškom okviru Add Reference u Visual Studiju 2005.

Stvaranje baze podataka Sljedeći primjer stvara bazu podataka TestDb.sdf: using System; using System.Data.SqlServerCe; class Program { static void Main(string[] args) { SqlCeEngine engine = new SqlCeEngine( "data source=TestDb.sdf; database password=password;"); engine.CreateDatabase( ); engine.Dispose( );

498 | Programiranje SQL Server 2005

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Izvođenjem ovog primjera stvara se mobilna baza podataka (sdl. datoteka) u mapi bin\Debug (ako prevodite inačicu primjera za uklanjanje pogrešaka). S ovom bazom podataka možete se povezati u SQL Server Management Studiju. U tu svrhu, s glavnog izbornika odaberite opciju View ➝ Registered Server Types ➝ SQL Server Mobile. Desnom tipkom miša pritisnite SQL Server Mobile Edition Databases u prozoru Registered Servers i odaberite opciju Server Registration s kontekstnog izbornika za otvaranje dijaloškog okvira New Server Registration. Popunite polje datoteke Database punom putanjom do datoteke TestDb.sdf i polje Password lozinkom. Pritisnite gumb Save za registraciju mobilne baze podataka.

Niz znakova lokalne veze koji može biti zadan ili u konstruktoru klase SqlCeEngine ili svojstvom LocalConnectionString, sadrži svojstva opisana u tablici 21-1. Tablica 21-1. Svojstva niza znakova veze za SQL Server Mobile Svojstvo

Opis

Autoshrink threshold

Dozvoljeni postotak slobodnog prostora u bazi podataka prije automatskog sažimanja. Podrazumijevana vrijednost je 60. Vrijednost 100 onemogućuje sažimanje.

data source

Ime datoteke (.sdf ) SQL Server Mobile baze podataka. Može zadati i apsolutnu putanju.

database password

Lozinka za bazu podataka s najviše 40 znakova. Ako nije zadana, podrazumijeva se da je nema. Lozinka za bazu podataka se ne može obnoviti ako ju izgubite.

default lock timeout

Vrijeme čekanja transakcije na zaključavanje mjereno u milisekundama. Podrazumijevana vrijednost je 2000.

default lock escalation

Broj zaključavanja transakcije prije nego se proširi s reda na stranicu ili sa stranice na tablicu. Podrazumijevana vrijednost je 100.

encrypt database

Logička vrijednost kojom se utvrđuje je li baza podataka šifrirana. Lozinku trebate zadati kako biste omogućili šifriranje baze podataka. Podrazumijevana vrijednost je false.

flush interval

Interval, mjeren u sekundama, prije prebacivanja svih izvedenih transakcija na disk. Podrazumijevana vrijednost je 10.

locale identifier

Identifikator lokacije (LCID) koji se koristi s bazom podataka.

max buffer size

Maksimalna količina memorije u Kb koju koristi SQL Server Mobile prije spremanja promjena podataka na disk. Podrazumijevana vrijednost je 640.

max database size

Maksimalna veličina datoteke u bazi podataka mjerena u MB. Podrazumijevana vrijednost je 128.

Ako izgubite lozinku za bazu podataka, nećete moći povratiti podatke.

Poglavlje 21: SQL Server Mobile Edition | 499

Tablica 21-1. Svojstva niza znakova veze za SQL Server Mobile (nastavak) Svojstvo

Opis

mode

Zadaje način otvaranje baze podataka. Opcije su sljedeće: Read Write Otvara bazu podataka tako da ju drugi procesi mogu otvoriti i mijenjati. Read Only Otvara kopiju baze podataka koja se može samo čitati. Exclusive Otvara bazu podataka tako da ju drugi procesi ne mogu otvoriti i mijenjati. Shared Read Otvara bazu podataka tako da ju drugi procesi mogu samo čitati. Podrazumijevani režim je Read Write.

temp file directory

Lokacija privremene baze podataka. Ako privremena baza podataka nije zadana, podaci se privremeno pohranjuju na izvoru podataka.

temp file max size

Maksimalna veličina privremene datoteke u bazi podataka, mjerena u MB. Podrazumijevana vrijednost je 128.

Klase za upravljanje SQL Server Mobile bazama podataka i pristup njihovim podacima opisane su u tablici 21-1. Klase za pristup podacima slične su klasama SQL Server pružatelja podataka, od kojih se razlikuju jedino po tome što imaju prefiks SqlCe, a ne Sql – na primjer, SqlCeConnection umjesto SqlConnection. Tablica 21-2. Klase SQL Server Mobile pružatelja događaja Klasa

Opis

SqlCeCommand

T-SQL naredba koja se izvodi u bazi podataka.

SqlCeCommandBuilder

Automatski stvara naredbe s jednom tablicom na temelju upita SELECT. Također ažurira bazu podataka promjenama u objektima DataTable i DataSet s pomoću adaptera podataka.

SqlCeConnection

Veza sa SQL Server Mobile bazom podataka.

SqlCeDataAdapter

Ispunjava objekte DataTable i DataSet i ažurira bazu podataka promjenama nastalim izvan mreže.

SqlCeDataReader

Pruža pristup skupu rezultata u obliku toka s redovima podataka za prosljeđivanje.

SqlCeEngine

Predstavlja SQL Server Mobile Database Engine. Koristi se za stvaranje i mijenjanje SQL Server Mobile baze podataka te upravljanje s njom.

SqlCeError

Informacije o određenom objektu SqlCeException dobivenom od SQL Server Mobile pružatelja podataka.

SqlCeErrorCollection

Kolekcija svih pogrešaka koje stvara SQL Server Mobile pružatelj podataka.

SqlCeException

Iznimka izbačena prilikom vraćanja upozorenja ili pogreške sa SQL Server Mobile baze podataka od strane pružatelja.

SqlCeFlushFailureEventArgs

Podaci o događaju neuspješnog spremanja (FlushFailure).

SqlCeFlushFailureEventHandler

Metoda za obradu događaja FlushFailure.

SqlCeInfoMessageEventArgs

Podaci o događaju upozorenja (InfoMessage) iz baze podataka.

500 | Programiranje SQL Server 2005

Tablica 21-2. Klase SQL Server Mobile pružatelja događaja (nastavak) Klasa

Opis

SqlCeInfoMessageEventHandler

Metoda za obradu događaja InfoMessage.

SqlCeLockTimeoutException

Iznimka izbačena prilikom prekida zaključavanja.

SqlCeParameter

Parametar do SQL naredbe (SqlCeCommand).

SqlCeParameterCollection

Kolekcija objekata parametara (SqlCeParameter) i njihovih preslika na stupce.

SqlCeRemoteDataAccess

Instanca za pristup udaljenim podacima.

SqlCeReplication

Instanca replikacije.

SqlCeResultSet

Kursor s mogućnošću ažuriranja, povezivanja i pomicanja.

SqlCeRowUpdatedEventArgs

Podaci za događaj ažuriranog reda (RowUpdated) koji se javlja kada je red u bazi podataka ažuriran s pomoću adaptera podataka.

SqlCeRowUpdatedEventHandler

Metoda za obradu događaja RowUpdated.

SqlCeRowUpdatingEventArgs

Podaci za događaj ažuriranja reda (RowUpdating) koji se javlja prije nego što je red u bazi podataka ažuriran s pomoću adaptera podataka.

SqlCeRowUpdatingEventHandler

Metoda za obradu događaja RowUpdating.

SqlCeTransaction

SQL transakcija.

SqlCeTransactionInProgressException

Iznimka stvorena prilikom pokušaja mijenjanja baze podataka tijekom transakcije.

SqlCeUpdatableRecord

Red podataka koji se može ažurirati iz baze podataka. SqlCeResult sadrži kolekciju objekata SqlCeUpdatableRecord.

Održavanje baze podataka Javna svojstva i metode klase SqlCeEngine za stvaranje i upravljanje SQL Server Mobile bazama podataka opisane su u tablici 21-3. Tablica 21-3. Konstruktori, svojstva i metode klase SqlCeEngine Konstruktor

Opis

SqlCeEngine

Uzima opcionalan argument koji zadaje niz veze do SQL Server Mobile baze podataka.

Svojstvo LocalConnectionString

Niz veze do SQL Server baze podataka. Svojstva niza veze opisana su u tablici 21-1.

Metode Compact()

Oslobađa prostor u datoteci baze podataka i mijenja svojstva baze podataka zadana u nizu lokalne veze.

CreateDatabase()

Stvara novu bazu podataka.

Repair()

Pokušava popraviti oštećenu bazu podataka.

Shrink()

Oslobađa prostor u datoteci baze podataka.

Verify()

Potvrđuje da baza podataka nije oštećena. Poglavlje 21: SQL Server Mobile Edition | 501

Sljedeći primjeri prikazuju kako se s pomoću klase SqlCeEngine održava SQL Server Mobile baza podataka.

Potvrđivanje i popravljanje Sljedeći primjer potvrđuje da baza podataka nije oštećena. Ako je baza podataka oštećena, onda je popravlja. using System.Data.SqlServerCe; class Program { static void Main(string[] args) { // Povezivanje se s bazom podataka SqlCeEngine engine = new SqlCeEngine( "data source=TestDb.sdf; database password=password;"); // Provjerava je li baza podataka oštećena i ako jest popravlja ju if (!engine.Verify( )) { engine.Repair(null, RepairOption.RecoverCorruptedRows); Console.WriteLine("Database repaired."); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Ovaj se primjer povezuje na SQL Server Mobile bazu podataka koju smo stvorili u prethodnom primjeru. Metoda Verify() klase SqlCeEngine provjerava kontrolni zbroj svake stranice u bazi podataka i utvrđuje je li datoteka baze podataka oštećena. Oštećena datoteka baze podataka vraća vrijednost false. Popravlja se metodom Repair() klase SqlCeEngine. Metoda Repair() uzima jedan argument enumeracije RepairOption: DeleteCorruptedRows ili RecoverCorruptedRows. Opcija RecoverCorruptedRows pokušava spasiti podatke s oštećenih stranica. Međutim, oporavljeni podaci također mogu biti oštećeni. Opcija DeleteCorruptedRows vraća podatke koji nisu oštećeni. No, budući da briše sve oštećene podatke, gubi se znatna količina podataka.

Oslobađanje prostora Unutrašnja struktura SQL Server Mobile baze podataka tijekom vremena postaje fragmentirana, što uzrokuje gubitak prostora. Izgubljeni prostor vratiti ćete metodom Shrink() ili Compact() klase Engine: engine.Shrink(

);

Metoda Shrink() klase SqlCeEngine oslobađa izgubljeni prostor u sdl. datoteci. Metoda Compact() opisana je pod sljedećim naslovom.

502 | Programiranje SQL Server 2005

Bazu podataka možete konfigurirati tako da se automatski sažima pri svakom prelasku praga fragmentacije. To ćete učiniti postavljanjem svojstva autoshrink threshold (opisano je u tablici 21-1) u svojstvu LocalConnectionString objekta SqlCeEngine.

Mijenjanje svojstava Metoda Compact() klase SqlCeEngine, poput metode Shrink(), oslobađa prostor u bazi podataka. No, za razliku od metode Shrink(), metoda Compact() nudi mogućnost mijenjanja postavki povezivanja s bazom podataka putem opcionalnih argumenata. Na primjer, sljedeća naredba mijenja lozinku baze podataka u newPassword: engine.Compact("database password=newPassword;");

Stvaranje podrške i obnavljanje Budući da se SQL Server Mobile temelji na datotekama, neke uobičajene zadatke vezane uz bazu podataka možete izvesti putem sustava datoteka. Arhivu baze podataka možete stvoriti zatvaranjem svih otvorenih veza i kopiranjem sdl. datoteke. Na sličan način možete i obnoviti bazu podataka kopiranjem sdl. datoteke iz arhive na njenu izvornu lokaciju. Bazu podataka možete obrisati zatvaranjem svih veza i brisanjem sdl. datoteke s pomoću API sučelja u sustavu datoteka. Na primjer, sljedeća naredba briše bazu podataka TestDb.sdf koju smo prethodno stvorili: System.IO.File.Delete("TestDb.sdf");

Stvaranje, mijenjanje i ispuštanje objekata iz baze podataka Budući da SQL Server Mobile ne podržava SMO, tablicu ćete stvoriti izvođenjem TSQL DDL naredbi s pomoću metode ExecuteNonQuery() klase SqlCeCommand. Sljedeći primjer stvara tablicu TestTable s dva stupca: using System; using System.Data.SqlServerCe; class Program { static void Main(string[] args) { SqlCeConnection conn = new SqlCeConnection( "data source=TestDb.sdf; database password=password;"); conn.Open( ); SqlCeCommand cmd = new SqlCeCommand( "CREATE TABLE TestTable(ID int, Description nvarchar(100))", conn); cmd.ExecuteNonQuery( );

Poglavlje 21: SQL Server Mobile Edition | 503

conn.Close(

);

Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

U primjeru su upotrijebljeni objekti SqlCeConnection i SqlCeCommand koji izvode T-SQL naredbu CREATE TABLE izdanu za SQL Server Mobile bazu podataka. U SQL Serveru za isti zadatak koriste se objekti SqlConnection i SqlCommand.

Čitanje i ažuriranje podataka Sljedeći primjer dodaje dva reda u SQL Server Mobile tablicu TestTable koju smo stvorili u prethodnom primjeru. Zatim čita nove redove iz baze podataka i prikazuje ih na konzoli. Upite izdane u vezi SQL Server Mobile baze podataka možete izvesti s pomoću klasa SQL Server Mobile baze podataka. Na sličan način koristi se SQL Server pružatelj podataka za SQL Server 2005 bazu podataka. U ovom primjeru upotrijebljen je objekt SqlCeAdapter koji: • Vraća sadržaj tablice TestTable u objektu DataTable. Budući da TestTable ne sadrži redove, ne sadrži ih ni objekt DataTable. • Dodaje dva reda objektu DataTable. • Ažurira SQL Server Mobile bazu podataka s novim redovima. Zatim se koristi objekt SqlCeDataReader za prikaz redova koji su dodani u tablicu baze podataka. using System; using System.Data; using System.Data.SqlServerCe; class Program { static void Main(string[] args) { // Stvara adapter podataka i konfigurira graditelja naredbi // za ažuriranje baze podataka SqlCeDataAdapter da = new SqlCeDataAdapter( "SELECT * FROM TestTable", "data source=TestDb.sdf; database password=password;"); SqlCeCommandBuilder cb = new SqlCeCommandBuilder(da); // Vraća rezultate iz baze podataka u DataTable DataTable dt = new DataTable( ); da.Fill(dt);

504 | Programiranje SQL Server 2005

// Dodaje dva reda u DataTable dt.Rows.Add(new object[] { 1, "Row 1 description" }); dt.Rows.Add(new object[] { 2, "Row 2 description" }); // Ažurira bazu podataka s novim redovima da.Update(dt); // Stvara vezu za čitač podataka SqlCeConnection conn = new SqlCeConnection( "data source=TestDb.sdf; database password=password;"); conn.Open( ); // Stvara čitač podataka SqlCeCommand cmd = new SqlCeCommand( "SELECT * FROM TestTable", conn); SqlCeDataReader dr = cmd.ExecuteReader(

);

// Prikazuje redove na konzoli while (dr.Read( )) Console.WriteLine(dr["ID"] + ", " + dr["Description"]); // Izvodi čiščenje dr.Close( ); conn.Close( ); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey( ); } }

Izlaz na konzoli prikazan je na slici 21-1.

Slika 21-1. Rezultati čitanja i ažuriranja podataka

Obrada pogrešaka Objekt SqlCeException stvara se kada pružatelj podataka SQL Server Mobile naiđe na pogrešku. Te se iznimke obrađuju na uobičajen način. Sljedeći primjer hvata objekt SqlCeException koji se javlja zbog slanja upita u vezi nepostojeće tablice i vraća detalje o iznimci: using System; using System.Data.SqlServerCe; class Program

Poglavlje 21: SQL Server Mobile Edition | 505

{ static void Main(string[] args) { SqlCeConnection conn = new SqlCeConnection( "data source=TestDb.sdf; database password=password;"); conn.Open( ); SqlCeCommand cmd = new SqlCeCommand("SELECT * FROM Table1", conn); try { SqlCeDataReader dr = cmd.ExecuteReader( ); } catch (SqlCeException ex) { foreach (SqlCeError sce in ex.Errors) { Console.WriteLine("HResult = {0:X}", sce.HResult); Console.WriteLine("Message = {0}", sce.Message); Console.WriteLine("NativeError = {0:X}", sce.NativeError); Console.WriteLine("Source = {0}", sce.Source); Console.WriteLine( ); } } finally { conn.Close( ); } Console.WriteLine("Press any key to continue."); Console.ReadKey( ); } }

Rezultat konzole prikazan je na slici 21-2.

Slika 21-2. Rezultati obrade pogreške

Klasa SqlCeException nasljeđuje od klase Exception i dodaje nekoliko svojstava opisanih u tablici 21-4.

506 | Programiranje SQL Server 2005

Tablica 21-4. Svojstva klase SqlCeException Svojstvo

Opis

Errors

Kolekcija SqlCeError objekata s detaljima o iznimci koju stvara SQL Server Mobile pružatelj podataka.

HResult

HRESULT – numerička vrijednost koja se odnosi na određenu iznimku. Odgovara vrijednosti svojstva HResult prvog objekta SqlCeError u kolekciji SqlCeErrorCollection kojeg vraća svojstvo Errors.

InnerException

Naslijeđeno od klase Exception.

Message

Opis prvog objekta SqlCeError u kolekciji SqlCeErrorCollection kojeg vraća svojstvo Errors.

NativeError

Broj izvorne pogreške prvog objekta SqlCeError u kolekciji SqlCeErrorCollection kojeg vraća svojstvo Errors.

Source

Ime pružatelja koji uzrokuje iznimku. Odgovara vrijednosti svojstva Source prvog objekta SqlCeError u kolekciji SqlCeErrorCollection kojeg vraća svojstvo Error.

StackTrace

Naslijeđeno od klase Exception.

Poglavlje 21: SQL Server Mobile Edition | 507

DODATAK A

ADO.NET 2.0

ADO.NET je skup klasa koje .NET aplikacijama omogućuju pristup relacijskim, XML i aplikacijskim podacima. Klase služe za povezivanje s XML podacima i izvorima podataka kao što su SQL Server i Oracle, te s podacima izloženim kroz OLE DB i ODBC. Nakon povezivanja s izvorima podataka, ADO.NET klase možete upotrijebiti za čitanje, obradu i ažuriranje podataka. U ovom poglavlju upoznat ćete se s novim mogućnostima i značajkama ADO.NET-a 2.0.

Enumeracije pružatelja podataka i tvornice podataka Pružatelji podataka u inačicama ADO.NET 1.0 i 1.1 sadrže klase specifične za pružatelje, koje implementiraju generička sučelja. Ta sučelja možete upotrijebiti za pisanje koda koji je neovisan o pružatelju podataka. Na primjer, klase za povezivanje s podacima u Microsoft SQL Server pružatelju podataka (SqlConnection) i Microsoft Oracle pružatelju podataka (OracleConnection) implementiraju sučelje IDbConnection. Kod temeljen na sučelju IDbConnection koji koriste obje klase, za razliku od instance pružatelja podataka specifične za bazu podataka, neovisan je o pružatelju podataka i stoga ne ovisi o pozadinskoj bazi podataka. Nedostatak ovog sučelja je što ne omogućuje pristup značajkama specifičnim za bazu podataka koje su implementirane kao članovi klase pružatelja podataka ali ne čine dio sučelja – kao što je, na primjer, metoda ChangeDatabase() Oracle pružatelja podataka. ADO.NET 2.0 uvodi opći model (engl. common model) temeljen na predlošku dizajna Factory, koji koristi jedno API sučelje za pristup bazama podataka s različitim pružateljima. Tvornice pružatelja podataka dopuštaju kodu upotrebu različitih pružatelja podataka bez biranja pružatelja. Klasa tvornice stvara i vraća strogo definirani objekt specifičan za pružatelj na temelju informacija u zahtjevu. To omogućava pisanje koda neovisnog o pružatelju, a sam pružatelj može se izabrati za vrijeme njegova izvođenja. Opći model pojednostavljuje pisanje aplikacije koja podržava različite baze podataka.

509

Klasa DbProviderFactories u imenskom prostoru System.Data.Common dobiva informacije o instaliranim .NET pružateljima podataka. Statička metoda GetFactoryClasses() vraća objekt DataTable s informacijama o instaliranim pružateljima podataka koji implementiraju apstraktnu osnovnu klasu DbProviderFactory, čija je shema opisana u tablici A-1. Tablica A-1. DataTable shema za metodu GetFactoryClasses Ime stupca

Opis

Name

Ime pružatelja podataka.

Description

Opis pružatelja podataka.

InvariantName

Jedinstveni identifikator pružatelja podataka registriranog u machine.config u elementu . Na primjer, nepromjenjivo ime SQL Servera je System.Data.SqlClient. Nepromjenjivo ime koristi se za programsko referenciranje na pružatelj podataka.

AssemblyQualifiedName

Potpuno kvalificirano ime klase tvornice pružatelja podataka – dovoljna informacija za instanciranje objekta.

Sljedeća konzolna aplikacija koristi klasu DbProviderFactories za dobivanje informacija o instaliranim pružateljima podataka: using System; using System.Data; using System.Data.Common; class Program { static void Main(string[] args) { DataTable dt = DbProviderFactories.GetFactoryClasses(); foreach (DataRow row in dt.Rows) Console.WriteLine("{0}\n\r {1}\n\r {2}\n\r {3}\n\r", row["Name"], row["Description"], row["InvariantName"], row["AssemblyQualifiedName"]); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Rezultat je sličan onome prikazanom na slici A-1. Pružatelji navedeni na slici A-1 odgovaraju elementu DbProviderFactories u machine. config prikazanom u sljedećem odlomku:

510 | Programiranje SQL Server 2005

Slika A-1. Informacije o instaliranim pružateljima podataka

Statička metoda GetFactory() klase DbProviderFactories uzima jedan argument – objekt DataRow iz tablice dobivene metodom GetFactoryClasses() ili niz s nepromjenjivim imenom pružatelja – i vraća instancu DbProviderFactory tog pružatelja podataka.

Dodatak A: ADO.NET 2.0 | 511

Klasa DbProviderFactory je apstraktna osnovna klasa koju svaki ADO.NET 2.0 pružatelj podataka mora implementirati. Neovisna je o pružatelju podataka i pruža strogo definiran objekt temeljen na informacijama dobivenim za vrijeme izvođenja. Klase specifične za pružatelj koje su izvedene iz DbProviderFactory i instalirane s .NET Frameworkom 2.0 navedene su u tablici A-2. Tablica A-2. Klase specifične za pružatelj izvedene iz DbProviderFactory i instalirane s NET.Frameworkom 2.0 Klasa tvornice

Opis

System.Data.Odbc.OdbcFactory

Stvara instance klasa ODBC pružatelja.

System.Data.OleDb.OleDbFactory

Stvara instance klasa OLE DB pružatelja.

System.Data.OracleClient.OracleClientFactory

Stvara instance klasa Oracle pružatelja.

System.Data.SqlClient.SqlClientFactory

Stvara instance klasa SQL Server pružatelja.

Klasa DbProviderFactory sadrži javne metode, opisane u tablici A-3, koje se koriste za stvaranje instanci klasa specifičnih za pružatelj. Tablica A-3. Javne metode klase DbProviderFactory Metoda

Opis

CreateCommand

Vraća instancu DbCommand – osnovnu klasu strogo definiranih objekata naredbi.

CreateCommandBuilder

Vraća instancu DbCommandBuilder – osnovnu klasu strogo definiranih objekata graditelja naredbi.

CreateConnection

Vraća instancu DbConnection – osnovnu klasu strogo definiranih objekata za povezivanje.

CreateConnectionStringBuilder

Vraća instancu DbCreateConnectionStringBuilder – osnovnu klasu strogo definiranih objekata graditelja nizova veza.

CreateDataAdapter

Vraća instancu DbDataAdapter – osnovnu klasu strogo definiranih objekata adaptera podataka.

CretaeDataSourceEnumerator

Vraća instancu DbDataSourceEnumerator – osnovnu klasu strogo definiranih objekata enumeratora izvora podataka.

CreateParameter

Vraća instancu DbParameter – osnovnu klasu strogo definiranih objekata parametara.

CreatePermission

Vraća instancu CodeAccessPermission – osnovnu klasu strogo definiranih objekata dopuštenja za pristup kodu.

Sljedeća konzolna aplikacija stvara instancu klase SqlClientFactory i prikazuje prvih deset redova iz tablice Person.Contact u AdventureWorks: using System; using System.Data; using System.Data.Common;

512 | Programiranje SQL Server 2005

class Program { static void Main(string[] args) { // Stvara tvornicu s pomoću nepromjenjivog imena DbProviderFactory f = DbProviderFactories.GetFactory("System.Data.SqlClient"); DbConnection conn = f.CreateConnection(); conn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks"; DbCommand selectCommand = conn.CreateCommand(); selectCommand.CommandText = "SELECT TOP 10 " + "FirstName, LastName, EmailAddress " + "FROM Person.Contact ORDER BY LastName"; DataTable dt = new DataTable(); DbDataAdapter da = f.CreateDataAdapter(); da.SelectCommand = selectCommand; da.Fill(dt); foreach (DataRow row in dt.Rows) Console.WriteLine(row[0] + ", " + row[1] + ", " + row[2]); Console.WriteLine(Environment.NewLine + "Press any key to continue.") Console.ReadKey(); } }

Rezultati su prikazani na slici A-2.

Slika A-2. Rezultati primjera s klasom SqlClientFactory

Osim istaknutog dijela koda iz prethodnog primjera s nepromjenjivim imenom pružatelja i nizom veze, kod je neovisan o bazi podataka. Ti se argumenti obično dobivaju iz konfiguracijske datoteke ili drugog sličnog mehanizma i ne upisuju se ručno kako bi aplikacija zaista bila neovisna o bazi podataka.

Dodatak A: ADO.NET 2.0 | 513

Klasa ConfigurationManager u imenskom prostoru System.Configuration pruža pristup informacijama o konfiguraciji aplikacije. Metoda ConnectionStrings() vraća instancu ConnectionStringSettingsCollection s nizovima veze za aplikaciju, gdje svaki niz odgovara imenovanom nizu veze u dijelu konfiguracijske datoteke aplikacije. Sljedeći primjer prikazuje kako se dobiva niz veze iz konfiguracijske datoteke. Prvo stvorite novi projekt konzolne aplikacije u Visual Studiju .NET. Odaberite Add ➝ New Item ➝ Application Configuration File za dodavanje nove konfiguracijske datoteke aplikacije App.config, a zatim dodajte niz veze u datoteku. Sljedeći odlomak koda prikazuje cijelu konfiguracijsku datoteku s istaknutim nizom veze MyConnection: >

Sljedeći kod vraća niz veze iz konfiguracijske datoteke. Kako biste preveli i pokrenuli primjer, dodajte referencu na sklop System.Configuration. using System; using System.Collections; using System.Data.SqlClient; using System.Configuration; class Program { static void Main(string[] args) { //// Uzima konfiguracijski niz iz konfiguracijske datoteke Configuration c = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConnectionStringsSection css = c.ConnectionStrings; for (int i = 0; i < css.ConnectionStrings.Count; i++) { Console.WriteLine(css.ConnectionStrings[i].Name); Console.WriteLine(" " + css.ConnectionStrings[i]); Console.WriteLine(); } Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Rezultati su prikazani na slici A-3. 514 | Programiranje SQL Server 2005

Slika A-3. Rezultati dobivenog niza konfiguracije iz konfiguracijske datoteke aplikacije

Dobivena su dva niza veze. Prvi niz je podrazumijevan i definiran u datoteci Machine. config, kao što prikazuje sljedeći odlomak koda:

DbConnectionStringBuilder je pomoćna klasa za izgradnju nizova veze specifičnih za pružatelj. Metodi Add() dodaju se parovi ime-vrijednost iz niza veze, a svojstvom ConnectionString vraća se niz veze. Prethodni primjer možete promijeniti tako da graditelj niza veze stvara niz veze koji se zatim dodjeljuje svojstvu ConnectionString sljedećim kodom: using using using using

System; System.Data; System.Data.Common; System.Data.SqlClient;

class Program { static void Main(string[] args) { // Gradi niz veze DbConnectionStringBuilder csb = new DbConnectionStringBuilder(); csb["Data Source"] = "localhost"; csb["Integrated Security"] = "SSPI"; csb["Initial Catalog"] = "AdventureWorks"; // Stvara vezu s pomoću niza veze SqlConnection conn = new SqlConnection(); conn.ConnectionString = csb.ConnectionString; // Prikazuje niz veze Console.WriteLine(csb.ConnectionString);

Dodatak A: ADO.NET 2.0 | 515

Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Rezultati su prikazani na slici A-4.

Slika A-4. Rezultati primjera s klasom DbConnectionStringBuilder

Nove značajke pružatelja podataka ADO.NET 2.0 uvodi nove značajke i mogućnosti .NET Framework pružatelja podataka koje služe za povezivanje s izvorima podataka, izvršavanje naredbi te uzimanje i ažuriranje podataka. Sljedeći dio poglavlja donosi opis najvažnijih promjena.

Asinkrona obrada ADO.NET podržava asinkrono programiranje za uzimanje podataka. To znači da zadatke koji se dugo izvršavaju tijekom obrade podataka možete delegirati u pozadinsku dretvu i održati korisničko sučelje aktivnim. Standardni postupci asinkrone obrade uključuju povratne pozive, identifikatore čekanja i prozivanje. Klasa SqlCommand sadrži šest metoda koje podržavaju asinkronu obradu, opisanih u tablici A-4. Tablica A-4. Metode klase SqlCommand za asinkronu obradu Asinkrona metoda

Opis

BeginExecuteNonQuery

Pokreće asinkrono izvođenje T-SQL naredbe ili pohranjene procedure objekta SqlCommand. Metoda vraća objekt IAsyncResult koji se može upotrijebiti za prozivanje i čekanje rezultata ili za pozivanje metode EndExecuteNonQuery. Pri svakom pozivanju metode BeginExecuteNonQuery treba se pozvati i metoda EndExecuteNonQuery() koja završava operaciju.

EndExecuteNonQuery

Završava asinkrono izvođenje T-SQL naredbe ili pohranjene procedure započete metodom BeginExecuteNonQuery() objekta SqlCommand. Naredba vraća broj redova koda obuhvaćenih naredbom.

BeginExecuteReader

Pokreće asinkrono izvođenje T-SQL naredbe ili pohranjene procedure objekta SqlCommand. Metoda vraća objekt IAsyncResult koji se može upotrijebiti za prozivanje i čekanje rezultata ili za pozivanje metode EndExecuteReader(). Pri svakom pozivanju metode BeginExecuteReader() treba se pozvati i metoda EndExecuteReader() koja završava operaciju.

EndExecuteReader

Završava asinkrono izvođenje T-SQL naredbe ili pohranjene procedure započete metodom BeginExecuteReader() objekta SqlCommand. Naredba vraća objekt SqlDataReader koji sadrži jednu ili više grupa rezultata.

516 | Programiranje SQL Server 2005

Tablica A-4. Metode klase SqlCommand za asinkronu obradu (nastavak) Asinkrona metoda

Opis

BeginExecuteXmlReader

Pokreće asinkrono izvođenje T-SQL naredbe ili pohranjene procedure objekta SqlCommand. Metoda vraća objekt IAsyncResult koji se može upotrijebiti za prozivanje i čekanje rezultata ili za pozivanje metode EndExecuteXmlReader(). Pri svakom pozivanju metode BeginExecuteXmlReader() treba se pozvati i metoda EndExecuteXmlReader() koja završava operaciju.

EndExecuteXmlReader

Završava asinkrono izvođenje T-SQL naredbe ili pohranjene procedure započete metodom BeginExecuteXmlReader() objekta SqlCommand. Naredba vraća objekt XmlReader.

Parovi asinkrone naredbe Begin\End za objekt SqlCommand djeluju međusobno na sličan način. Primjeri u kojima se koristi jedan par mogu se jednostavno primijeniti i na drugi par. Kako biste mogli upotrijebiti bilo koju od navedenih asinkronih metoda, dodajte svojstvo Asyncronous Processing=true u nizu veze za SQL Server. Sučelje IAsyncResult čuva informacije o stanju asinkrone operacije i pruža objekt sinkronizacije koji signalizira dretve kada operacija završi. U tablici A-5 navedena su svojstva sučelja IAsyncResult. Tablica A-5. Javna svojstva sučelja IAsyncResult Svojstvo

Opis

AsyncState

Vraća korisnički definiran object s informacijama o asinkronoj operaciji ili ju kvalificira.

AsyncWaitHandle

Vraća objekt WaitHandle koji čeka na završetak asinkrone operacije.

CompletedSynchronously

Bool vrijednost koja utvrđuje je li asinkrona operacija završila sinkrono.

IsCompleted

Bool vrijednost koja utvrđuje je li asinkrona operacija završila.

Sljedeća Windows aplikacija koristi asinkroni čitač podataka za dobivanje rezultata s redovima iz tablice Person.Contact u bazi podataka AdventureWorks. T-SQL naredba WAITFOR odgađa obradu SELECT naredbe za pet sekundi i prikazuje pozadinsku obradu upita. Nakon pet sekundi, program izvodi T-SQL naredbu koja vraća sve redove u objekt DataReader i poziva metodu HadleCallBack() za prikaz broja redova u okviru s porukom. Stvorite novi .NET Windows Forms projekt. Zamijenite kod u Form1.cs sljedećim kodom. Ovaj primjer ne sadrži druge elemente korisničkog sučelja. using using using using

System; System.Windows.Forms; System.Data; System.Data.SqlClient;

namespace ADONET20Win

Dodatak A: ADO.NET 2.0 | 517

{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } // Koristi delegat za prikaz rezultata asinkronog čitanja // budući da se vjerojatno nalazi na drugoj dretvi i // nije u doticaju s obrascem private delegate void DisplayResultsDelegate(string results); // Delegat prikazuje rezultate private void DisplayResults(string results) { MessageBox.Show(results); } private void Form1_Load(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks;" + "Asynchronous Processing=true"; string cmdText = "WAITFOR DELAY '00:00:05';" + "SELECT * FROM Person.Contact;"; SqlCommand cmd = new SqlCommand(cmdText, conn); conn.Open(); // Pokreće asinkronu operaciju. Metoda HandleCallBack() // Poziva se nakon pet sekundi kada završi operacija cmd.BeginExecuteReader( new AsyncCallback(HandleCallback), cmd); } private void HandleCallback(IAsyncResult asyncResult) { // Uzima izvorni objekt SqlCommand cmd = (SqlCommand)asyncResult.AsyncState; int rowCount = 0; // Uzima čitač podataka koji vraća asinkroni poziv using (SqlDataReader dr = cmd.EndExecuteReader(asyncResult)) { // Iterira kroz čitač while (dr.Read()) { // Radi nešto s čitačem

518 | Programiranje SQL Server 2005

rowCount++; } } cmd.Connection.Close(); string results = "Rows in Person.Contact: " + rowCount; // Prikazuje broj redova s pomoću prethodno opisanog delegata DisplayResultsDelegate del = new DisplayResultsDelegate(DisplayResults); this.Invoke(del, results); } } }

Sljedeći primjer prikazuje Windows aplikaciju koja proziva sučelje IAsyncResult s pomoću svojstva IsComplete radi utvrđivanja završetka operacije. Ovaj se primjer razlikuje od prethodnog u jednoj stvari: korisnik može pritisnuti gumb za provjeru stanja asinkrone operacije. Stanje se prikazuje u okviru s porukom i može biti neistinito ako se upit još uvijek izvodi, odnosno istinito ako je upit završen. Po završetku izvođenja upita, prikazuje se i broj redova u čitaču podataka. Stvorite novi .NET Windows Forms projekt. Otvorite Form1 u dizajneru i dodajte dva gumba na obrazac: jedan s Name = getDataButton i Caption = Get Data i drugi s Name = checkStatusButton i Caption = Check Status. Zamijenite kod u Form1.cs sa sljedećim kodom. Pokrenite aplikaciju i pritisnite gumb Get Data. Povremeno pritisnite gumb Check Status kako biste provjerili je li upit završen. Po završetku izvođenja upita, vraća se broj redova. using using using using

System; System.Windows.Forms; System.Data; System.Data.SqlClient;

namespace ADONET20Win { public partial class Form1 : Form { IAsyncResult asyncResult; SqlCommand cmd; public Form1() { InitializeComponent(); } private void getDataButton_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=localhost;" +

Dodatak A: ADO.NET 2.0 | 519

"Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks;" + "Asynchronous Processing=true"; string cmdText = "WAITFOR DELAY '00:00:10';" + "SELECT * FROM Person.Contact;"; cmd = new SqlCommand(cmdText, conn); conn.Open(); // Pokreće asinkronu operaciju. Po njenom završetku, // poziva se metoda HandleCallBack asyncResult = cmd.BeginExecuteReader(); } private void checkStatusButton_Click(object sender, EventArgs e) { string status = "Query complete: " + asyncResult.IsCompleted; if (asyncResult.IsCompleted) { int rowCount = 0; // Uzima čitač podataka vraćen asinkronim // pozivom nakon završetka operacije using (SqlDataReader dr = cmd.EndExecuteReader(asyncResult)) { // Iterira kroz čitač while (dr.Read()) { // Radi nešto s čitačem rowCount++; } } cmd.Connection.Close(); status += Environment.NewLine + "Rows returned: " + rowCount; } MessageBox.Show(status); } } }

Tehnike povratnog pozivanja i prozivanja, prikazane u prethodnim primjerima, korisne su za obradu jedne asinkrone operacije. Za razliku od njih, model čekanja dopušta obradu više simultanih asinkronih operacija. Model čekanja koristi svojstvo AsyncWaitHandle instance IAsyncResult dobivene metodom BeginExecuteNonQuery(), BeginExecuteReader() ili BeginExecuteXmlReader() objekta SqlCommand. Statičke metode WaitAny() i WaitAll() klase WaitHandle nadziru i čekaju na završetak asinkronih operacija. Metoda WaitAny() čeka na završetak ili prekid bilo koje asinkrone operacije. Rezultate možete obraditi i nastaviti čekati na završetak ili prekid 520 | Programiranje SQL Server 2005

sljedeće operacije. Metoda WaitAll() čeka na završetak ili prekid svih procesa u polju instanci WaitHandle. Sljedeća konzolna aplikacija koristi metodu WaitAny() za obradu asinkrone naredbe. using System; using System.Data.SqlClient; using System.Threading; class Program { static void Main(string[] args) { string connectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks;" + "Asynchronous Processing=true"; Random rnd = new Random((int)DateTime.Now.Ticks); // Stvara polje naredbi s "n" članova int n = 10; SqlConnection[] conn = new SqlConnection[n]; SqlCommand[] cmd = new SqlCommand[n]; string[] cmdText = new string[n]; IAsyncResult[] asyncResult = new IAsyncResult[n]; WaitHandle[] wh = new WaitHandle[n]; for (int i = 0; i < n; i++) { // Svaka naredba čeka nasumično između 1 i 10 sekundi cmdText[i] = "WAITFOR DELAY '00:00:" + rnd.Next(1, 10) + "';"; conn[i] = new SqlConnection(connectionString); conn[i].Open(); cmd[i] = new SqlCommand(cmdText[i], conn[i]); asyncResult[i] = cmd[i].BeginExecuteNonQuery(); wh[i] = asyncResult[i].AsyncWaitHandle; } // Čeka završetak svih procesa, prikazuje rezultate for (int i = 0; i < n; i++) { int index = WaitHandle.WaitAny(wh); int result = cmd[index].EndExecuteNonQuery(asyncResult[index]); Console.WriteLine("Completed command " + index + ": " + cmd[index].CommandText); conn[index].Close();

Dodatak A: ADO.NET 2.0 | 521

} Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Prethodni primjer stvara polje od deset T-SQL naredbi WAITFOR nasumična trajanja između 1 i 10 sekundi te prikazuje red na konzoli po završetku svake od njih. Na slici A-5 prikazani su rezultati.

Slika A-5. Rezultati dobiveni metodom WaitAny()

Model čekanja na sve (engl. wait all model) čeka završetak svih procesa. Metoda vraća vrijednost true ako svaki element polja WaitHandle primi signal za vrijeme prekida (u ovom primjeru ono traje 20000 milisekundi, odnosno 20 sekundi). U ostalim slučajevima vraća false. Sljedeća konzolna aplikacija koristi metodu WaitAll() za asinkronu obradu naredbe: using System; using System.Data.SqlClient; using System.Threading; class Program { static void Main(string[] args) { string connectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks;" + "Asynchronous Processing=true"; Random rnd = new Random((int)DateTime.Now.Ticks); // Stvara polje naredbi s "n" članova int n = 10; SqlConnection[] conn = new SqlConnection[n]; SqlCommand[] cmd = new SqlCommand[n];

522 | Programiranje SQL Server 2005

string[] cmdText = new string[n]; IAsyncResult[] asyncResult = new IAsyncResult[n]; WaitHandle[] wh = new WaitHandle[n]; for (int i = 0; i < n; i++) { // Svaka naredba čeka nasumično između 1 i 10 sekundi cmdText[i] = "WAITFOR DELAY '00:00:" + rnd.Next(1, 10) + "';"; conn[i] = new SqlConnection(connectionString); conn[i].Open(); cmd[i] = new SqlCommand(cmdText[i], conn[i]); asyncResult[i] = cmd[i].BeginExecuteNonQuery(); wh[i] = asyncResult[i].AsyncWaitHandle; } // Čeka završetak svih procesa i prikazuje rezultate bool result = WaitHandle.WaitAll(wh, 20000, false); if (result) { for (int i = 0; i < n; i++) { int recAff = cmd[i].EndExecuteNonQuery(asyncResult[i]); conn[i].Close(); } Console.WriteLine("Completed all commands successfully."); } else Console.WriteLine("Timeout error."); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Prethodni primjer stvara polje s deset T-SQL nartedbi WAITFOR nasumična trajanja između 1 i 10 sekundi i prikazuje red na konzoli po završetku svih njih, kao što je prikazano na slici A-6.

Slika A-6. Rezultati dobiveni metodom WaitAll()

Za dodatne informacije o metodama WaitAny() i WaitAll() pogledajte MSDN. Dodatak A: ADO.NET 2.0 | 523

Podrška za SQL Server obavijesti SQL Server 2005 i ADO.NET 2.0 nude mogućnost traženja obavijest kada se izvođenjem iste naredbe dobivaju različiti rezultati. To se događa, na primjer, kad drugi korisnik mijenja podatke koje je prethodno dobio trenutni korisnik. Ova je mogućnost nadogradnja nove mogućnosti redanja u SQL Serveru 2005. Dvije klase koje podržavaju obavijesti zovu se SqlDependency i SqlNotificationRequest. Slijedi opis i primjer svake. Oba primjera koriste tablicu Contact. Stvorite tablicu i dodajte joj dva zapisa sljedećim upitom: USE ProgrammingSqlServer2005 CREATE TABLE Contact( ID int NOT NULL, FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL, CONSTRAINT [PK_Contact] PRIMARY KEY CLUSTERED ( [ID] ASC ) ON [PRIMARY] ) ON [PRIMARY] GO INSERT INTO Contact (ID, FirstName, LastName) VALUES (1, 'John', 'Doe'); INSERT INTO Contact (ID, FirstName, LastName) VALUES (2, 'Jane', 'Smith');

U SQL Server 2005 bazama podataka Service Broker nije podrazumijevano omogućen zbog sigurnosnih razloga. Omogućite Service Broker za bazu podataka ProgrammingSqlServer2005 izvođenjem sljedećeg T-SQL upita: ALTER DATABASE ProgrammingSqlServer2005 SET ENABLE_BROKER

Funkcijom DATABASEPROPERTYEX možete potvrditi da je Service Broker omogućen za bazu podataka, kao što je prikazano u sljedećoj T-SQL naredbi: SELECT DATABASEPROPERTYEX('ProgrammingSqlServer2005', 'IsBrokerEnabled')

Ako je funkcija neistinita, vraća se vrijednost 0, a ako je istinita 1. Klasa SqlDependency služi za stvaranje objekta koji uočava promjene u rezultatu upita. U sljedećem primjeru stvorit ćete instancu SqlDependency. Zatim ćete se registrirati za dobivanje obavijesti o promjenama u rezultatu putem metode za obradu događaja OnChanged. Poduzmite sljedeće korake: 1. Stvorite objekt SqlConnection i objekt SqlCommand s upitom kojeg želite nadzirati za promjene. 2. Stvorite objekt SqlDependency i povežite ga s objektom SqlCommand. 3. Metodu za obradu događaja pretplatite na događaj OnChanged objekta SqlDependency. 4. Izvedite objekt SqlCommand metodom Execute().

524 | Programiranje SQL Server 2005

Sljedeći primjer prikazuje kako se nadziru i obrađuju obavijesti s pomoću klase SqlDependency. Kako bi obavijesti bile uspješne, odrediti vlasnika baze podataka u imenu tablice i popisu stupaca u upitu – obavijesti će biti neuspješne ako sve stupce označite zvjezdicom (*). using using using using

System; System.Data; System.Data.Common; System.Data.SqlClient;

class Program { static void Main(string[] args) { string connString = "Data Source=localhost;Integrated Security=SSPI;" + "Initial Catalog=ProgrammingSqlServer2005;"; // Stvara vezu i naredbu za nadziranje promjena SqlConnection conn = new SqlConnection(connString); SqlCommand cmd = new SqlCommand( "SELECT ID, FirstName, LastName FROM dbo.Contact", conn); // Stvara objekt SqlDependency i povezuje ga s naredbom SqlDependency d = new SqlDependency(cmd); d.OnChange += new DEFANGED_OnChangeEventHandler(d_OnChange); SqlDependency.Start(connString); Console.WriteLine("Notification handler configured."); // Stvara DataReader conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { // Obrađuje red u DataReaderu } dr.Close(); Console.WriteLine(Environment.NewLine + "Press any key to end."); Console.ReadKey(); conn.Close(); } static void d_OnChange(object sender, SqlNotificationEventArgs e) { Console.WriteLine(Environment.NewLine + "SqlDependency.OnChange event"); Console.WriteLine("Source = " + e.Source); Console.WriteLine("Type = " + e.Type); Console.WriteLine("Info = " + e.Info); } }

Dodatak A: ADO.NET 2.0 | 525

Pokrenite primjer i dodajte red u tablicu Contact tijekom njegova izvođenja. Rezultat je prikazan na slici A-7.

Slika A-7. Rezultat primjera s događajem SqlDependency

S pomoću klase SqlNotificationRequest možete izvršiti naredbu za dobivanje obavijesti od SQL Servera o promjeni rezultata upita. Za razliku od klase SqlDependency, nakon stvaranja obavijesti ne morate održavati objekt SqlNotificationRequest. Dovoljno je po potrebi tražiti obavijesti za redove dobivene upitom. Ovaj je model iznimno koristan u neumreženom okolišu. Kako biste mogli primati poruke s obavijestima, prvo morate stvoriti red i uslugu, kao što je prikazano u sljedećoj T-SQL naredbi: USE ProgrammingSqlServer2005 GO CREATE QUEUE ContactQueue CREATE SERVICE ContactNotification ON QUEUE ContactQueue ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]); CREATE ROUTE ContactQueueRoute WITH SERVICE_NAME = 'ContactNotification', ADDRESS = 'LOCAL';

Prethodni T-SQL blok naredbi čini tri stvari: • Stvara red ContactQueue za pohranu Service Broker poruka. • Stvara uslugu ContactNotification koju Service Broker koristi za isporuku poruka u red ContactQueue u SQL Server bazi podataka. • Stvara smjer kojim Service Broker šalje poruke do odgovarajućeg SQL Servera za uslugu. Nakon postavljanja reda, usluge i smjera, povežite objekt SqlNotificationRequest s objektom SqlCommand koji sadrži upit kako bi, nakon izvođenja T-SQL naredbe, SQL Server mogao pratiti upit i slati obavijest SQL Server redu određenom u zahtjevu za obavijesti u slučaju promjene.

526 | Programiranje SQL Server 2005

To ćete učiniti ako na sljedeći način izradite konzolnu aplikaciju koja stvara obavijest: using using using using using

System; System.Data; System.Data.Common; System.Data.SqlClient; System.Data.Sql;

class Program { static void Main(string[] args) { SqlConnection conn = new SqlConnection("Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=ProgrammingSqlServer2005;"); SqlCommand cmd = new SqlCommand( "SELECT ID, FirstName, LastName FROM dbo.Contact", conn); // Stvara objekt SqlNotificationRequest i povezuje ga s naredbom SqlNotificationRequest nr = new SqlNotificationRequest(); nr.UserData = Guid.NewGuid().ToString(); nr.Options = "Service=ContactNotification; " + "Local Database = ProgrammingSqlServer2005"; nr.Timeout = Int32.MaxValue; cmd.Notification = nr; Console.WriteLine("Notification handler configured."); // Stvara čitač podataka conn.Open(); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { // Radi nešto s čitačem podataka } Console.WriteLine("Press any key to end."); Console.ReadKey(); conn.Close(); } }

Kada pokrenete primjer, SQL Server stvara novu pretplatu na obavijest. Obavijest se stvara pri svakoj promjeni podataka koja utječe na rezultate upita SELECT ID, FirstName, LastName FROM dbo.Contact. Dok se primjer izvodi, dodajte zapis u tablicu kontakata putem SQL Management Studija. Obavijesti se šalju usluzi ContactNotification koja ih pohranjuje u red ContactQueue. Poruke ćete dobiti sljedećom T-SQL naredbom: SELECT * FROM ContactQueue

Dodatak A: ADO.NET 2.0 | 527

Kao što je vidljivo iz primjera, potrebno je definirati tri svojstva za objekt SqlNotificationRequest:

UserData Identifikator obavijesti specifičan za aplikaciju. Options Ime Service Broker usluge koja prima poruke s obavijestima. TimeOut Vrijeme čekanja SQL Servera na promjene prije prekida, mjereno sekundama.

Mulitple Active Result Sets Multiple Active Result Sets (MARS) omogućuje izvođenje više naredbi na jednoj vezi sa SQL Server bazom podataka. Svaka naredba zahtijeva svoj vlastiti objekt SqlCommand i postavlja dodatnu sesiju na vezu. MARS ćete omogućiti postavljanjem ključa MulitpleActiveResultSets u niz veze na true. Sljedeća konzolna aplikacija postavlja upite u bazu podataka AdventureWorks, te vraća zaglavlja prvih deset prodaja i detalje vezane uz njih. Jedna veza i dva objekta naredbe koriste se za stvaranje objekta DataReader. using System; using System.Data.SqlClient; class Program { static void Main(string[] args) { // Otvara vezu SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks;" + "MultipleActiveResultSets=true"; conn.Open(); // Stvara objekt DataReader sa zapisima o prvih 10 prodaja SqlCommand cmdHeader = conn.CreateCommand(); cmdHeader.CommandText = "SELECT TOP 10 SalesOrderID, TotalDue FROM Sales.SalesOrderHeader"; using (SqlDataReader drHeader = cmdHeader.ExecuteReader()) { while (drHeader.Read()) { int salesOrderID = (int)drHeader["SalesOrderID"]; Console.WriteLine("{0}\t{1}", salesOrderID, drHeader["TotalDue"]); // Stvara objekt DataReader s detaljima o prodajama

528 | Programiranje SQL Server 2005

SqlCommand cmdDetail = conn.CreateCommand(); cmdDetail.CommandText = "SELECT ProductID, OrderQty FROM " + "Sales.SalesOrderDetail WHERE SalesOrderID=" + salesOrderID; using (SqlDataReader drDetail = cmdDetail.ExecuteReader()) { while (drDetail.Read()) Console.WriteLine("\t{0}\t{1}", drDetail["ProductID"], drDetail["OrderQty"]); drDetail.Dispose(); } Console.WriteLine(); } } conn.Close(); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Dio rezultata prikazan je na slici A-8.

Slika A-8. Dio rezultata primjera s MARS-om

Skupno kopiranje Skupno kopiranje je iznimno djelotvoran mehanizam za prijenos velikih količina podataka u tablicu baze podataka ili pogled. ADO.NET 2.0 omogućuje skupno kopiranje podataka u SQL Server iz objekta DataTable ili DataReader s pomoću nove klase SqlBulkCopy u imenskom prostoru System.Data.SqlClient. Klasa SqlBulkCopy podržava i jednostruke i višestruke operacije skupnog kopiranja u posebnim (podrazumijevano) i postojećim transakcijama. Glavne metode i svojstva klase SqlBulkCopy opisani su u tablici A-6.

Dodatak A: ADO.NET 2.0 | 529

Tablica A-6. Glavne metode i svojstva klase SqlBulkCopy Konstruktori

Opis

SqlBulkCopy(SqlConnection conn) SqlBulkCopy(string connString) SqlBulkCopy(string connString, SqlBulkCopyOptions options) SqlBulkCopy(string connString, SqlBulkCopyOptions options, SqlTransaction, tx)

Stvara novu instancu klase SqlBulkCopy gdje je: conn Instanca SqlConnection. connString SQL Server niz veze. options Bitovna zastavica koja zadaje opcije za metodu SqlBulkCopy() iz enumeracije SqlBulkCopyOptions. Za dodatne informacije pogledajte MSDN. tx Postojeća transakcija (kao objekt SqlTransaction) u kojoj se izvodi skupno kopiranje.

Svojstva BatchSize

Broj redova u svakoj skupini poslanoj poslužitelju. Podrazumijevani broj je 0 koji ukazuje na to da su redovi napisani u jednoj skupini.

BulkCopyTimeout

Vrijeme potrebno za dovršetak skupnog kopiranja prije prekida, mjereno u sekundama.

ColumnMappings

Kolekcija objekata SqlBulkCopyColumnMappings koja definira preslikavanje stupaca iz objekata izvornih podataka u odredišnu tablicu.

DestinationTableName

Ime odredišne tablice na poslužitelju.

NotifyAfter

Broj redova za obradu prije stvaranja događaja obavijesti. Podrazumijevani broj je 0 koji ukazuje na to obavijesti nisu poslane.

Metode Close()

Zatvara instancu SqlBulkCopy.

WriteToServer

Kopira sve redove u objektu izvora podataka (DataReader ili DataTable) u odredišnu tablicu.

Aplikacija poduzima sljedeće korake za skupno kopiranje podataka: 1. Vraća podatke za kopiranje u objekt DataTable ili DataReader. 2. Povezuje se s poslužiteljem odredišne baze podataka. 3. Stvara i konfigurira objekt SqlBulkCopy. 4. Poziva metodu WriteToServer() objekta SqlBulkCopy. 5. Poziva metodu Close() objekta SqlBulkCopy ili zatvara objekt SqlBukCopy. Sljedeći primjer kopira sve redove iz tablice Person.Address u bazi podataka AdventureWorks u novu tablicu Address (bez sheme) u bazi podataka ProgrammingSqlServer2005. Poduzmite sljedeće korake: 1. Stvorite SQL Server 2005 bazu podataka ProgrammingSqlServer2005, ako ju već niste stvorili.

530 | Programiranje SQL Server 2005

2. Izvršite sljedeću T-SQL naredbu za stvaranje tablice Address u bazi podataka ProgrammingSqlServer2005: USE ProgrammingSqlServer2005 CREATE TABLE [Address]( [AddressID] [int] IDENTITY(1,1) NOT NULL, [AddressLine1] [nvarchar](60) NOT NULL, [AddressLine2] [nvarchar](60) NULL, [City] [nvarchar](30) NOT NULL, [StateProvinceID] [int] NOT NULL, [PostalCode] [nvarchar](15) NOT NULL, [rowguid] [uniqueidentifier] ROWGUIDCOL NOT NULL, [ModifiedDate] [datetime] NOT NULL)

3. Stvorite Windows konzolnu aplikaciju BulkCopy. 4. Kopirajte sljedeći kod u Program.cs. Ako je potrebno, promijenite istaknute nizove veze. using System; using System.Data; using System.Data.SqlClient; class Program { static void Main(string[] args) { // Dobiva podatke iz izvornog poslužitelja putem čitača podataka SqlConnection srcConn = new SqlConnection(); srcConn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks;"; srcConn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM Person.Address;", srcConn); IDataReader dr = cmd.ExecuteReader(); // Veza s odredišnim poslužiteljem SqlConnection dstConn = new SqlConnection(); dstConn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=ProgrammingSqlServer2005;"; dstConn.Open(); // Skupno kopira podatke u odredišnu tablicu using (SqlBulkCopy bcp = new SqlBulkCopy(dstConn)) { bcp.DestinationTableName = "Address"; bcp.WriteToServer(dr); } dstConn.Close(); dr.Close();

Dodatak A: ADO.NET 2.0 | 531

srcConn.Close(); Console.WriteLine("Press any key to Console.ReadKey();

continue.");

} }

5. Pokrenite aplikaciju. Redovi iz tablice Person.Address u bazi podataka AdventureWorks skupno su kopirani u tablicu Address u bazi podataka ProgrammingSqlServer2005. Ako imena stupaca u odredišnoj tablici ne odgovaraju onima u izvornoj, preslikajte stupce s pomoću klase SqlBulkCopyColumnMapping. Svaka instanca SqlBulkCopyColumnMapping definira preslikavanje stupca u skupno kopiranom izvoru i odredištu. Instance preslikavanja dodajte metodom Add() svojstva ColumnMappings objekta SqlBulkCopy prije pozivanja metode WriteToServer. Na primjer, ako promijenite ime u polju za adresu iz AddressLine1 i AddressLine2 u AddressLine1a i AddressLine2a, prije pozivanje metode WriteToServer() trebate dodati sljedeći kod za preslikavanje: bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("AddressID", "AddressID")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("AddressLine1", "AddressLine1a")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("AddressLine2", "AddressLine2a")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("City", "City")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("StateProvinceID", "StateProvinceID")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("PostalCode", "PostalCode")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("rowguid", "rowguid")); bcp.ColumnMappings.Add( new SqlBulkCopyColumnMapping("ModifiedDate", "ModifiedDate"));

Preslike mogu biti označene rednim brojem ili imenom stupca, ali sve moraju biti označene na isti način. Ako kolekcija ColumnMapping nije prazna, svi stupci moraju biti preslikani bez obzira na njihova imena. Klasa SqlBulkCopy podržava transakcije namijenjene operacijama skupnog kopiranja, a može koristiti i postojeće transakcije. Namijenjene transakcije su podrazumijevane, što je vidljivo iz prethodnog primjera. Skupno kopiranje se izvršava ili automatski vraća u prvotno stanje. Skupno kopiranje možete izvršiti unutar postojeće transakcije, pri čemu ono postaje dio transakcije zajedno s ostalim operacijama. Windows aplikacija slična je prethodnom primjeru po tome što skupno kopiranje izvodi unutar transakcije. Osim toga, koristi objekt DataTable kao izvor podataka umjesto objekta DataReader. 532 | Programiranje SQL Server 2005

using System; using System.Data; using System.Data.SqlClient; class Program { static void Main(string[] args) { SqlConnection srcConn = new SqlConnection(); srcConn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=AdventureWorks;"; SqlCommand cmd = new SqlCommand("SELECT * FROM Person.Address;", srcConn); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); // Veza s odredišnim poslužiteljem SqlConnection dstConn = new SqlConnection(); dstConn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;" + "Initial Catalog=ProgrammingSqlServer2005;"; dstConn.Open(); // Stvara transakciju na odredišnoj vezi SqlTransaction tx = dstConn.BeginTransaction(); try { // Radi nešto s transakcijom (tx) // skupno kopira podatke u odredišnu tablicu unutar transakcije (tx) using (SqlBulkCopy bcp = new SqlBulkCopy(dstConn, SqlBulkCopyOptions.Default, tx)) { bcp.DestinationTableName = "Address"; bcp.WriteToServer(dt); } tx.Commit(); } catch { tx.Rollback(); } dstConn.Close(); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Dodatak A: ADO.NET 2.0 | 533

Podrška za nove tipove podataka za velike vrijednosti SQL Server uvodi tipove podataka za velike vrijednosti – varchar(max), nvarchar(max) i varbinary(max) – koji omogućuju pohranu vrijednosti maksimalne veličine od 2³² bajtova. Ti tipovi podataka olakšavaju rad s podacima iz velikih objekata (LOB). Rad s tipovima podataka za velike vrijednosti ne razlikuje se od rada s tipovima podataka za male vrijednosti (varchar, nvarchar i varbinary). Tipove podataka za velike vrijednosti možete upotrijebiti kao tipove stupaca ili varijable i zadati ih bez posebne obrade kao ulazne i izlazne parametre. Također ih možete vratiti u objekt SqlDataReader ili ih upotrijebiti za ispunjavanje objekta DataTable s pomoću objekta SqlDataAdapter. Tipovi podataka za velike vrijednosti sadrže sljedeća ograničenja: • Tip sql_variant ne može sadržati tip podataka za velike vrijednosti. • Tip podataka za velike vrijednosti ne može se zadati kao stupac ključa u indeksu ili upotrijebiti kao stupac ključa za dijeljenje.

Podrška za korisnički definirane tipove SQL Server 2005 uvodi korisnički definirane tipove. Oni obogaćuju svojstva SQL Server tipova podataka tako što omogućuju definiciju prilagođenih struktura podataka s jednim ili više tipova podataka i objekata s jednim ili više tipova podataka zajedno s ponašanjem. Korisnički definirani tipovi koriste se na isti način kao i tipovi podataka u sustavu SQL Server, te kao varijable, argumenti i u definicijama stupaca. Korisnički definiran tip možete stvoriti bilo kojim jezikom kojeg podržava .NET Common Language Runtime (CLR). Korisnički definirani tipovi definiraju se kao klase ili strukture – podaci se izlažu preko polja ili svojstva, a ponašanje definiraju metode. Nakon što korisnički definiran tip prevedete u .NET sklop, registrirajte sklop u SQL Serveru T-SQL naredbom CREATE ASSEMBLY. Kako biste mogli upotrijebiti UDT, prvo ga stvorite u SQL Serveru T-SQL naredbom CREATE TYPE.

Podrška za izolaciju snimke u transakcijama SQL Server 2005 uvodi podršku za zaključavanje reda tijekom izolacije snimke. Kada je izolacija snimke omogućena, ažurirane inačice reda za svaku transakciju čuvaju se u sustavu u bazi podataka tempdb. Sve transakcije označene su jedinstvenim rednim brojem koji se snima zajedno s najnovijim inačicama reda. Transakcija radi s najnovijim inačicama reda s rednim brojevima transakcije koji su manji od rednog broja trenutne transakcije – redni brojevi transakcije veći od rednog broja trenutne transakcije ukazuju na to da su se transakcije javile nakon početka trenutne transakcije te se stoga zanemaruju. Time se omogućava da svi upiti u transakciji imaju dosljedan pogled na bazu podataka u trenutku početka transakcije. Ne provodi se zaključavanje, što

534 | Programiranje SQL Server 2005

omogućava izvođenje više simultanih transakcija bez prekida i čekanja. To poboljšava izvedbu i znatno smanjuje mogućnost potpunog zastoja. Izolacija snimke koristi optimističnu istodobnost – pri pokušaju ažuriranja podataka koji su mijenjani od zadnjeg čitanja, transakcija se vraća na prvotno stanje i izbacuje se pogreška. Mogućnost pojave konflikta ažuriranja možete smanjiti upotrebom iskaza za zaključavanje u T-SQL naredbama ili na početku transakcije. Na primjer, iskaz UPDLOCK zaključava redove odabrane u naredbi i onemogućuje njihovo ažuriranje prije završetka naredbe. Iskaze za zaključavanje koristite umjereno – njihova pretjerana upotreba može biti znak problema u dizajnu aplikacije. Izolaciju snimke eksplicitno ćete omogućiti za sve baze podataka postavljanjem opcije ALLOW_TRANSACTION_ISOLATION na ON. Također trebate postaviti opciju READ_COMMITED_ SNAPSHOT na ON kako biste omogućili pristup inačicama redova ispod podrazumijevane razine transakcije READ_COMMIITTED. Ako je opcija READ_COMMITTED_SNAPSHOT postavljena na OFF, razinu transakcije morate eksplicitno postaviti prilikom njene inicijalizacije, kao što je prikazano u sljedećem odlomku koda: SqlTransaction tx = conn.BeginTransaction(IsolationLevel.Snapshot);

Podrška za dupliciranje baze podataka Dupliciranjem baze podataka stvara se ažurirana kopija baze podataka na pričuvnom poslužitelju. Dvije kopije baze podataka pružaju visoku dostupnost i redundantnostako se primarna baza podataka ošteti, duplicirana baza podataka odmah može zauzeti njeno mjesto. .NET Data Provider za SQL Server implicitno podržava dupliciranje baze podataka- nakon konfiguriranja SQL Server 2005 baze podataka, dupliciranje baze podataka obavlja se automatski i transparentno je za programera. SQL Server 2005 podržava i eksplicitno dupliciranje baze podataka. Objekt SqlConnection podržava parametar Failover Partner u nizu veze, što omogućuje klijentskoj aplikacija da zada ime redundantnog poslužitelja. Na taj način, klijentska aplikacija može transparentno pokušati uspostaviti vezu s dupliciranom bazom podataka ako je glavna baza podataka nedostupna. Ime aktivnog poslužitelja trenutne veze uvijek je dostupno putem svojstva DataSource instance SqlConnection – to se svojstvo ažurira kada se veza seli na duplicirani poslužitelj kao odgovor na kvar. Microsoft ne podržava dupliciranje podataka u inačici SQL Server 2005 izdanoj 7. studenog 2005. godine. Kao rezultat toga, dupliciranje baze podataka trebalo bi se koristiti samo za evaluaciju, a ne i u proizvodnji. Dupliciranje baze podataka podrazumijevano je onemogućeno i može se omogućiti korištenjem zastavice za praćenje 1500 kao početnog parametra.

Dodatak A: ADO.NET 2.0 | 535

Enumeracija poslužitelja Metoda GetDataSources() klase SqlDataSourceEnumerator enumerira aktivne instance SQL Servera 2000 i novijih inačica koje su instalirane na lokalnoj mreži. Rezultati su vraćeni u objektu DataTable sa stupcima prikazanim u tablici A-7. Tablica A-7. DataTable shema rezultata metode GetDataSources() Ime stupca

Opis

ServerName

Ime SQL poslužitelja.

InstanceName

Ime poslužiteljske instance. Vrijednost je prazna ako je poslužitelj pokrenut kao podrazumijevana instanca.

IsClustered

Utvrđuje je li poslužitelj dio klastera.

Version

Broj inačice poslužitelja.

Sljedeća konzolna aplikacija koristi objekt SqlDataSourceEnumerator za enumeriranje SQL Server instanci: using System; using System.Data; using System.Data.Sql; class Program { static void Main(string[] args) { DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources(); foreach (DataRow row in dt.Rows) Console.WriteLine("{0}\t{1}\t{2}\t{3}", row["ServerName"], row["InstanceName"], row["IsClustered"], row["Version"]); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Rezultat je prikazan na slici A-9.

Slika A-9. Rezultat primjera s objektom SqlDataSourceEnumerator

Statičko svojstvo Instance klase SqlDataSourceEnumerator vraća instancu enumeratora koja služi za dobivanje informacija o SQL Server instancama.

536 | Programiranje SQL Server 2005

Podrška za dobivanje statistike o pružatelju u SQL Serveru 2005 .NET Framework Data Provider za SQL Server za vrijeme izvođenja podržava statistiku s informacijama o obradi upita u bazi podataka. Statistiku ćete omogućiti postavljanjem svojstva StatisticsEnabled objekta SqlConnection na true nakon stvaranja veze. Nakon što ju omogućite, statistiku možete dobiti u instanci IDictionary s pomoću metode RetrieveStatistics objekta SqlConnection. Vrijednosti u rječniku su vrijednosti brojača statistike i sve su tipa long. Metoda ResetStatistics objekta SqlConnection resetira brojače. Sve statistike se dobivaju na temelju veze. Sljedeća konzolna aplikacija stvara vezu, omogućava statistiku, ispunjava objekt DataTable s pomoću adaptera podataka i iterira kroz rječnik kako bi prikazala par ime-vrijednost za svaki brojač u rječniku: using using using using

System; System.Data; System.Collections; System.Data.SqlClient;

class Program { static void Main(string[] args; { // Otvara vezu i omogućuje statistiku using (SqlConnection conn = new SqlConnection()) { conn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks"; conn.StatisticsEnabled = true; // Radi nešto s vezom SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Person.Contact", conn); DataTable dt = new DataTable(); da.Fill(dt); // Uzima statistiku IDictionary d = conn.RetrieveStatistics(); // Premješta ključeve rječnika u polje string[] keys = new string[d.Count]; d.Keys.CopyTo(keys, 0); // Iterira kroz rječnik i prikazuje par ključ-vrijednost for (int i = 0; i < d.Count; i++) Console.WriteLine("{0}\t{1}", keys[i], (long)d[keys[i]]); } Console.WriteLine(Environment.NewLine + "Press any key to continue.");

Dodatak A: ADO.NET 2.0 | 537

Console.ReadKey(); } }

Rezultati su prikazani na slici A-10.

Slika A-10. Rezultati uzimanja statistike o pružatelju

Za dodatne informacije o dostupnim statistikama pogledajte MSDN.

Podrška za promjenu lozinke U SQL Serveru 2005 i Windows Serveru 2003, te njegovim novijim inačicama, možete programski promijeniti postojeću lozinku za korisnika koji je zadan u nizu veze. Sljedeći primjer mijenja lozinku za korisnika pod imenom TestUser. Prvo stvorite korisničko ime u SQL Server Management Studiju tako što ćete desnom tipkom miša pritisnuti Security ➝ Logins u Object Exploreru i odabrati opciju New Login s kontekstnog izbornika. U dijaloškom okviru Login-New učinite sljedeće: • Odaberite stranicu General na lijevoj strani dijaloškog okvira. • Upišite TestUser u polje Login name. • Pritisnite radio-gumb SQL Server Authentication. • Upišite password u polja Password i Confirm Password. • Uklonite oznaku iz polja Enforce pasword policy. • Odaberite User Mapping na lijevoj strani dijaloškog okvira. • Povrdite polje AdventureWorks u popisu Users na zaslonu za prijavu • Pritisnite gumb OK za stvaranje korisnika. Stvorite novu konzolnu aplikaciju, zamijenite Program.cs sljedećim kodom i pokrenite primjer:

538 | Programiranje SQL Server 2005

using using using using

System; System.Data; System.Collections; System.Data.SqlClient;

class Program { static void Main(string[] args) { string connStringOld = "Data Source=localhost;" + "uid=TestUser;pwd=password;Initial Catalog=AdventureWorks"; SqlConnection.ChangePassword(connStringOld, "password2"); Console.WriteLine("Password changed to 'password2'."); // Otvara vezu string connStringNew = "Data Source=localhost;" + "uid=TestUser;pwd=password2;Initial Catalog=AdventureWorks"; SqlConnection conn = new SqlConnection(); conn.ConnectionString = connStringNew; conn.Open(); Console.WriteLine("Connected with changed password."); conn.Close(); Console.WriteLine("Disconnected."); Console.WriteLine(Environment.NewLine + "Press any key to continue."); Console.ReadKey(); } }

Rezultati su prikazani na slici A-11.

Slika A-11. Rezultati promjene lozinke

Metoda ChangePassword() klase SqlConnection uzima dva argumenta: • Niz veze koji sadrži identifikator korisnika i lozinku. Iznimka se izbacuje ako je u nizu veze zadana integrirana sigurnost. • Novu lozinku. Metoda ChangePassword() može se upotrijebiti za promjenu istekle korisničke lozinke bez angažiranja administratora. Ako je lozinka istekla, pozivanjem metode Open() objekta SqlConnection izbacuje se iznimka SqlException. Ako se lozinka treba resetirati, svojstvo Number objekta SqlException bit će ili 18487 (istekla lozinka) ili 18488 (lozinka se treba resetirati prije prijave). Dodatak A: ADO.NET 2.0 | 539

Prikaz sheme Novo API sučelje za prikaz sheme u ADO.NET-u 2.0 omogućuje programsko pronalaženje i vraćanje metapodataka o bazi podataka za vezu. API sučelje neovisno o bazi podataka sadrži elemente sheme, uključujući tablice, stupce i pohranjene procedure. Veza s podacima prikazuje pet kategorija metapodataka putem metode GetSchema() klase DbConnection. Metoda vraća objekt DataTable s metapodacima. Objekt DataTable uzima jedno od pet imena kolekcija iz klase DbMetaDataCollectionNames opisanih u tablici A-8. Tablica A-8. Javna polja klase DbMetaDataCollectionNames Ime kolekcije

Opis

DataSourceInformation

Informacije o instanci baze podataka.

DataTypes

Informacije o tipovima podataka koje podržava baza podataka. Tu su uključene i informacije o preslikavanju tipova izvora podataka u .NET Framework tipove podataka.

MetaDataCollections

Popis dostupnih kolekcija metapodataka.

ReservedWords

Popis rezerviranih riječi u bazi podataka.

Restrictions

Polje kvalifikatora za svaku kolekciju metapodataka koje služi za ograničavanje dosega dobivenih informacija. Za svaki red dobiva se jedna vrijednost. Položaj kvalifikatora u polju određen je stupcem RestrictionNumber.

Sljedeći primjer dobiva i prikazuje dostupne kolekcije metapodataka: using using using using using

System; System.Collections; System.Data.SqlClient; System.Data; System.Data.Common;

class Program { static void Main(string[] args) { SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks"; conn.Open(); DataTable dt = conn.GetSchema( DbMetaDataCollectionNames.MetaDataCollections); conn.Close(); foreach (DataRow row in dt.Rows) { Console.WriteLine("{0}; {1}; {2}", row[0], row[1], row[2]); }

540 | Programiranje SQL Server 2005

Console.WriteLine("\n\rPress any key to continue."); Console.ReadKey(); } }

Rezultati su prikazani na slici A-12.

Slika A-12. Rezultati dobiveni metodom GetSchema()

Objekt DataTable, dobiven metodom GetSchema(), sadrži tri stupca opisana u tablici A-9. Tablica A-9. Stupci u objektu DataTable koji vrća metoda GetSchema() Ime stupca

Opis

CollectionName

Ime kolekcije metapodataka.

NumberOfRestricitons

Maksimalan broj kvalifikatora kolekcije metapodataka koji se koriste za ograničavanje dosega dobivenih informacija.

NumberOfIdentifierParts

Maksimalan broj dijelova identifikatora.

Preopterećena inačica metode GetSchema() uzima ime kolekcije metapodataka (jedna od vrijednosti CollectionName dobivena metodom GetSchema()) kao argument. Na primjer, sljedeća naredba vraća metapodatke o tablicama u bazi podataka: DataTable dt = conn.GetSchema("Tables");

Slijedi izvadak iz rezultata: TABLE_CATALOG

TABLE_SCHEMA

TABLE_NAME

TABLE_TYPE

AdventureWorks

dbo

AWBuildVersion

BASE TABLE

AdventureWorks

dbo

DatabaseLog

BASE TABLE

AdventureWorks

dbo

sysdiagrams

BASE TABLE

AdventureWorks

HumanResources

Department

BASE TABLE

Dodatak A: ADO.NET 2.0 | 541

TABLE_CATALOG

TABLE_SCHEMA

TABLE_NAME

TABLE_TYPE

AdventureWorks

Sales

vSalesPerson

VIEW

AdventureWorks

Sales

vSalesPersonSales ByFiscalYears

VIEW

AdventureWorks

Sales

vStoreWith Demographics

VIEW

Sljedeća preopterećena inačica metode GetSchema() uzima polje ograničenja niza kao drugi argument. Pozovite metodu GetSchema() s argumentom DbMetaDataCollectionNames.Restrictions kako biste dobili valjan popis ograničenja za kolekciju metapodataka. Dobiva se po jedan red za svako ograničenje – sva ograničenja imaju jedinstvenu vrijednost RestrictionNumber. Na primjer, kolekcija metapodataka Tables u SQL Serveru ima četiri ograničenja: Ime ograničenja

Podrazumijevano ograničenje

Broj ograničenja

Catalog

TABLE_CATALOG

1

Owner

TABLE_SCHEMA

2

Table

TABLE_NAME

3

TableType

TABLE_TYPE

4

Sljedeći odlomak koda koristi ograničenja za dobivanje samo onih informacija koji se odnose na poglede u shemi Production: string[] r = new string[] {null, "Production", null, "VIEW"}; DataTable dt = conn.GetSchema("Tables", r);

Podrška za DbConnection.GetSchema() je opcionalna, tako da pružatelj podataka može odlučiti da izbaci NotSupportedException. Ne postoji standard za informacije vraćene prilikom postavljanja upita u kolekciju metapodataka – dva pružatelja mogu vratiti različite informacije (tj. stupce u objektu DataTable) i koristiti različita ograničenja.

Nove značajke nepovezanih klasa ADO.NET 2.0 uvodi nove značajke i mogućnosti za rad s nepovezanim podacima. Te promjene utječu na uzimanje i ažuriranje podataka. U preostalom dijelu poglavlja opisane su glavne promjene.

DataSet i DataTable Novom klasom DataTableReader možete iterirati kroz redove u objektu DataTable koji je, kao i običan DataReader, namijenjen samo za čitanje i kretanje prema naprijed. Objekt DataTableReader vraća redove i stupce poredane na isti način kao i u pozadinskom objektu DataTable. DataTableReader vraća samo trenutnu inačicu reda u objektu

542 | Programiranje SQL Server 2005

DataTable – redovi označeni za brisanje se preskaču. Podaci u pozadinskom objektu DataTable mogu se mijenjati i brisati dok je objekt DataTableReader aktivan, što neće utjecati na položaj i valjanost objekta DataTableReader.

Objekt DataTableReader ima preopterećeni konstruktor – jedan uzima objekt DataTable kao argument, a drugi objekt DataTable[]. Objekt DataTableReader također možete stvoriti pozivanjem metode CreateDataReader() klase DataTable ili DataSet. Kad ih je više, tablice su poredane na isti način kao i u polju DataTable ili objektu DataSet. Metoda NextResult() objekta DataTableReader prelazi na sljedeću skupinu rezultata, ako postoji. Sljedeća konzolna aplikacija stvara objekt DataTable koji sadrži sve redove iz tablice Person.Contact u bazi podataka AdventureWorks. Zatim stvara objekt DataTableReader i ispisuje ime i prezime svake osobe na konzoli: using System; using System.Data; using System.Data.SqlClient; class Program { static void Main(string[] args) { // Otvara vezu SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Data Source=localhost;" + "Integrated Security=SSPI;Initial Catalog=AdventureWorks"; // Stvara DataTable s podacima Person.Contact SqlCommand selectCommand = conn.CreateCommand(); selectCommand.CommandText = "SELECT * FROM Person.Contact"; DataTable dt = new DataTable(); SqlDataAdapter da = new SqlDataAdapter(selectCommand); da.Fill(dt); // Stvara DataTableReader DataTableReader dtr = dt.CreateDataReader(); // Iterira kroz redove u DataTableReader i // prikazuje ime i prezime svake osobe while (dtr.Read()) Console.WriteLine("{0}\t{1}", dtr["FirstName"], dtr["LastName"]); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } }

Rezultati su prikazani na slici A-13. Dodatak A: ADO.NET 2.0 | 543

Slika A-13. Rezultati dobiveni metodom CreateDataReader()

Paketna obrada s klasom DataAdapter Klasa DataAdapter u ADO.NET-u 2.0 omogućuje operacije umetanja, ažuriranja i brisanja na objektu DataSet ili DataTable, što zamjenjuje pojedinačno slanje redova poslužitelju. Time se smanjuje vrijeme operacije i povećava učinkovitost. SQL Server i Oracle poslužitelji podržavaju paketno ažuriranje. Svojstvo UpdateBatchSize objekta DataAdapter zadaje broj redova koji se šalju u svakom paketu. Ako je svojstvo UpdateBatchSize postavljeno na 0, objekt DataAdapter šalje najveći paket koji poslužitelj može obraditi. Iznimno veliki paketi mogu negativno utjecati na izvedbu – veličinu paketa potrebno je uskladiti sa okolišem prije instaliranja aplikacije. Pri paketnom ažuriranju, svojstvo UpdatedRowSource DataAdapter objekata Update Command, InsertCommand i DeleteCommand mora biti postavljeno na vrijednost UpdateRowSource.None ili UpdatedRowSource.OutputParameters. Obje vrijednosti UpdateRowSource. FirstReturnedRecord i UpdateRowSource.Both nisu valjane. Kada je pri ažuriranju redova s pomoću objekta DataAdapter onemogućena paketna obrada, stvaraju se događaji RowUpdating i RowUpdated za svaki obrađeni red. Kada je paketna obrada omogućena, za svaki obrađeni red javlja se događaj RowUpdating, dok se događaj RowUpdated javlja samo jednom – nakon paketne obrade. Budući da se događaj RowUpdated javlja samo jednom za sve redove u paketu, njegovo svojstvo Row je null. Umjesto njega, možete upotrijebiti metodu CopyToRows() objekta RowUpdatedEventArgs za kopiranje obrađenih redova u polje DataRow putem kojeg im možete i pristupiti.

544 | Programiranje SQL Server 2005

Kazalo

Simboli " (dvostruki navodnici), 167 ' (jednostruki navodnici), 167 = (znak jednakosti), 334

A AcceptsPause, svojstvo, 325 AcceptsStop, svojstvo, 325 Activity Monitor, pristupanje, 19 Add Database Reference, dijaloški okvir, 64 Add New Item, dijaloški okvir, 65 Add Stored Procedure, stavka izbornika, 65 Add Table, dijaloški okvir, 13 Add( ), metoda, 371 AddReplicatedColumns( ), metoda, 458 ADF (Application Definition File), 407 (pogledajte također upravljanje) administracija SQL Server Management Studio, 8-24 ADO.NET klase, poboljšanja, 542-544 pružatelji podataka enumeracija, 509-516 poboljšanja, 516-542 tvornice, 509-516 ADOMD.NET, pristupanje podacima, 487-493 AdomdCommand, klasa, 490 AdomdConnection, klasa, 488 AdomdDataReader, klasa, 491 AdomdDataReader, objekt, 488 adrese, rad sa URN-ovima, 302 after, ključna riječ, 198 „after“, element, 151 (pogledajte također SQL Server Agent)

agenti povijest, uzimanje, 468 rad sa, 469, 472 replikacija, 443 AgentSchedule.FrequencySubDay, svojstvo, 470 AgentSchedule.FrequencySubDayInterval, svojstvo, 470 AgentSchedule.FrequencyType, svojstvo, 470 AgentSubSystem, enumeracija, 378 akcije (koraci posla), 377 alati, 1 pomoćni programi za odzivnik, 28 ReportViewer, kontrola, 335 sqlcmd, pomoćni program, 28 SSIS, 350 Alert Properties, dijaloški okvir, 384 ALL, operator, 41 ALTER, naredba, 47 ALTER ASSEMBLY, naredba, 74 ALTER ENDPOINT, naredba, 226-229 ALTER FUNCTION, naredba, 78 ALTER INDEX, naredba, 184 ALTER PROCEDURE, naredba, 80 ALTER TRIGGER, naredba, 86 ALTER XML SCHEMA COLLECTION, naredba, 188 Alter( ), metoda, 247 aml, tip podataka (T-SQL), 30 AMO (Analysis Management Objects), 493 analiziranje aktivnosti, 25 Analysis Management Objects (pogledajte AMO) (pogledajte također SSAS) Analysis Services, 9 poslovi, 346 povezivanje, 10-20 pružatelji događaja, 404

Kazalo | 545

Analysis Services Scripting Language (ASSL), 481, 486 anotacije, 146 HPA, 60 anotirane sheme preslikavanja, 141-146 ANY, operator, 40 aplikacije ADO.NET pružatelji podataka/tvornice, 509-516 baze podataka enumeriranje, 438 Notification Services, 404 rad sa, 440 domene, CLR integracija, 59 naredbe, hvatanje, 249 Notification Services arhitektura, 402-406 baze podataka, 404 programiranje, 407-440 stvaranje, 406, 409-420 stvaranje instanci, 420-423 ReportViewer, kontrola, 335 SMO klase, 291 stvaranje (u Visual Studiju.NET), 236 SQL Native Client, 130 SQL Server Mobile ažuriranje baza podataka, 504-505 modificiranje baza podataka, 503 preduvjeti, 497 programiranje, 498-501 rad sa bazama podataka, 501-503 rješavanje problema s bazama podataka, 505 SSRS, integriranje u, 329-341 uloge, 291 APPLY, operator, 45 Area( ), metoda, 117 argumenti BATCHES, 216 endPointName, 232 LIFETIME, 400 server_principal, 232 arhitektura Notification Services, 402-406 Service Broker, 388 SSIS, 343-350 { as first | as last }, 198 AS SNAPSHOT, klauzula, 13 asinkrono programiranje, 516-523 ASSL (Analysis Services Scripting Language), 481, 486

546 | Kazalo

atributi, 478 CLR integracije, prilagođavanje, 90 HPA, 60 SASS, 479 SqlFacet, 112 SqlFunction, 93 SqlMethod, 113 SqlProcedure, 100 SqlTrigger, 118 SqlUserDefinedAggregate, 107 SqlUserDefinedType, 110, 116 AUTHENTICATION, klauzula, 230 AUTO, način rada, 135, 202 AUTO_CREATE_STATISTICS, opcija baze podataka, 278 Axes, svojstvo, 489 ažuriranje baza podataka, 504-505 FOR XML, klauzula, 207

B BACKUP DATABASE, operacija, 307 BaseDirectoryPath, svojstvo, 423 BASIC, tip provjere identiteta, 230 „BatchCommands“, element, 216 BATCHES, argument specifičan za jezik, 216 baze podataka aplikacije enumeriranje, 438 rad sa, 440 ažuriranje, 504-505 datoteke, 503 dopuštenja, SMO klase, 291 dupliciranje, 535 instance, rad sa, 438 instance poslužitelja, 12 objavljivanje, omogućavanje za, 449 objekti enumeriranje, 243-246 stvaranje, 246 oslobađanje prostora, 502 otkrivanje shema, 540-542 podrazumijevane, SMO klase, 287 posrednički korisnički računi, stvaranje, 385 provjera, 502 provjera integriteta tablica, 247 reference, dodavanje, 64 rješavanje problema, 505 SASS, 480 uzimanje shema, 491-493 zadavanje upita, 487-490

sinonimi, 280-282 SMO klase, 256 SQL Server Mobile rad sa, 501-503 stvaranje, 498, 503 SqlMail, klasa, 314-317 stvaranje predloška baze podataka, 22 svojstva, enumeriranje, 243 tip XML podataka, 162 instance, 167-172 metode, 172-176 ograničenja, 166 stupci, 163-165 varijable, 165 uloge, SMO klase, 290 before, ključna riječ, 198 „before“, element, 151 BEGIN CONVERSATION TIMER, naredba, 400 BEGIN DIALOG, naredba, 399 BI (Business Intelligence) Development Studio, 26, 350 bijeli prostor, uklanjanje, 167 binarni veliki objekti, 180 BINARY BASE64, 202 blittable, polja tipa, 107 brisanje funkcija, 79 indeksa, 185 kolekcija XML shema, 188 okidača, 86 pohranjenih procedura, 81 sklopova, 75 SQL Server Mobile baza podataka, 503 tipova, 84 UDA funkcija, 82 završnih točaka, 229 brojevi grupe, 50 nizovi, Service Broker, 388 BULK, opcija, 169 BULK INSERT, naredba, 169 Business Intelligence (BI) Development Studio, 26, 350

C CAS (Code Access Security), 59 CAST, funkcija, 168 CellSet, klasa, 488 certifikati, SMO klasa, 294 ChangePassword( ), metoda, 539 CheckTables( ), metoda, 248

ChronicleQuantumLimit, svojstvo, 423 .NET tipovi podataka, 90 CLR (Common Language Runtime), 1 ADO.NET proširenja, 87-90 DDL, 68-73 dizajn, 59-61 okidači, 84-87 pohranjene procedure, 79-81 potrebni .NET imenski prostori, 61 prilagođeni atributi, 90 primjer Hello World, 62-68 rad sa sklopovima, 73-76 rutine, 62 UDA funkcije, 81-83 UDT-ovi, 83-84 uklanjanje pogrešaka/testiranje, 92 uključivanje, 61 CODEPAGE, 169 colName, 177 colPattern, 177 colType, 177 columnName, 196 CommandType, svojstvo, 140, 148 CommitPropertyChanges( ), metoda, 470 Common Language Runtime (pogledajte CLR) Common Model, ADO.NET, 509 Compact( ), metoda, 502, 503 ConfigString, svojstvo, 371 Configuration, klasa, 365 ConfigurationType, svojstvo, 365 CONNECT, dopuštenje, 231 Connect( ), metoda, 495 ConnectionContext, svojstvo, 453, 461 ConnectionSecurityContext, objekt, 447 ConnectionStrings( ), metoda, 514 ContactNotification usluga, 527 CONVERT, funkcija, 167 CopyAllTables, svojstvo, 310 CopyData, svojstvo, 310 CopySchema, svojstvo, 310 CREATE, naredba, 47 CREATE AGGREGATE, naredba, 82 CREATE ASSEMBLY, naredba, 73 CREATE DATABASE, naredba, 13 CREATE ENDPOINT, naredba, 218-226 CREATE ENDPOINT, naredba, 218 CREATE FUNCTION, naredba, 76 CREATE INDEX, naredba, 181 CREATE PROCEDURE, naredba, 79 CREATE TABLE, naredba, 163 CREATE TRIGGER, naredba, 84 CREATE TYPE, naredba, 83

Kazalo | 547

CREATE XML SCHEMA COLLECTION, naredba, 186 Create( ), metoda, 270 CreateDataReader( ), metoda, 544 CreateDistributor( ), metoda, 422, 433 CreateEventClass( ), metoda, 424 CreateGenerator( ), metoda, 422, 432 CreateHostedEventProvider( ), metoda, 431 CreateNotificationClass( ), metoda, 427 CreateParameter( ), metoda, 132 CreateSubscriber( ), metoda, 420, 434 CreateSubscription( ), metoda, 436 CreateSubscriptionClassMethod( ), metoda, 425 CreateSyncAgentByDefault, svojstvo, 461 CreateVacuumSchedule( ), metoda, 433 CROSS APPLY, upit, 46 Current, svojstvo, 97

Č čarobnjaci, Integration Services, 350 činjenične tablice, 479 čitanje baza podataka, 504-505 članovi filtriranje, 458 rekurzivni, 39 SASS, 480 stvaranje, 453-455 upravljanje s, 455 članovi listovi, SASS, 480 čvorovi Database Diagrams, 15 Databases, 13 filtrirane tablice, 12 hijerarhije, 15 Management, 19 Notification Services, 19 Object Explorer Assemblies, čvor Assemblies, Object Explorer, 66 Stored Procedures, 67 Replication, 19, 448 Security, 18 Server Objects, 18 SQL Server Agent, 19

Ć ćelije, 481

D daljinsko povezivanje usluga, 389, 395 DAT (Database Engine Tuning Advisor), 25

548 | Kazalo

Data Definition Language (pogledajte DDL) Data Mining Extensions (DMX), 481, 483 DataAdapter, klasa, 544 Database, svojstvo, 307 Database Diagram Designer, 16 Database Diagrams, čvor, 15 Database Engine, 9 povezivanje, 10-20 Database Engine Tuning Advisor (DTA), 25 Database Mail, rad sa, 19 Database.Users, kolekcija, 271 DatabaseMapping, klasa, 271 DatabaseName, svojstvo, 453, 461 DATABASEPROPERTYEX, funkcija, 524 DatabaseRole, objekt, 273 Databases, čvor, 13 Database_Name, parametar, 23 DataSet, klasa, 488, 543 DataTable, klasa, 543 DataTableReader, klasa, 542 datoteka definicije aplikacije, 407 datoteke ADF, 407 baze podataka, 503 formata skupnog kopiranja, 171 ICF, 406 SMO, klase, 287 DbConnectionStringBuilder, klasa, 515 DbMetaDataCollectionNames, klasa, 540 DbProviderFactory, klasa, 512 DDL (Data Definition Language), 1 CLR integracija, 68-73 okidači, 53-57, 124-127 SMO klase, 262 sintaksne reference, 229 Decision Support Objects (DSO), 493, 495 DECLARE, naredba, 165 definiranje kontakata, 382 poligona, 114 rasporeda, 381 UDT-ova, 109-118 delete, naredba, 199 DeliveryChannelName, svojstvo, 435 DENSE_RANK( ), funkcija, 50 Deny( ), metoda, 275 DestinationDatabase, svojstvo, 310 DeviceAddress, svojstvo, 420, 435 DeviceName, svojstvo, 435 Devices, svojstvo, 307 DeviceTypeName, svojstvo, 435 Diagram Designer, 15 DiffGrams, 153-156

DIGEST, tip provjere identiteta, 230 dijaloški okviri Add Database Reference, 64 Add New Item, 65 Add Table, 13 Alert Properties, 384 Edit Filter, 459 Instance Properties, 416 Job Properties, 377, 471 Job Schedules Properties, 472 log File Viewer, 474 Login-New, 538 New Project, 63 Publication Properties, 454, 459 Specify Values for Templates Parameters, 22 Subscription Properties, 465 dijalozi, Service Broker, 389 dimenzijske tablice, 478-479 DirectoryEntry, klasa, 99 DirectoryLoader, klasa, 99 Disconnect( ), metoda, 241 distribucija, Replication Distribution Agent, 443 Distributed Transaction Coordinator, rad sa, 19 distributeri, 405 instaliranje, 444-446 stvaranje, 433 DistributionDatabase, objekt, 444 DistributionPublisher, klasa, 446-449 Distributor, svojstvo, 465 DistributorSecurityMode, svojstvo, 465 DML (Data Manipulation Language) okidači, 118-124 SMO klase, 262 XML, 197-201 DMX (Data Mining Extensions), 481, 483 dnevnici, 19 događaji, 405 pružatelji, SSIS, 349 rad sa, 426 Replication Log Reader Agent, 443 dodavanje nizova veze, 514 poslova u pakete, 354 upravitelja veza, 356 događaji dnevnici, 405 klase, 405 stvaranje, 424 obavještavanje o, 251 OnTaskFailed, 369 pružatelji, 404 stvaranje, 431

RESTORE DATABASE, 309 ScriptingProgress, 304 SqlDependency, klasa, 526 SSIS, 348 obrada, 368 uzbune, stvaranje, 383 dokumenti DiffGrams, 153-156 XML DML, 197-201 FOR XML, klauzula, 201-208 indeksiranje, 180-185 instance, 167-172 kataloški pogledi, 208 metode, 172-176 ograničenja, 166 relacijski podaci, 176-179 stupci, 163-165 tipovi xml podataka, 162 varijable, 165 XQuery, 193 domene, dizajn CLR integracije, 59 dopuštenja baze podataka, SMO klase, 291 CONNECT, 231 kolekcije XML shema, rad sa, 190 konfiguriranje, 60 krajnje točke, rad sa, 231 objekti, validacija, 47 poslužitelji rad sa, 275 SMO klase, 290 stvaranje, 232 dopuštenje preuzimanja vlasništva, 233 DROP AGGREGATE, naredba, 82 DROP ASSEMBLY, naredba, 75 DROP ENDPOINT, naredba, 229 DROP FUNCTION, naredba, 79 DROP INDEX, naredba, 185 DROP PROCEDURE, naredba, 81 DROP TRIGGER, naredba, 86 DROP TYPE, naredba, 84 DROP XML SCHEMA COLLECTION, naredba, 188 Drop( ), metoda, 247 DSO (Decision Support Objects), 493, 495 „DTS:Configuration“, element, 365 DTSConfigurationType, enumeracija, 365 DtsEventHandler, klasa, 370 DTSExecStatus, enumeracija, 359 dupliciranje baza podataka, 535

Kazalo | 549

E Edit Filter, dijaloški okvir, 459 elementi kontejneri, 345 kontrolnog toka, 344 redni brojevi, Service Broker, 388 „after“, 151 „BatchCommands“, 216 „before“, 151 „DTS:Configuration“, 365 „Parameters“, 216 „sql:relationship“, 145 „sync“, 151 „xs:annotation“, 145 „xs:appinfo“, 145 „xs:schema“, 141 „xsd:annotation“, 146 „xsd:simple“, 192 email korisnička imena, 317 stvaranje uzbuna, 383 EmailAddress, svojstvo, 383 Enable( ), metoda, 422 EnableConfigurations, svojstvo, 365 EnableMergePublishing, svojstvo, 449 EnableTransPublishing, svojstvo, 449 END CONVERSATION, naredba, 400 endPointName, argument, 232 EnumAccounts( ), metoda, 317 EnumDependencies( ), metoda, 302 .NET Framework sklopovi, 276 enumeracije ADO.NET, 509-516 AgentSubSystem, 378 baze podataka aplikacije, 438 objekti, 243-246 svojstva, 243 DTSConfigurationType, 365 DTSExecStatus, 359 korisnički računi, 270 korisnici, 272 MessageTypeValidation, 397 Notification Services, 437 objekti, Service Broker, 390-395 poruke, 283 poslužitelji, 536 RepairType, 248 sklopovi, 278 SmoExceptionType, 254 stavki za replikaciju, 455-457

550 | Kazalo

svojstava zadatka, 360 uloge, 274 WMI instalacije, 319-323 enumeratori, 97 EnumObjects( ), metoda, 245 EnumReplicationColumns( ), metoda, 455 EnumReplicationTables( ), metoda, 455 EnumServerPermissions( ), metoda, 275 ERRORFILE, 169 ExceptionMessageBox, klasa, 156-161 EXECUTE AS, klauzula, 47 Execute( ), metoda, 359, 488 ExecuteAndSend( ), metoda, 101 ExecuteReader( ), metoda, 488 ExecuteXmlReader( ), svojstvo, 490 exist( ), metoda, 174 EXPLICIT, 202 Explicit, način rada, 135 ExportConfigurationFile( ), metoda, 365 Expression1, 197 Expression2, 198

F File System Watcher, pružatelj događaja, 404 FilterAxis, svojstvo, 489 filtrirani čvor tablice, 12 filtriranje članaka, 458 FIRSTROW, 169 flags, opcija, 176 For petlje, kontejneri, 345 FOR XML, klauzula, 135, 201-208 FOR XML NESTED, režim, 137 Foreach petlje, kontejneri, 345 formateri sadržaja, 405 rad sa, 430 stvaranje, 427-431 fragmenti (XML) instance, 167-172 metode, 172-176 ograničenja, 166 stupci, 163-165 varijable, 165 xml tip podataka, 162 Full-Text Search, 284-285 rad sa, 19 SMO klase, 284-285, 297 function_attribute, svojstvo, 113 funkcije CAST, 168 CONVERT, 167 DATABASEPROPERTYEX, 524 DENSE_RANK( ), 50

NTILE( ), 50 particijske, SMO klase, 288 rangiranje, 48-51 ROW_NUMBER( ), 48 sql:column( ), 196 sql:variable( ), 197 SVF, 93-96 TVF, 45, 96-100 UDA, 81-83, 106-109 UDF, 76-79 XQuery, 194

G GAC (Global Assembly Cache), 61 generatori, 405 stvaranje, 432 generiranje izvještaja, 329-335 generiranje snimaka, 464 GET TRANSMISSION STATUS, naredba, 400 GetDataSources( ), metoda, 536 GetFactoryClasses( ), metoda, 510 GetSchema( ), metoda, 540 GetSchemaDataSet( ), metoda, 493 GetSchemaTable( ), metoda, 492 glavni poslužitelji, SQL Server Agent, 386 Global Assembly Cache (GAC), 61 Grant( ), metoda, 275 grupe datoteka, SMO klase, 287 konverzacijske, Service Broker, 388 numeriranje, 50 poslužitelja, SMO klase, 268

H HandleCallback( ), metoda, 517 hDoc, 178 Hello World, CLR integracija primjeri, 62-68 hijerarhije čvor Replication, 19 čvorovi, 15 kolekcije, iteriranje, 319-323 poslužitelja, kretanje kroz, 241-243 SASS, 479 HostedEventProvider, klasa, 431 HTML (Hypertext Markup Language), postavljanje informacija uređaja, 333 HTTP (Hypertext Transfer Protocol), 210 završne točke, 218-231 HTTP GET, metoda, 334 HTTP POST, metoda, 334

Hypertext Markup Language (pogledajte HTML) Hypertext Transfer Protocol (pogledajte HTTP)

I IAsyncResult, sučelje, 517, 519 IBinarySerializable, sučelje, 107 idoc, opcija, 176 IEnumerator, sučelje, 97 ime principala usluge, 230 imena, URN, 299 imenski prostori potrebni za .NET CLR integraciju, 61 SMO, 234-237 klase, 255-266 koje se ne koriste za reference za čuvanje podataka, 286-297 programiranje, 267-285 rad sa objektima za pohranu podataka, 238-255 implementiranje Service Brokera, 396-401 indeksi brisanje, 185 DAT, 25 Full-Text Search, 284-285 mijenjanje, 16, 184 naredba CREATE INDEX, 181 pregled, 185 SMO, klase, 258 statistike upita, 278 XML podataka, 180-185 index_name, 182 inicijaliziranje usluga, Service Broker, 389 inicijatori, Service Broker, 389 Initialize, svojstvo, 307 insert, naredba, 197 instalacija distributera, 444-446 instance poslužitelja baze podataka, 12 okviri s porukama o iznimkama, 156 SQL Native Client, 130 SQLXML 4.0, 130 SSRS, 328 WMI, enumeriranje, 319-323 instaliranje, SSRS, 328 InstallDistributor( ), metoda, 444 instance baze podataka enumeriranje, 437 poslužitelji, 12 rad sa, 438

Kazalo | 551

Notification Services rad sa, 19 stvaranje, 420-423 SASS, 492 SQL Server, 256 svojstva, klasa ExceptionMessageBox, 160 xml tip podataka, 167-172 Instance Properties, dijaloški okvir, 416 instanciranje klase instance, 239-241 ManagedComputer, objekt, 319-323 integracija .NET tipovi podataka, 90 CLR ADO.NET unutarprocesna proširenja, 87-90 DDL, 68-73 dizajn, 59-61 okidači, 84-87 pohranjene procedure, 79-81 potrebni .NET imenski prostori, 61 prilagođeni atributi, 90 primjer Hello World, 62-68 rad sa sklopovima, 73-76 rutine, 62 UDA funkcije, 81-83 UDF, 76-79 UDT-ovi, 83-84 uklanjanje pogrešaka/testiranje, 92 uključivanje, 61 SSIS, 343-350 alati, 350 programiranje, 351-374 SSRS u aplikacije, 329-341 INTEGRATED, tip provjere identiteta, 230 Integration Services, 9, 343 čarobnjaci, 350 povezivanje, 10-20 integritet, provjeravanje za tablice podataka, 247 into, ključna riječ, 198 INullable, sučelje, 116 InvokeIfReceiverIsNull, svojstvo, 114 IsByteOrdered, svojstvo, 110 IsComplete, svojstvo, 519 IsFixedLength, svojstvo, 111 IsInvariantToDuplicates, svojstvo, 107 IsInvariantToNulls, svojstvo, 108 IsInvariantToOrder, svojstvo, 108 IsMutator, svojstvo, 113 IsNull( ), metoda, 116 IsNullable, svojstvo, 111 IsNullIfEmpty, svojstvo, 108

552 | Kazalo

ItemByIdAndLanguage( ), metoda, 283 ItemByIdAndLanguageID( ), metoda, 283 iteracija hijerarhije, 319-323 kolekcije, 239-241 IXmlSerializable, sučelje, 113 izdavači rad sa, 449 stvaranje, 446-449 izlaganje Web metoda, 217 iznimke obrada, 136 SMO, 253-255 SQL Server Mobile, 505 SqlXmlException, 136 izolacija, snimaka u transakcijama, 534 izvještaji parametri poslužitelja, 332 SSRS, 342 instaliranje, 328 integriranje u aplikacije, 329-341 URL pristup, 329-335 izvođenje okidača, 117 DDL, 124-127 DML, 118-124 pohranjenih procedura, 101 upita, 133 izvori, komponente SSIS toka podataka, 346 izvorna serijalizacija, 107 izvorne XML Web usluge, 2 HTTP krajnje točke, 218-231 otvoreni standardi, 210 SOAP poruke, 217 stvaranje, 211 Web metode, izlaganje, 217

J javna svojstva SqlXmlAdapter, klasa, 133 SqlXmlCommand, klasa, 131 SqlXmlParameter, 132 javne metode, SqlXmlCommand, klasa, 131 jednostruki navodnici (’), 167 jezici SASS, 480-486 SMO, klase, 293 Job, klasa, 380 Job Properties, dijaloški okvir, 377, 471 Job Schedules Properties, dijaloški okvir, 472 JobSchedule, klasa, 381 JobStep, klasa, 386

K kanali za isporuku, stvaranje, 406, 423 kataloški pogledi, 57, 70 krajnje točke, 233 poruke, 283 sys.assemblies, 71 sys.assembly_files, 71 sys.assembly_modules, 72 sys.assembly_references, 72 sys.assembly_types, 72 XML, 208 xml_indexes, 185 xml_schema_collections, 189 KDC (Key Distribution Center), 230 KERBEROS, tip provjere identiteta, 230 keš memorija, GAC, 61 Key Distribution Center (KDC), 230 klase, 89, 132, 524, 529 ADO.NET, poboljšanja nepovezanih, 542-544 AdomdCommand, 490 AdomdConnection, 488 AdomdDataReader, 491 CellSet, 488 Configuration, 365 DataAdapter, 544 DatabaseMapping, 271 DataSet, 488, 543 DataTable, 543 DataTableReader, 542 DbConnectionString, 515 DbMetaDataCollectionNames, 540 DbProviderFactory, 512 DirectoryEntry, 99 DirectoryLoader, 99 DistributionPublisher, 446-449 događaji, 405 stvaranje, 424 DtsEventHandler, 370 ExceptionMessageBox, 156-161 HostedEventProvider, 431 instance, instanciranje, 239-241 Job, 380 JobSchedule, 381 JobStep, 386 LogProviders, 371 ManagedComputer, svojstva, 321 MergeArticles, 458 MergePullSubscription, 468 obavijesti, 405 stvaranje, 427-431

Operator, 383 PrecedenceConstraint, 363 pretplate, 405 creating, 425 ProxyAccount, 386 pružatelja podataka, SQL Server Mobile, 500 RegisteredSubscriber, 459 Server, 275 ServerAlias, 324 ServerConnection, 241 ServerPermission, 275 ServerPermissionInfo, 275 ServerPermissionSet, 275 Service, 325 ServiceBroker, 392 SMO, 255-266 izrada rezervne kopije/restauriranje, 305-309 objektni model, 235 praćenje, 311-314 programiranje, 267-285 programiranje WMI, 318-326 RegisteredServer, 268 skripte, 298-305 SqlMail, 314-317 Transfer, 309-311 SmoException, 254 SqlBulkCopyColumnMapping, 532 SqlCeEngine, 499, 501 SqlClientFactory, 512 SqlCommand, 516 SqlContext, 87 SqlDataRecord, 89, 104 SqlDependency, 526 SqlMetaData, 104 SqlNotificationRequest, 524 SqlPipe, 88 SqlSmoObject, 302 SqlTriggerContext, 119, 124 SQLXML 4.0, 130-142 SqlXmlAdapter, 132 SqlXmlCommand, 131 SubscriberDevice, 435 UserDefinedFunctions, 99 XmlReader, uzimanje objekata, 137 .WRITE, 31 klauzule AS SNAPSHOT, 13 AUTHENTICATION, 230 EXECUTE AS, 47 FOR XML, 135, 201-208

Kazalo | 553

OUTPUT, 36 TABLESAMPLE, 35 TOP, 33 WHERE, 482 operatori, 40 klijenti SQL Native Client, programiranje, 128-130 SQL Server Mobile, 497 SQLXML 4.0, 130 anotirane sheme preslikavanja, 141-146 DiffGrams, 153-156 predlošci upita, 146-150 UpdateGrams, 150-153 upravljane klase, 130-142 XML skupovi rezultata, obrada, 137 ključevi MultipleActiveResultSets, 528 SMO klase, 295 ključne riječi after, 198 before, 198 into, 198 OPENXML, 176 skupovi rezultata, 179 kocke, SASS, 479 kolekcije Database.Users, 271 hijerarhije, iteriranje kroz, 319-323 iteriranje, 239-241 ServiceBroker, klasa, 392 XML sheme, rad sa, 186-193 komponente SQL Native Client, 129 tok podataka, 343, 346 konfiguracija aplikacije, Notification Services, 406, 409-420 baza podataka objekti, 246 SQL Server Mobile, 498, 503 tip XML podataka, 163 članova, 453-455 distributera, 433 događaja klase, 424 pružatelja, 431 dopuštenja, 60, 232 formatera sadržaja, 427-431 generatori, 432 instanci, Notification Services, 420-423 izdavači, 446-449 izvornih XML Web usluga, 211

554 | Kazalo

kanala za isporuku, 423 klasa obavješćivanje, 427-431 pretplate, 425 oeratora, SQL Server Agent, 382 paketa, 349, 351-371 poslova, SQL Server Agent, 377 poslužitelja sinonima, 324 SMO klasa, 286 posredničkih korisničkih računa, SQL Server Agent, 385 praćenja, 25 preduvjeta za replikaciju, 444 pretplata, 436, 461-464 pretplatnika, 434 protokola za obavješćivanje, 427-431 publikacija, 450-453 raspored čišćenja, 433 rasporeda, SQL Server Agent, 380 redova, Service Broker, 397 relacija, 13 SMO aplikacija (u Visual Studiju .NET), 236 SQL Server Configuration Manager, 24 SQL Server Management Studio, 8-24 SQL Server Surface Area Configuration, 25 ugovora, Service Broker, 397 upita, 13 uzbune, SQL Server Agent, 383 konfiguracijska datoteka instance, 406 konstante, dodjeljivanje, 168 kontaktiranje, definiranje (SQL Server Agent), 382 kontejneri baze podataka, SASS, 480 For petlje, 345 Foreach petlje, 345 nizovi, 345 SSIS elementi za kontrolu toka, 344 ograničenja prednosti, 346 kontrola toka elementi., 344, SSIS programiranje, 351-371 kontrole, ReportViewer, 335 konverzacije., 388, Service Broker kopiranje sheme, 309-311 skupno kopiranje (ADO.NET), 529-533 korisnički definirane agregatne funkcije, 81-83, 106-109

korisnički definirane funkcije, 76-79 korisnički definirane poruke, SMO klase, 296 korisnički definirani objekti, 263, SMO klase korisnički definirani tipovi, 83-84, 109-118 ADO.NET, 534 korisnički računi čvor Security, 18 enumeriranje, 270 SMO klase, 269, 289 TestLogin SQL Server, 272 korisnici enumeriranje, 272 SMO klase, 271, 290 kretanje kroz hijerarhiju poslužitelja, 241-243

L LastAgentJobHistoryInfo( ), metoda, 468 LASTROW, 169 LastRunDateTime, svojstvo, 468 LIFETIME, argument, 400 LocalConnectionString, svojstvo, 499 Log File Viewer, dijaloški okvir, 474 LoggingMode, svojstvo, 371 LoggingOptions.EventFilter, svojstvo, 371 Login-New, dijaloški okvir, 538 Logins, svojstvo, 269 LogProviders, klasa, 371 LogTableActivityTrigger.cs, 125 lokalne publikacije, rad sa, 19 lozinke, mijenjanje, 538

M Management, čvor, 19 mape u Template Exploreru, 20-23 MARS (Multiple Active Result Sets), 528-529 MaxByteSize, svojstvo, 107-108, 110 MAXERRORS, 169 MaxSize, svojstvo, 111 MDX (Multidimensional Expressions), 481-483 MergeArticle, klasa, 458 MergeArticle, objekt, 453 MergePublication, objekt, 450 MergePullSubscription, klasa, 468 MergeSessionDetail, svojstvo, 475 MergeSessionSummary, svojstvo, 474 MergeSubscriberMonitor, svojstvo, 474 MessageTypeValidation, enumeracija, 397 metapodaci CLR rutine, 70 kataloški pogledi, 70 krajnje točke, 233

okidači, 87 otkrivanje sheme, 540-542 T-SQL, 57 UDT-ovi, 84 metaProperty, 177 metode Add( ), 371 AddReplicatedColumns( ), 458 Alter( ), 247 Area( ), 117 ChangePassword( ), 539 CheckTables( ), 248 CommitPropertyChanges( ), 470 Compact( ), 502, 503 Connect( ), 495 ConnectionStrings( ), 514 Create( ), 270 CreateDataReader( ), 544 CreateDistributor( ), 422, 433 CreateEventClass( ), 424 CreateGenerator( ), 422, 432 CreateHostedEventProvider( ), 431 CreateNotificationClass( ), 427 CreateParameter( ), 132 CreateSubscriber( ), 420, 434 CreateSubscription( ), 436 CreateSubscriptionClassMethod( ), 425 CreateVacuumSchedule( ), 433 Deny( ), 275 Disconnect( ), 241 Drop( ), 247 Enable( ), 422 EnumAccounts( ), 317 EnumDependencies( ), 302 EnumObjects( ), 245 EnumReplicationColumns( ), 455 EnumReplicationTables( ), 455 EnumServerPermission( ), 275 Execute( ), 359, 488 ExecuteAndSend( ), 101 ExecuteReader( ), 488 exist( ), 174 ExportConfigurationFile( ), 365 GetDataSources( ), 536 GetFactoryClasses, 510 GetSchema( ), 540 GetSchemaDataSet( ), 493 GetSchemaTable, 492 Grant( ), 275 HandleCallback( ), 517 HTTP GET, 334 HTTP POST, 334

Kazalo | 555

InstallDistributor, 444 IsNull( ), 116 ItemByIdAndLanguage( ), 283 ItemByIdAndLanguageID( ), 283 LastAgentJobHistory( ), 468 MergePullSubscription. SynchronizeWithJob( ), 473 modify( ), 175 MoveNext( ), 97 nodes( ), 175 Null( ), 116 Pause( ), 325 public return_type Terminator( ), 106 public void Accumulate( ), 106 public void Init( ), 106 public void Merge( ), 106 queries, xml data type, 163 query( ), 173 Read( ), 488 Refresh( ), 326 RegisterLocal( ), 422 RemoveReplicated Columns( ), 458 Render( ), 341 Reset( ), 97 ResetStatistics( ), 537 Resume( ), 325 RetrieveStatistics( ), 537 Revoke( ), 275 SaveToXml( ), 366 Script( ), 300 Send( ), 101, 102 Service, klasa, 325 SetButtonText( ), 159 SetValue( ), 117 Show( ), 158 Shrink( ), 502, 503 Sleep( ), 326 SqlBackup( ), 308 SqlBulkCopy, 529 SqlCeEngine, 501 SqlCommand, klasa, 516 SqlRestore( ), 309 SqlResultsEnd( ), 105 SqlResultsRow( ), 105 SqlResultsSend( ), 105 SqlResultStart( ), 105 SqlXmlCommand, klasa, 131 Start( ), 325, 380 StartEvents( ), 252 Statistic.Create( ), 279 Stop( ), 325 StopEvents( ), 252

556 | Kazalo

SubscribeToEvents( ), 252 SynchronizeWithJob( ), 467 TransferData( ), 311 UnsubscribeAllEvents( ), 252 UnsubscribeFromEvents( ), 252 ValidateSubscription( ), 473 value( ), 173 WaitAll( ), 520 WaitAny( ), 520 Web, izlaganje, 217 WriteToServer( ), 532 xml tip podataka, 172-176 mijenjanje baza podataka, SQL Server Mobile, 503 dopuštenja, 232 funkcija, 78 indeksa, 184 kolekcija XML shema, 188 krajnjih točaka, 226-229 lozinki, 538 okidača, 86 pohranjenih procedura, 80 sklopova, 74 svojstava, SQL Server Mobile, 503 mjere, SASS, 479 modeli Common Model (ADO.NET), 509 objekti Integration Services, 343 SSIS, 344 SMO, objekt, 235 modify( ), metoda, 175 MoveNext( ), metoda, 97 Multidimensional Expressions (MDX), 481-483 Multiple Active Result Sets (MARS), 528-529

N n-torka, 481 nadgledanje događaja, 251 rad sa, 476 replikacija, 474-477 Name, svojstvo, 111, 453 naredbe, 186 ALTER, 47 ALTER ASSEMBLY, 74 ALTER ENDPOINT, 226-229 ALTER FUNCTION, 78 ALTER INDEX, 184 ALTER PROCEDURE, 80

ALTER TRIGGER, 86 ALTER XML SCHEMA COLLECTION, 188 BEGIN CONVERSATION TIMER, 400 BEGIN DIALOG, 399 brisanje, 199 BULK INSERT, 169 CREATE, 47 CREATE AGGREGATE, 82 CREATE ASSEMBLY, 73 CREATE DATABASE, 13 CREATE ENDPOINT, 218-226 CREATE ENDPOINT, 218 CREATE FUNCTION, 76 CREATE INDEX, 181 CREATE PROCEDURE, 79 CREATE TABLE, 163 CREATE TRIGGER, 84 CREATE TYPE, 83 CREATE XML SCHEMA COLLECTION, 186 CTE, 37 DECLARE, 165 DMX, 483 DROP AGGREGATE, 82 DROP ASSEMBLY, 75 DROP ENDPOINT, 229 DROP FUNCTION, 79 DROP INDEX, 185 DROP PROCEDURE, 81 DROP TRIGGER, 86 DROP TYPE, 84 DROP XML SCHEMA COLLECTION, 188 END CONVERSATION, 400 GET TRANSMISSION STATUS, 400 hvatanje, 249 MARS, 528-529 MDX, 481-483, 481 OPENROWSET, 168 RECIEVE, 400 SELECT, 39, 203, 482 SEND, 399 umetanje, 197 vrijednosti parametara, 332 WAITFOR, 517 XQuery, 173, 199 zamjena vrijednosti, 200 navodnici, 167 ne-list, članovi, 480 NESTED, način rada, 135

.NET CLR integracija, 61 sklopovi, 292 enumeriranje, 276 tipovi podataka, 90 NetSendAddress, svojstvo, 383 neugošćeni pružatelj događaja, 405 rad sa, 432 New Project, dijaloški okvir, 63 New Query, opcija izbornika, 66 nizovi pretvaranje tipa, 167 veze dodavanje, 514 SQL Server Mobile, 499 uzimanje, 515 NMO (Notification Services Management Objects), 404 nodes( ), metoda, 175 Notification Services aplikacije programiranje, 407-440 stvaranje, 406, 409-420 arhitektura, 402-406 Notification Services, čvor, 19 Notification Services Management Objects (NMO), 404 nove značajke, 1 NSPassword, 415 NSServerName, 415 NSUserName, 415 NTILE( ), funkcija, 50 NTLM, tip provjere identiteta, 230 Null( ), metoda, 116 numerirane pohranjene procedure, SMO klase, 261 nvarchar, tip podataka, 31 nvarchar(max), 534

O obavješćivanje događaji, 251 klase, 405 stvaranje, 427-431 podrška u SQL Serveru, 524-528 pravila stvaranja, 405 Object Explorer, 10-20 čvor Assemblies, 66 čvorovi, Stored Procedures, 67 paketi, pregled, 353 objekti AdomdDataReader, 488

Kazalo | 557

AMO, 493 baze podataka enumeriranje, 243-246 sinonimi, 280-282 stvaranje, 246 BLOB, 180 ConnectionSecurityContext, 447 DatabaseRole, 273 DataSet, popunjavanje, 138 DistributionDatabase, 444 dopuštenja, provjera, 47 DSO, 493, 495 korisnički definirani, SMO klase, 263 LOB podataka, 534 ManagedComputer, instanciranje, 319-323 MergeArticle, 453 MergePublication, 450 modeli Integration Services, 343 SSIS, 344 NMO, 404 ReplicationServer, 443 RMO, programiranje, 442-477 SASS, rad sa, 493-495 ServerConnection, 241 Service Broker, enumeriranje, 390-395 SMO, 234-237 klase, 255-266 klase za izradu rezervnih kopija i obnavljanje, 305-309 programiranje, 267-285 reference koje se ne koriste za pohranu podataka, 286-297 skriptiranje, 298-305 SqlMail, 314-317 transakcijske operacije, 248 Transfer, 309-311 upravljanje pohranom podataka, 238-255 SqlCeDataAdapter, 504 SqlCeException, 505 SqlContext, 87 SqlPipe, 88 SqlRecordData, 89 SqlTriggerContext, 89 SubscribeDevice, 420 XMLReaderClass, uzimanje, 137 zastarjeli, rad sa, 19 objekti za pohranu podataka, rad sa, 238-255 oblikovanje, 25 datoteke formata skupnog kopiranja, 171 FOR XML klauzula, 135

558 | Kazalo

izvještaja, 329-335 kolekcija XML shema, 186 relacija, 13 rubnih tablica, 177 serijalizacija, 107 upita, 13 obnavljanje SQL Server Mobile, 503 obrada asinkrona, 516-523 događaja, SSIS, 368 iznimaka, 136, 253-255 paketna, 544 pogrešaka, SQL Server Mobile, 505 upiti, DAT, 25 obrada na klijentima, 137 obrada pogrešaka, 51-53 SQL Server Mobile, 505 obrada poslovne logike, 477 obrada praznina, 167 odbijanje dopuštenja, sakupljanje XML shema, 191 odgovori, SOAP, 217 odredišne usluge, Service Broker, 389 odredišni poslužitelj, SQL Server Agent, 386 odredišta, komponente SSIS toka podataka, 347 održavanje poslovi, SSIS, 346 rad sa, 19 ograničenja kolekcije XML shema, 192 mijenjanje, 16 prethodna, SSIS, 346 UDT-ovi, 113 XML DML, 201 xml tipa podataka, 166 ograničenja, SMO klase, 259 ograničenje prednosti, SSIS, 346 okidači, 84-87, 117 DDL, 53-57, 124-127 SMO klase, 262 DML, 118-124, 262 okoliš sa više poslužitelja, SQL Server Agent, 386 OLE DB pružatelji, 297 OLTP, 478 OnChanged, metoda za obradu događaja, 524 OnNullCall, svojstvo, 114 OnTaskFailed, događaj, 369

opcije AUTO_CREATE_STATISTICS baza podataka, 278 BULK, 169 idoc, 176 oznake, 176 rowpatern, 176 OPENROWSET, naredba, 168 OPENXML, ključna riječ, 176 skupovi rezultata, 179 operacije BACKUP DATABASE, 307 SMO, transakcijske, 248 Operator, klasa, 383 operatori ALL, 41 ANY, 40 APPLY, 45 OUTER APPLY, 46 PIVOT, 42 rad sa, 19 SOME, 40 SQL Server Agent, stvaranje, 382 UNPIVOT, 42 XQuery, 195 opterećenje, analiza, 25 optimizacija FOR XML, klauzula, 207 poboljšanja nepovezanih klasa, 542-544 pružatelji podataka, 516-542 T-SQL jezika, 32-48 funkcije za rangiranje, 48-51 obrada pogrešaka, 51-53 UDT-ovi, 534 Options, svojstvo, 528 Options.WithDependencies, svojstvo, 310 os rezanja, 482 oslobađanje prostora u bazi podataka, 502 otkrivanje, sheme, 540-542 otvoreni standardi, izvorne XML Web usluge, 210 OUTER APPLY, operator, 46 OUTPUT, klauzula, 36

P PageAddress, svojstvo, 383 paketi (SSIS) bilježenje, 370 konfiguriranje, 349, 364 pokretanje, 357 poslovi, dodavanje, 354 pregled, 353

spremanje, 352 stvaranje, 351-371 učitavanje, 353 validacija, 359 varijable, 350 „Parameters“, elementi, 216 parametri Database_Name, 23 naredbe, vrijednosti, 332 poslužitelji, izvještaji, 332 upiti, primjena, 134 URL, prefiksi, 331 particije funkcije, SMO klase, 288 sheme, SMO klase, 289 PATH, 202 PATH indeksi, 180 Pause( ), metoda, 325 PercentCompleteEventHandler, metoda za obradu događaja, 309 PerformanceQueryInterval, svojstvo, 423 petlje For, 345 Foreach, 345 PIVOT, operator, 42 poboljšanja klauzula FOR XML, 207 pružatelji podataka, 516-542 T-SQL, 32-48 funkcije za rangiranje, 48-51 obrada pogrešaka, 51-53 UDT-ova, 534 poboljšanja nepovezanih klasa, 542-544 poboljšanja programabilnosti, 2 podrazumijevane baze podataka, SMO klase, 287 podrška za ad hoc upite, 216 pogledi kataloški, 57, 70 krajnje točke, 233 poruke, 283 sys.assemblies, 71 sys.assembly_files, 71 sys.assembly_modules, 72 sys.assembly_references, 72 sys.assembly_types, 72 XML, 208 xml_indeksi, 185 xml_schema_collections, 189 SMO klase, 258 pohrana, tipovi podataka za velike vrijednosti, 534

Kazalo | 559

pohranjene procedure, 100-106 CLR integracija, 79-81 okidači, 117 DDL, 124-127 DML, 118-124 SMO klase, 260 pokretanje paketi, 357 poslovi, 379 pokretanje usluga, 325 poligoni, definiranje, 114 polja DbMetaDataCollectionNames, 540 obavijesti, rad sa, 429 pomoćne klase, skriptiranje, 298-305 pomoćni programi, 1 ReportViewer, kontrola, 335 sqlcmd, 28 SSIS, 350 za odzivnik, 28 pomoćni programi za odzivnik, 28 SSIS, 350 ponovno pokretanje usluga, 325 popravljanje baza podataka, 502 popunjavanje DataSet objekata, 138 poruke Service Broker, 388 redovi, 394 tipovi, 388 SMO klase, 283, 296 SOAP, 217 poslovi koraci (akcije), 377 paketi, dodavanje, 354 povezivanje, 361 rad sa, 19 SQL Server Agent pokretanje, 379 stvaranje, 377 stvaranje rasporeda, 380 svojstva, 377 SSIS, 345 svojstva, enumeriranje, 360 poslovi pripreme podataka, 345 poslovi toka podataka, 345 poslužitelji cilj, SQL Server Agent, 386 DDL, rad sa okidačima, 18 dnevnici, rad sa, 19 dopuštenja rad sa, 275 SMO klase, 290

560 | Kazalo

enumeriranje, 536 glavni, SQL Server Agent, 386 grupe, SMO klase, 268 hijerarhije, kretanje kroz, 241-243 instance baze podataka, 12 parametri poslužitelja izvješća, 332 povezane, SMO klase, 287 rad sa, 19 registrirani, SMO klase, 268, 286 sinonimi, izrada, 324 SMO klase, konfiguriranje, 286 SQL Server Mobile, 497 uloge, 290 čvor Security, 18 posrednički korisnički računi, stvaranje, 385 posrednici, rad sa, 19 potvrda sigurnog tipa, projektni ciljevi CLR integracije, 59 pouzdanost projekata CLR integracije, 59, 60 povezani poslužitelji rad sa, 18 SMO klase, 287 povezivanje relacijskih podataka, 195 povezivost na daljinu, SQL Server Surface Area Configuration, 25 poveznice Service Broker, 389, 395 stvaranje, 398 povijest agenta, uzimanje, 468 povrat metapodataka, 70 redova, 48 povratni pozivi, 516 praćenja, 25 pravila događaji dnevnici, 405 izrada pretplata, 425 generiranje obavijesti, 405 SMO klase, 260 status, DiffGrams, 153 PrecedenceConstraint, klasa, 363 Precision, svojstvo, 111 predlošci stvaranje baze podataka, 22 UpdateGrams, 150-153 upiti, XML, 146-150 preduvjeti replikacije, 444 prefiksi, URL parametri, 331 pregled indeksa, 185 paketa, SSIS, 353 ReportViewer, kontrola, 335

Solution Explorer, 23 statistika, 279 status, usluga, 417 prekidanje veze, 239-241 preslikavanje UpdateGrams, 150-153 pretplate pretplate, klase, 405 klase, stvaranje, 425 rad sa, 19, 426, 465 snimke, sinkroniziranje, 466 stvaranje, 436, 461-464 pretplatnici rad sa, 461 registriranje, 459-461 stvaranje, 434 validacija, 472 pretraživanje Full-Text Search, 284-285 rad s, 19 pretvaranje nizova, 167 prijenos dopuštenja, 232 konstanti, 168 prilagođavanje atributa, CLR rutine, 90 primarni XML indeks, 180 primjena parametara u upitima, 134 varijabli u SSIS, 363 pristup Activity Monitor, 19 ADOMD.NET, 487-493 CAS, 59 SQL Native Client programiranje, 128-130 SQL Server Agent, 19 SQL Server Management Studio, 8-24 URL, 329-335 XMLA, 483 produžene pohranjene procedure, SMO klase, 261 profili, Database Mail, 314 programi za prevođenje za odzivnik, 68 programiranje asinkrono, 516-523 kontrolnog toka, 351-371 Notification, 407-440 replikacija, 442-477 Service Broker, 389-401 SMO klase instance, 267-285 SQL Native Client, 128-130 SQL Server Agent, 375-387 SQL Server Mobile, 498-501 ažuriranje baza podataka, 504-505 modificiranje baza podataka, 503 rad s bazama podataka, 501-503

rješavanje problema s bazama podataka, 505 SQLXML 4.0, 130 anotirane sheme preslikavanja, 141-146 DiffGrams, 153-156 predlošci upita, 146-150 UpdateGrams, 150-153 upravljane klase, 130-142 SSIS, 351-374 toka podataka, 371 WMI, SMO klase, 318-326 projekti New Project, dijaloški okvir, 63 Solution Explorer, 23 projektni ciljevi CLR integracije, 59-61 PROPERTY, indeksi, 181 proširenja DMX, 481, 483 SSRS, 342 unutarprocesna ADO.NET, 87-90 XQuery, povezivanje relacijskih podataka, 195 prostor, oslobađanje u bazama podataka, 502 ProtocolName, svojstvo, 424 protokoli isporuka, 406 obavješćivanja, stvaranje, 427-431 rad sa, 430 SOAP, 211 provjera identiteta, 231 krajnje točke, 229 replikacija, 447 ProxyAccount, klasa, 386 ProxyName, svojstvo, 386 prozivanje, 516 prozori BI Development Studio, 26 Object Explorer, 10 Registered Servers, 9 Solution Explorer, 23 Template Explorer, 20-23 pružatelji ADO.NET, 509-516 poboljšanja, 516-542 dnevnika., 349, SSIS događaja, 404 stvaranje, 431 SQL Server Mobile, 500 statistike, uzimanje, 537 pružatelji podataka ADO.NET, 509-516 poboljšanja, 516-542 SQL Server Mobile, 500 statistike, uzimanje, 537

Kazalo | 561

public return_type Terminate( ), metoda, 106 public void Accumulate ( ), metoda, 106 public void Init( ), metoda, 106 public void Merge( ), metoda, 106 Publication, svojstvo, 464 Publication Properties, dijaloški okvir, 454, 459 PublicationDBName, svojstvo, 461 PublicationName, svojstvo, 453, 461 publikacije, 451 rad sa, 19, 451 spajanje, 449 stvaranje, 450-453 Publisher, svojstvo, 464 PublisherDatabase, svojstvo, 464 PublisherName, svojstvo, 461 PublisherSecurityMode, svojstvo, 465

Q ql_identifier, 186 QuantumDuration, svojstvo, 423 Query Designer, 13, 15 Query Editor, 13, 15 query( ), metoda, 173

R radni nalozi Database Mail, 316 elektroničke pošte, 317 posrednika, izrada, 385 TestLogin, 272 rangiranje funkcije, 48-51 redovi, 50 raspored čišćenja rad sa, 434 stvaranje, 433 rasporedi replikacija, 470-472 SQL Server Agent, stvaranje, 380 čišćenja rad s, 434 stvaranje, 433 RAW, način rada, 135 razine, SASS, 480 razvoj, SASS, 486 RDL (Report Definition Language), 328 Read( ), metoda, 488 RECEIVE, naredba, 400 redovi poruke, Service Broker, 394 rangiranje, 50 Replication Queue Reader Agent, 443

562 | Kazalo

Service Broker, 389 stvaranje, 397 vraćanje, 48 reference, dodavanje baza podataka, 64 Refresh( ), metoda, 326 Registered Servers, prozor, 9 RegisteredSubscriber, klasa, 459 RegisterLocal( ), metoda, 422 registracija pohranjenih procedura, 101 pretplatnika, 459-461 sklopova, 73 registrirani poslužitelji, SMO klase, 268, 286 rekurzivni članovi, 39 relacije modificiranje, 16 stvaranje, 13 relacijski podaci povezivanje, 195 XML, 176-179 relational_schema, 186, 188 RemoveReplicatedColumns( ), metoda, 458 Render, gumb, 337 Render( ), metoda, 341 RepairType, enumeracija, 248 replace value of, naredba, 200 Replication, čvor, 19 Replication Distribution Agent, 443 Replication Log Reader Agent, 443 Replication Merge Agent, 443 Replication Queue Reader Agent, 443 Replication Snapshot Agent, 443 ReplicationServer, objekt, 443 ReplicationType, svojstvo, 465 replikacija agenti, 443 rad sa, 472 nadgledanje, 474-477 programiranje, 442-477 rasporedi, 470-472 stavke enumeriranje, 455-457 rad sa, 457 Report Manager, 329 Report Server Web usluge, 336-341 Reporting Services, 9 povezivanje, 10-20 ReportViewer, kontrola, 335 Reset( ), metoda, 97 ResetStatistics( ), metoda, 537 RESTORE DATABASE, događaj, 309 Resume( ), metoda, 325 RETENTION, svojstvo, 400

RetrieveStatistics( ), metoda, 537 Revoke( ), metoda, 275 rezervne kopije rad sa, 18 SMO, klase, 305-309 SQL Server Mobile, 503 režim presretanja, 249 režimi AUTO, 135 EXPLICIT, 135 FOR XML NESTED, 137 NESTED, 135 RAW, 135 rješavanje problema baze podataka, 505 provjera integriteta, 247 SQL Server Mobile, 502 obrada pogrešaka, 51-53 SSIS, poslovi održavanja, 346 RMO (SQL Server Replication Management Objects), programiranje, 442-477 RootTag, svojstvo, 140 rotiranje vrijednosti, 42 rowpattern, opcija, 176 ROWS_PER_BATCH, 169 ROW_NUMBER( ), funkcija, 48 rubne tablice, oblikovanje, 177 rutine (CLR), 62 metapodaci, 70 prilagođeni atributi, 90 uklanjanje pogrešaka/testiranje, 92

S SaveToXml( ), metoda, 366 Scale, svojstvo, 111 Schema Component, 188 schemaDeclaration, 177 schemaName, 189 Script( ), metoda, 300 ScriptingProgress, događaj, 304 .sdf datoteke baze podataka, 503 Security, čvor, 18 Security Support Provider Interface (SSPI), 230 sekundarni XML indeksi, 180 SELECT, naredba, 39, 203, 482 SEND, naredba, 399 Send( ), metoda, 101, 102 serijalizacija, 107 Server, klasa, 275 Server Objects, čvor, 18 ServerAlias, klasa, 324 ServerConnection, klasa, 241 ServerConnection, objekt, 241

ServerMessageEventHandler, 307 ServerMessageEventHandler, metoda za obradu događaja, 309 ServerPermission, klasa, 275 ServerPermissionInfo, klasa, 275 ServerPermissionSet, klasa, 275 server_principal, argument, 232 Service, klasa, 325 Service Broker arhitektura, 388 implementiranje, 396-401 objekti, enumeriranje, 390-395 programiranje, 389-401 ServiceBroker, klasa, 392 SetButtonText( ), metoda, 159 SetValue( ), metoda, 117 sheme baze podataka, uzimanje, 491-493 GetDataSources( ), metoda, 536 GetFactoryClasses( ), metoda, 510 kopiranje, 309-311 otkrivanje, 540-542 rubne tablice, 177 SASS, 480-486 SMO klase, 265 XML rad sa, 186-193 SMO klase, 293 sheme, particije, 289 Show( ), metoda, 158 Shrink( ), metoda, 502, 503 sigurnost CAS, 59 lozinke, mijenjanje, 538 posrednički korisnički računi, stvaranje, 385 projektni cilj CLR integracije, 59-60 SQL Server Surface Area Configuration, 25 Simple, objekt Access Protocol (pogledajte SOAP), 211 SINGLE_BLOB, 170 SINGLE_CLOB, 170 SINGLE_NCLOB, 170 sinkroznizacija DiffGrams, 153-156 pretplate, snimke, 466 SQL Server Mobile, 497 sinonimi, izrada, 324 sinonimi, SMO klase, 280-282, 296 sistemske poruke, SMO klase, 296 sistemski tipovi podataka, SMO klase, 265 skalarne vrijednosti, 41 .NET Framework, 292 enumeriranje, 276

Kazalo | 563

sklopovi enumeriranje, 278 sys.assemblies kataloški pogled, 71 upravljanje s, 73-76 skriptiranje ASSL, 481, 486 poslovi, SSIS, 346 projekti, Solution Explorer, 23 SMO pomoćne klase, 298-305 skupna obrada, 544 skupno učitavanje, 529-533 datoteke formata, 171 skupno učitavanje podataka (s OPENROWSET), 168 skupovi rezultata FOR XML, klauzula, 201-208 MARS, 528 OPENXML, 179 XML, 137 primjena XSLT transformacija, 139 Sleep( ), metoda, 326 SMO (SQL Server Management Objects), 1, 234-237 iznimke, obrada, 253-255 klase, 255-266, 291, 297 klase za izradu rezervnih kopija i obnavljanje, 305-309 koji se ne koriste za pohranu podataka, 286-297 operacije, transakcije, 248 pomoćne klase, skriptiranje, 298-305 programiranje, 267-285 rad sa objektima za pohranu podataka, 238-255 RegisteredServer, klasa, 268 SQL Server Agent, programiranje, 375-387 SqlMail, klasa, 314-317 Transfer, klasa, 309-311 WMI, programiranje, 318-326 SMO objekti za transakcije, 248 SmoException, klasa, 254 SmoExceptionType, enumeracija, 254 snimke generiranje, 464 izolacija u transakcijama, 534 pretplate, sinkroniziranje, 466 Replication Snapshot Agent, 443 SOAP (Simple Object Access Protocol), 211 poruke, 217 Solution Explorer, 23 SOME, operator, 40 SourceObjectName, svojstvo, 453 SourceObjectOwner, svojstvo, 453

564 | Kazalo

spajanje publikacija, 449 stvaranje, 450-453 Replication Merge Agent, 443 Specify Values for Template Parameters, dijaloški okvir, 22 spremanje paketa, SSIS, 352 SQL Native Client, programiranje, 128-130 SQL Server podrška za obavješćivanje, 524-528 pružatelji događaja, 404 tipovi podataka, FOR XML, klauzula, 206 zadaci, 345 SQL Server 2005 Management Studio, 350 SQL Server 2005 Reporting Services (pogledajte SSRS) SQL Server Agent, 2 čvor, 19 programiranje, 375-387 SQL Server Analysis Services (pogledajte SSAS) SQL Server Business Intelligence Development Studio, 26 SQL Server Configuration Manager, 24 SQL Server Integration Services (pogledajte SSIS) SQL Server Management Objects (pogledajte SMO) SQL Server Management Studio, 8-24 SQL Server Mobile, 3, 9 aplikacije ažuriranje baza podataka, 504-505 modificiranje baza podataka, 503 preduvjeti, 497 programiranje, 498-501 rad sa bazama podataka, 501-503 rješavanje problema s bazama podataka, 505 okoliši, 497 povezivanje, 10-20 SQL Server Notification Services, 2 SQL Server Profiler, 25 SQL Server Replication Management Objects (pogledajte RMO) SQL Server Reporting Services (pogledajte SSRS) SQL Server Service Broker, 2 SQL Server Surface Area Configuration, 25 SQL Service Integration Services (pogledajte SSIS) sql:column( ), funkcija, 196 sql:relationship, element, 145 sql:variable( ), funkcija, 197 SqlBackup( ), metoda, 308 SqlBulkCopy, 529 SqlBulkCopy, klasa, 529

SqlBulkCopyColumnMapping, klasa, 532 SqlCeDataAdapter, objekt, 504 SqlCeEngine, klasa, 499, 501 SqlCeException, objekt, 505 SqlClientFactory, klasa, 512 sqlcmd, pomoćni program, 28 SqlCommand, klasa, 516 SqlContext, klasa, 87 SqlDataRecord, klasa, 89, 104 SqlDependency, klasa, 524, 526 SqlExecutionModes, svojstvo, 250 SqlFacet, atribut, 112 SqlFunction, atribut, 93 SqlMail, klasa, 314-317 SqlMetaData, klasa, 104 SqlMethod, atribut, 113 SqlNotificationRequest, klasa, 524 SqlPipe, klasa, 88 SqlProcedure, atribut, 100 SqlRestore( ), metoda, 309 SqlResultsEnd( ), metoda, 105 SqlResultsRow( ), metoda, 105 SqlResultsSend( ), metoda, 105 SqlResultsStart( ), metoda, 105 SqlSmoObject, klasa, 302 SqlTrigger, atribut, 118 SqlTriggerContext, 89 SqlTriggerContext, klasa, 89, 119, 124 SqlUserDefinedAggregate, atribut, 107 SqlUserDefinedType, atribut, 110, 116 SQLXML 4.0, 130 anotirane sheme preslikavanja, 141-146 DiffGrams, 153-156 predlošci upita, 146-150 UpdateGrams, 150-153 upravljane klase, 130-142 SqlXmlAdapter, klasa, 132 SqlXmlCommand, klasa, 131 SqlXmlException, iznimka, 136 SqlXMlParameter, 132 SqlXmlParameter, klasa, 132 sql_identifier, 188 SSAS (SQL Server Analysis Services), 1 ADOMD.NET, pristupanje podacima, 487-493 baze podataka, 480 jezici, 480-486 objekti, rad sa, 493-495 pregled, 479 razvoj, 486 SSIS (SQL Server Integration Services), 2 alati, 350 arhitektura, 343-350

Designer, 350 programiranje, 351-374 SSPI (Security Support Provider Interface), 230 SSRS (SQL Server 2005 Reporting Services), 2 aplikacije, integriranje u, 329-341 instaliranje, 328 proširenja, 342 stari objekti, rad sa, 19 Start( ), metoda, 325, 380 StartEvents( ), metoda, 252 Statistic.Create( ), metoda, 279 statistike pregled, 279 pružatelji, uzimanje, 537 SMO klase, 278-280, 294 status pravila, DiffGrams, 153 usluge, pregled, 417 Status, svojstvo, 468 stavke dodavanje, 65 izbornika Add Stored Procedure, 65 izbornika New Query, 66 projekta u Solution Exploreru, 23 replikacije enumeriranje, 455-457 rad sa, 457 StockWatch, service, 416 Stop( ), metoda, 325 StopEvents( ), metoda, 252 Stored Procedures, čvor u Object Exploreru, 67 stupci datoteka formata skupnog kopiranja, 171 SMO klase, 257 statistika upita, 278 statistike, pregled, 279 tip XML podataka, 163-165 XML indeksiranje, 181 skupno učitavanje podataka, 168 stvaranje predloška baze podataka, 22 SubscriberDevice, klasa, 435 SubscriberDevice, objekt, 420 SubscriberId, svojstvo, 435 SubscriberType, svojstvo, 461 SubscribeToEvents( ), metoda, 252 Subscription Properties, dijaloški okvir, 465 SubscriptionQuantumLimit, svojstvo, 423 sučelja IAsyncResult, 517, 519 IBinarySerializable, 107

Kazalo | 565

IEnumerator, 97 INullable, 116 IXmlSerializable, 113 kataloški pogledi, 57, 70 sys.assemblies, 71 sys.assembly_files, 71 sys.assembly_modules, 72 sys.assembly_references, 72 sys.assembly_types, 72 SSPI, 230 svojstva AcceptsPause, 325 AcceptsStop, 325 AgentSchedule.FrequencySubDay, 470 AgentSchedule.FrequencySubDayInterval, 470 AgentSchedule.FrequencyType, 470 Axes, 489 BaseDirectoryPath, 423 baza podataka, enumeriranje, 243 ChronicleQuantumLimit, 423 CommandType, 140, 148 ConfigString, 371 ConfigurationType, 365 ConnectionContext, 453, 461 CopyAllTables, 310 CopyData, 310 CopySchema, 310 CreateSyncAgentByDefault, 461 Current, 97 Database, 307 DatabaseName, 453, 461 DeliveryChannelName, 435 DestinationDatabase, 310 DeviceAddress, 420, 435 DeviceName, 435 Devices, 307 DeviceTypeName, 435 Distributor, 465 DistributorSecurityMode, 465 EmailAddress, 383 EnableConfigurations, 365 EnableMergePublishing, 449 EnableTransPublishing, 449 ExceptionMessageBox klase, 160 ExecuteXmlReader( ), 490 FilterAxis, 489 function_attribute, 113 IAsyncResult interface, 517 Initialize, 307 instance, 416 InvokeIfReceiversIsNull, 114 IsByteOrdered, 110

566 | Kazalo

IsComplete, 519 IsFixedLength, 111 IsInvariantToDuplicates, 107 IsInvariantToNulls, 108 isInvariantToOrder, 108 IsMutator, 113 IsNullable, 111 IsNullIfEmpty, 108 JobSchedule klase, 381 LastRunDate, 468 LocalConnectionString, 499 LoggingMode, 371 LoggingOptions.EventFilter, 371 Login, 269 ManagedComputer klase, 321 MaxByteSize, 107, 108, 110 MaxSize, 111 MergeSessionDetail, 475 MergeSessionSummary, 474 MergeSubscriberMonitor, 474 Name, 111, 453 NetSendAddress, 383 nizovi veze, SQL Server Mobile, 499 OnNullCall, 114 Options, 528 Options.WithDependencies, 310 PagerAddress, 383 PerformanceQueryInterval, 423 poslova, 377 poslovi, enumeriranje, 360 Precision, 111 ProtocolName, 424 ProxyName, 386 Publication, 464 PublicationDBName, 461 PublicationName, 453, 461 Publisher, 464 PublisherDatabase, 464 PublisherName, 461 PublisherSecurityMode, 465 QuantumDuration, 423 ReplicationType, 465 RETENTION, 400 RootTag, 140 Scale, 111 SourceObjectName, 453 SourceObjectOwner, 453 SQL Server Mobile, modificiranje, 503 SqlBulkCopy klase, 529 SqlCeEngine, 501 SqlCeException, 506 SqlExecutionModes, 250

SqlFacet atributa, 112 SqlXmlAdapter klase, 133 SqlXmlCommand klase, 131 SqlXmlParameter klase, 132 Status, 468 SubscriberId, 435 SubscriberType, 461 SubscriptionQuantumLimit, 423 SystemMessages, 283 Timeout, 528 TriggerAction, 119, 126 UpdateBatchSize, 544 User, 271 UserData, 528 uzbune, 384 VacuumRetentionAge, 423 ValidationMethod, 110 Variables, 364 XslPath, 140 SynchronizeWithJob( ), metoda, 467 „sync“, element, 151 sys.assemblies, kataloški pogled, 71 sys.assembly_files, kataloški pogled, 71 sys.assembly_modules, kataloški pogled, 72 sys.assembly_references, kataloški pogled, 72 sys.assembly_types, kataloški pogled, 72 SystemMessages, svojstvo, 283

T T-SQL (Transact-SQL), 1 DDL okidači, 53-57 metapodaci, 57 poboljšanja jezika, 32-48 funkcije za rangiranje, 48-51 obrada pogrešaka, 51-53 tipovi podataka, 30-32 velike vrijednosti, 30-32 xml, 30 Table Designer, 16 tableName, 177 TABLESAMPLE, klauzula, 35 tablice Add Table, dijaloški okvir, 13 baze podataka, provjera integriteta, 247 činjenica, 479 CREATE TABLE, naredba, 163 CTE-ovi, 37 dimenzije, 478, 479 filtrirani čvor tablica, 12 rubne, oblikovanje, 177 SMO klase, 257 targetNamespace, 190

tekst, Full-Text Search, 284-285 Template Explorer, 20-23 testiranje CLR rutina, 92 TestLogin SQL Server, korisnički račun za prijavljivanje, 272 Timeout, svojstvo, 528 tipovi, 107 CLR rutina, 62 poruke, Service Broker, 388 SSIS konfiguriranje paketa, 349 upravitelji konekcijama, 347 UDA, 109-118 UDT, 83-84 za podatke velikih vrijednosti, 534 .NET, 90 tipovi podataka, 1 FOR XML, klauzula, 206 SMO, klase, 264 T-SQL, 30-32 velike vrijednosti, 30-32 xml, 30 velike vrijednosti, 534 xml, 162 instance, 167-172 metode, 172-176 ograničenja, 166 stupci, 163-165 varijable, 165 tipovi podataka za velike vrijednosti (T-SQL), 30-32, 534 tok podataka komponente, SSIS, 343, 346 poslovi, SSIS, 345 programiranje, 371 TOP, klauzula, 33 Transact-SQL (pogledajte T-SQL) transakcije, izolacija snimaka u, 534 Transfer, klasa, 309-311 TransferData( ), metoda, 311 transformacija, SSIS komponenata toka podataka, 347 TriggerAction, svojstvo, 119, 126 tvornice, ADO.NET, 509-516 TYPE, 202

U učitavanje paketa, SSIS, 353 ugošćeni pružatelji događaja, 405 rad sa, 432 ugovori, Service Broker, 389, 394 stvaranje, 397

Kazalo | 567

uklanjanje baza podataka, SQL Server Mobile, 503 funkcija, 79 indeksa, 185 kolekcija XML shema, 188 krajnjih točaka, 229 okidača, 86 pohranjenih procedura, 81 sklopova, 75 tipova, 84 UDA funkcija, 82 uklanjanje pogrešaka iz CLR rutina, 92 uključivanje baza podataka za objavljivanje, 449 CLR integracije, 61 uloge, 291 baze podataka, SMO klase, 290 enumeriranje, 274 poslužitelji, 290 čvor Security, 18 SMO klase, rad sa, 273 Uniform Resource Locator (pogledajte URL) Uniform Resource Name (pogledajte URN) Universal Coordinated Time (UTC), 434 UNPIVOT, operatori, 42 UnsubscribeAllEvents( ), metoda, 252 UnsubscribeFromEvents( ), metoda, 252 UpdateBatchSize, svojstvo, 544 UpdateGrams, 150-153 upiti ad hoc, podrška za, 216 baze podataka, SASS, 487-490 CROSS APPLY, 46 DAT, 25 izvođenje, 133 MDX, 482 New Query, opcija izbornika, 66 osi, 482 parametri, primjena, 134 predlošci, XML, 146-150 SASS, 480-486 statistike, 278 stvaranje, 13 xml tip podataka, 163 XQuery, 193 upravljanje agenti, 469 AMO, 493 aplikacije baze podataka, 440 Notification Services, 423 baze podataka instance, 438

568 | Kazalo

SQL Server Mobile, 501-503 članci, 455 čvor Notification Services, 19 čvor Replication, 19 čvor Server Objects, 18 distributeri, 433 formateri sadržaja, 430 HTTP krajnje točke, 218-231 instance Notification Services, 422 izdavači, 449 kanali isporuke, 424 klase obavješćivanje, 429 SQLXML 4.0, 130-142 kolekcije XML shema, 186-193 korisnički računi, 269 kronike, 426 metode za obradu poslovne logike, 477 monitori, 476 NMO, 404 objekti SASS, 493-495 odredišni poslužitelji, 386 poslužitelji, dopuštenja, 275 posrednički računi, 386 praćenja, 25 pravila, 273 pretplate, 426, 465 pretplatnici, 461 protokoli, 430 pružatelji događaja, 432 publikacije, 451 raspored čišćenja, 434 replikacije, agenti, 472 Report Manager, 329 RMO, 442-477 Service Broker objekti, 393 usluge, 394 sklopovi, 73-76 SMO, 234-237 klase, 255-266 objekti za pohranu podataka, 238-255 programiranje, 267-285 reference onih koji se ne koriste za pohranu podataka, 286-297 SMO klase, korisnici, 271 Solution Explorer, 23 SQL Server Agent poslovi, 378 SQL Server Configuration Manager, 24 SQL Server Management Studio, 8-24 stavke replikacije, 457 Template Explorer, 20-23

URN adrese, 302 uzbune, 384 veze dodavanje, 356 SSIS, 347 URL (Uniform Resource Locator) pristup, 329-335 URN (Uniform Resource Name), 299 rad sa, 302 User, svojstvo, 271 UserData, svojstvo, 528 UserDefinedFunctions, klasa, 99 usluge ContactNotification, 527 Integration Services, 343 pokretanje/zaustavljanje, 325 Report Server Web usluga, 336-341 Service Broker, 389 implementiranje, 396-401 rad sa, 394 SQL Server Configuration Manager, 24 SQL Server Surface Area Configuration, 25 SSIS, 343-350 alati, 350 programiranje, 351-374 StockWatch, 416 zadatak Analysis Service, 346 usporedba skalarnih vrijednosti i skupova rezultata, 41 UTC (Universal Coordinated Time), 434 uzbune rad sa, 19 SQL Server Agent, izrada, 383 uzimanje asinkrona obrada, 516-523 nizovi za povezivanje, 515 objekata XmlReader klase, 137 povijesti agenta, 468 sheme, 491-493 statistika pružatelja, 537

V VacuumRetentionAge, svojstvo, 423 validacija dopuštenja objekta, 47 paketa, SSIS, 359 pretplatnika, 472 ValidateSubscription( ), metoda, 473 ValidationMethod, svojstvo, 110 VALUE, indeksi, 180 value( ), metoda, 173 vanjski ključevi, SMO klase, 259 varbinary, tip podataka, 31

varbinary(max), 534 varchar, tip podataka, 31 varchar(max), 534 variableName, 197 Variables, svojstvo, 364 varijable SSIS, 350 primjena, 363 xml tipovi podataka, 165 verifikacija baza podataka, 502 veze, 239-241 baza podataka, sheme otkrivanja, 540-542 dopuštenja, 232 MARS, 528-529 nizovi dodavanje, 514 uzimanje, 515 Object Explorer, 10-20 poslova, 361 rad sa dodavanje, 356 SSIS, 347 SQL Server Mobile, 499 Visual Studio 2005, 27 Visual Studio.NET, izrada SMO aplikacija, 236 vjerodajnice čvor Security, 18 SMO klase, 295 vrijednosti funkcija tabličnih vrijednosti, 45 naredbe, parametri, 332 rotiranje, 42 skalarne, uspoređivanje, 41 tipovi podataka za velike vrijednosti, 534 zamjena vrijednosti naredbi, 200 vrijeme izvedbe događaji, SSIS, 348 Integration Services, 343

W WaitAll( ), metoda, 520 WaitAny( ), metoda, 520 WAITFOR, naredba, 517 Web Service Definition Language (WSDL), 211 Web usluge izvorne XML elementi svojstveni jeziku, 228 HTTP krajnje točke, 218-231 otvoreni standardi, 210 SOAP poruke, 217 stvaranje, 211 Web metode, izlaganje, 217 Report Server, 336-341

Kazalo | 569

WHERE, klauzula, 482 operatori, 40 Windows Management Instrumentation (pogledajte WMI) WMI (Windows Management Instrumentation), 318-326, programiranje .WRITE, klauzula, 31 WriteToServer( ), metoda, 532 WSDL (Web Service Definition Language), 211

X XML (Extensible Markup Language) DML, 197-201 FOR XML, klauzula, 135, 201-208 indeksiranje, 180-185 izvorne Web usluge HTTP krajnje točke, 218-231 otvoreni standardi, 210 SOAP poruke, 217 stvaranje, 211 Web metode, izlaganje, 217 kataloški pogledi, 208 podrška, 2 relacijski podaci, 176-179 sheme rad sa, 186-193 SMO klase, 293 skupovi rezultata obrada na klijentu, 137 primjena XSLT transformacija, 139 SQLXML 4.0, 130 anotirane sheme preslikavanja, 141-146 DiffGrams, 153-156 predlošci upita, 146-150 UpdateGrams, 150-153 upravljane klase, 130-142

570 | Kazalo

xml tip podataka, 162 instance, 167-172 metode, 172-176 ograničenja, 166 stupci, 163-165 varijable, 165 XQuery, 193 XML Schema Definition (pogledajte XSD) XMLA (XML for Analysis), 481, 483 XMLDATA, 202 xmlSchemaCollectionName, 189 xmlText, 178 xml_column_name, 182 xPathNamespaces, 178 XQuery, 193 izrazi, 173, 199 „xs:annotation“, element, 145 „xs:appinfo“, element, 145 „xs:schema“, element, 141 XSD (XML Schema Definition), 186 „xsd:annotation“, element, 146 „xsd:simple“, element, 192 XslPath, svojstvo, 140

Z zahtjevi, SOAP, 217 zapisi, DiffGrams, 153 zaustavljanje usluga, 325 završne točke HTTP, 218-231 metapodaci, 233 provjera identiteta, 229 rad sa, 18 SMO klase, 292 znak jednakosti (=), 334

O autoru Bill Hamilton je programski arhitekt koji se bavi projektiranjem, izradom i implementiranjem distribuiranih aplikacija u .NET i J2EE tehnologijama. Zadnjih deset godina radi kao savjetnik za B2B, B2C i B2E poslovanje, integraciju podataka i izradu portala u bankarstvu, trgovini, industriji i financijama. Za svoje klijente vrednuje i preporučuje odgovarajuće tehnologije, te im pomaže pri njihovoj implementaciji. Samostalno je razvio te sudjelovao u razvoju nekoliko nagrađenih softverskih paketa. Koautor je knjige ADO.NET in a Nutshell i autor knjiga ADO.NET Cookbook i NUnit Pocket Reference, obje u izdanju O’Reilly Media Inc.

O knjizi Izgled naših knjiga nastao je na temelju komentara čitatelja, vlastitog iskustva i informacija iz distribucijskih kanala. Jedinstveni omoti dopunjuju se s našim jedinstvenim pristupom tehničkim temama, dajući osobnost i živost potencijalno monotonim temama. Životinja na omotu knjige Programiranje SQL Server 2005 je arktički bakalar. Arktički bakalari (Boreogadus saida) žive u ledenim vodama Rusije, Grenlanda, Kanade i Aljaske. Manji su i tanji od svojih rođaka, atlantskih bakalara. Raspoznaju se po razdvojenoj repnoj peraji te malom brku ispod isturene donje vilice. Malo se zna o životu arktičkog bakalara budući da se mrijesti između slojeva leda tijekom jeseni i zime u vodama Kanade, te u siječnju i veljači u vodama Rusije. Ženke polažu između 9 000 i 21 000 jajašaca koje zatim izvana oplođuju mužjaci. Arktički bakalar spolno je zreo u dobi od tri godine. Prosječne je duljine od 30 centimetara, iako može narasti i do 40 centimetara. Težina ribe ovisi o njenoj veličini, tako da 10 centimetara dug arktički bakalar teži manje od 30 grama, a 30 centimetara dug bakalar više od 170 grama. Arktički bakalari u sjevernim vodama teži su od svojih južnih rođaka. Obitava na različitim dubinama, sve do 900 m. Na otvorenom moru pliva u jatu, a uz površinu vode u manjim skupinama. Nastanjuje i uske prolaze između slojeva leda koji ga štite od većih grabežljivaca poput tuljana. Odrasli arktički bakalari imaju sitne ljuske i gotovo su u cijelosti smeđi sa crnim točkama. Imaju tamne, gotovo crne, peraje s blijedim rubom i bijelom crtom koja se proteže postrance, od glave do repne peraje. Životni vijek arktičkih bakalara je šest godina i znanstvenici ga mogu utvrditi brojanjem prstenova u ušnim kostima. Arktički bakalari najviše se hrane planktonom – sitnim biljkama i životinjama koje plutaju pri površini oceana. Planktoni predstavljaju važnu kariku u hranidbenom lancu o kojoj ovise narvali, beluge i morske ptice. Slika na omotu preuzeta je iz knjige Wood’s Animate Creation. Tekst omota je ispisan pismom Adobe ITC Garamond. Glavni tekst ispisan je pismom Linotype Birka, naslovi pismom Adobe Myriad Condensed, a odlomci koda pismom TheSans Mono Condensed.

Priprema za zaranjanje u SQL Server 2005

Baze podataka/SQL Server

Programiranje SQL Server 2005

upotrebe novog alata za rad s bazama podataka. Napisana za čitatelje svih razina znanja, ova knjiga ne zahtijeva poznavanje SQL Servera 2000, jer se programiranje SQL Servera 2005 u gotovo svakom dijelu razlikuje od rada s prethodnom inačicom. Budući da objašnjava sve detalje programiranja SQL Servera 2005, ova je knjiga idealna za programere sa malo ili nimalo iskustva u SQL programiranju, ali i odličan alat za iskusne programere koji se spremaju za uvođenje novih programskih modela koje donosi SQL Server 2005. Posebice, Programiranje SQL Server 2005 pruža detaljan pregled novih programskih značajki koje se odnose na RDBMS. Među njima su i sljedeće:



Upotreba .NET CLR sklopova za stvaranje SQL Server objekata kao što su pohranjene procedure i okidači.



Izrada većine SQL SMO objekata za izradu, modificiranje i brisanje baza podataka te manipuliranje bazama podataka, tablicama i drugim SQL Server objektima.



Izgradnja izvornih Web usluga.

Programiranje SQL Server 2005 obuhvaća i teme kao što su SQL Server Management Studio, poboljšanja T-SQL-a, korisnički definirane funkcije, xml tip podataka, SASS, SSIS, SSRS, usluge obavješćivanja, posrednik usluga, RMO, SQL Server Agent te SQL Server Mobile Edition.

Programiranje

SQL Server 2005

Hamilton

Bill Hamilton je autor knjige ADO.NET Cookbook. Programski je arhitekt specijaliziran za projektiranje, razvoj i implementiranje poslovnih aplikacija upotrebom tehnologija .NET i J2EE. U proteklih petnaest godina Bill je pružao savjetničke usluge za integraciju B2B, B2C, B2E poslovnih aplikacija, razvijao portale i poslovne aplikacije prema zahtjevima korisnika iz područja financija, prodaje, usluga i proizvodnje. Osim ove, napisao je i knjigu NUnit Pocket Reference te je koautor knjige ADO.NET in a Nutshell, obje u izdanju O’Reilly. Autor je i mnogih članaka za Microsoft Developer Network.

Programiranje

Programiranje SQL Server 2005 je sveobuhvatan izvor koji pomaže da svladate brojne detalje

SQL Server 2005

SQL Server 2005, Microsoftovo rješenje nove generacije za pohranu i analizu podataka, veliki je korak naprijed. Donosi ogroman broj promjena koje pružaju pojačanu sigurnost i skalabilnost i stoga čine SQL Server kompletnim alatom za obradu podataka. Ako se koristi na pravi način, SQL Server 2005 može pomoći organizacijama svih veličina da uspješno čuvaju i organiziraju podatke te da rade s njima.

„Prakticˇan uvod u sve aspekte programiranja SQL Servera 2005.“ —Narayana Vyas Kondreddi, Microsoft SQL Server MVP

PROFESION A LN A I N F O R M A T I Cˇ K A LITERATURA

www.itexpertbooks.com ISBN 953-95207-5-4

IT profesionalci za IT profesionalce

omot_SQS5.indd 1

y(7IJ5D9*PMKRPN(

IT profesionalci za IT profesionalce

Bill Hamilton

23.5.2006 13:28:33

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF