Programowanie bazodanowe w.net czyli SQL CLR w akcji
CZYLI Lekka i bezstresowa sesja - będzie poświęcona programowaniu SQL server od strony.net i możliwościom, DALIŚCIE jakie SIĘ to podejście oferuje. Nie będzie żadnego LINQ ani Entity Framework. NABRAĆ Zaglądniemy do tematu od zupełnie innej, mało znanej strony. 2
Damian Widera d.widera@lgbs.pl @Damian.Widera http://sqlblog.com/blogs/damian_widera/default.aspx
5
Damian Widera http://channel9.msdn.com/series/konfiguracja-sql-2014-z-microsoft-azure
Damian Widera
http://1drv.ms/11dof7f Agenda Czym jest, a czym nie jest SQLCLR Co może zrobić SQLCLR, a nie potrafi TSQL Piszemy kod Tak NIE piszemy kodu. Bezpieczeństwo rozwiązania (krótko)
Ankieta 100 200 300 400 500
Tak zaczyna się ta historia. SQL Server 2005 Microsoft integruje.net runtime z silnikiem bazodanowym (v.2.0..) Runtime to CLR (Common Language Runtime) Integracja pozwala na uruchomienie kodu.net w kontekście zapytania
Tak zaczyna się ta historia. Development Różne typy obiektów Funkcje, procedury, agregaty, typy, wyzwalacze. Deployment Utworzenie / podmiana assembly, wygenerowanie skryptów aktualizujących Security Dostęp do obiektów
TSQL jest łatwy. więc dlaczego przy nim majstrować????? CREATE TABLE Tabela SELECT * FROM Tabela SELECT kolumna1, kolumna 2 FROM tabela UPDATE Tabela SET DELETE FROM Tabela. DROP DATABASE SHUTDOWN WITH NOWAIT
Czym nie jest SQLCLR Nie zastępuje języka T-SQL SQLCLR nie działa bezpośrednio z SQL Server Nie rozumie poleceń INSERT, UPDATE. Wymaga połączenia do bazy danych(*,**,***) Wykonywany jest poprzez wrappery Obiekty typu funkcja, procedura składowana itd
Czym nie jest SQLCLR (All or nothing) Wszystko albo nic Można uruchamiać kod CLR oraz kod TSQL w ramach np. jednej procedury składowanej Nie jest zawsze szybszy ani zawsze wolniejszy Są przykłady dobrego użycia (będzie dzisiaj) Są przykłady niedobrego użycia (będzie dzisiaj)
Co może zrobić SQLCLR Streaming TVF Funkcje inline napisane w TSQL są jak parametryzowane widoki Funkcji multiline pozwalają na bardziej skomplikowaną logikę Pisząc funkcję TSQL wynik jest zwracany dopiero po przygotowaniu całego zbioru (po wykonaniu) (*) SQLCLR może wysyłać dane NATYCHMIAST
Co może zrobić SQLCLR Dynamiczny SQL w ramach funkcji Uwaga wtedy wynik musi być przygotowany w całości zanim zostanie wysłany do klienta Multi Threading (w trybie unsafe) Obsługa błedów jak w.net Własne agregacje (ile ich jest w pudełku?) Własne typy danych Własne wyzwalacze
Co może zrobić SQLCLR Przechwytywanie informacji Komenda PRINT RAISERROR (severity 1-10) Równoległe wykonanie zapytań UDF, o ile ustawimy IsDeterministic=1 i nie ma dostępu do danych
Co może zrobić SQLCLR Zastąpić xp_cmdshell Łatwiejsze przekazywanie parametrów (bo xp_cmdshell przyjmuje tylko 1 parametr) Można zwrócić więcej niż jedną kolumnę Nie trzeba parsować wyniku Kod SQLCLR jest zachowywany w kopii zapasowej Impersonacja xp_cmdshell może się uruchomić tylko w kontekście SQL Server lub konta proxy
xp_cmdshell not beautiful anymore CREATE TABLE #DirResults (Diroutput VARCHAR(500)) INSERT #DirResults EXEC master.dbo.xp_cmdshell 'dir d:\mssql7\binn\bcp.exe' IF EXISTS(SELECT * FROM #DirResults WHERE DirOutput LIKE '%bcp.exe%') PRINT 'bcp.exe does exist' ELSE PRINT 'bcp.exe does not exist'
SqlContext SqlContext is a class that gives us access to four members: IsAvailable Pipe TriggerContext WindowsIdentity IsAvailable indicates whether the other members can be used
SqlContext.Pipe Pipe is the main point of interaction with the SQL Server when returning result sets or messages Messages can be sent to the client using the Send(string) function: SqlContext.Pipe.Send( Hello World ); Single row result sets can be sent using the Send(SqlDataRecord) function.
SqlContext.TriggerContext TriggerContext gives you access to: ColumnCount number of columns in the target table EventData SqlXml that returns the same as the EVENTDATA T-SQL function TriggerAction a TriggerAction enumeration value that specifies which action caused the trigger to fire IsUpdatedColumn method that determines if a column was updated same as the T-SQL UPDATE() function but what about the inserted and deleted virtual tables that are available in normal triggers?
SqlContext.WindowsIdentity This returns a standard System.Security.Principal.WindowsIdentity object The property can only be used under EXTERNAL_ACCESS or UNSAFE permission sets For 99% of CLR work, using this property is not required
Context Connection To access data from within CLR code, the special context connection connection string is used (**,***) using (SqlConnection connection = new SqlConnection("context connection=true")) { connection.open();... } We can then run any SQL statement as we would normally from.net
Piszemy i tłumaczymy kod UDF skalarna Procedura składowana DEMO
Assemblies, domains AppDomain / DB / Owner One for runtime and one for the DDL (will be unloaded)
Abnormal conditions
Trzy tryby Bezpieczeństwo
Bezpieczeństwo
Bezpieczeństwo
DEMO Tak NIE piszemy kodu, czyli horror w zaledwie 4 linijkach
UDF - Tablicowa Muszą być zaimplementowane 2 metody IEnumerable lub IEnumerator zwracający dane (np. List<>) FillRow Czyli uformowanie konkretnego wiersza zgodnie z definicją zwracanej tabeli Często dodatkowa struktura operacje rzutowania Object na konkretny obiekt biznesowy
UDF Tablicowa Wydajność DEMO
Podsumowanie Należy poznać elementy oraz składniki integracji Kreatywne rozszerzanie możliwości oferowanych przez SQL Server Zwłaszcza obszary do tej pory niedostępne Kod kontrolowany przez SQL Server napisany w.net (C#, VB, C++)