SQL Server 2005 και CLR, μέρος #1: Managed User-Defined Functions


Ο SQL Server 2005 έχει πολλά νέα χαρακτηριστικά. Πολλά από αυτά είναι εμφανή, πολλά άλλα είναι κάτω από το καπό. Μερικά από αυτά είναι τόσο σημαντικά, που ακόμη δεν έχουμε συλλάβει τις αλλαγές που σηματοδοτούν στον τρόπο που γράφουμε εφαρμογές σήμερα.

Ένα τέτοιο χαρακτηριστικό είναι η δυνατότητα να γράφουμε κώδικα σε οποιαδήποτε γλώσσα προγραμματισμού δουλεύει στο .NET CLR, εκεί που μέχρι σήμερα δεσμευόμασταν με την T-SQL. Κατά την ταπεινή μου γνώμη μου είναι το σημαντικότερο χαρακτηριστικό του SQL Server 2005. Το θέμα έχει πολύ background και πολλά θεωρητικά για να συζητήσουμε, ωστόσο θα ξεκινήσουμε με ένα απλό παράδειγμα και πάνω σε αυτό μπορούμε να επεκταθούμε.

Θα φτιάξουμε ένα UDF χρησιμοποιώντας VB.NET. Μπορούμε να ξεκινήσουμε το Visual Studio 2005 και με New Project, επιλέγουμε τη γλώσσα προτίμησης και στην ομάδα Database, επιλέγουμε SQL Server Project. Δίνουμε το κατάλληλο όνομα στο project και κατόπιν εμφανίζεται ένα παράθυρο με το οποίο επιλέγουμε ένα Database Reference (αν δεν έχουμε κανένα, τότε εμφανίζεται το αντίστοιχο dialog για να δημιουργήσουμε) που υποδηλώνει σε ποια database θα δουλέψουμε. Το Visual Studio θα δημιουργήσει το Solution με το Project και κάποια βασικά αρχεία μέσα σε αυτό που θα δούμε τη χρησιμότητά τους παρακάτω.

Πάνω στο όνομα του project κάνουμε δεξί κλικ και επιλέγουμε Add User Defined Function. Αφήνουμε ως όνομα το Function1.vb και ανοίγει ο κώδικας της UDF που προσθέσαμε. Θα παρατηρήσετε ότι είναι έτοιμος κώδικας από ένα UDF που επιστρέφει το “Hello”. Για αρχή μας αρκεί. Η μοναδική αλλαγή που θα κάνουμε είναι να αλλάξουμε το attribute “<Microsoft.SqlServer.Server.SqlFunction()> _” σε “<Microsoft.SqlServer.Server.SqlFunction(“SayHello”)> _”. Αυτό ήταν! Μόλις φτιάξαμε ένα managed UDF.

Για να δοκιμάσουμε το δημιούργημά μας έχουμε δύο επιλογές. Η πρώτη είναι να κάνουμε Deploy το Project/Solution. Πράγματι, αν το κάνουμε αυτό και κατόπιν ανοίξουμε το Management Studio, θα εμφανιστεί το UDF ως scalar-valued Function στο group Programmability. Θα παρατηρήσετε ότι ο default owner του UDF είναι ο dbo γιατί ό,τι γίνεται deploy από το VS μπαίνει σε αυτό το schema. Για να τρέξουμε αυτό το UDF θα πρέπει πρώτα να ενεργοποιήσουμε τη δυνατότητα για εκτέλεση managed κώδικα, που για λόγους security είναι απενεργοποιημένη. Για να γίνει αυτό δίνουμε:

sp_configure 'clr enabled', 1 
GO 
RECONFIGURE 
GO

οπότε πλέον μπορούμε να πούμε

USE Northwind 
SELECT dbo.SayHello()

Το όνομα του UDF είναι αυτό που καθορίσαμε στο SqlFunction attribute. Αν δεν είχαμε καθορίσει τίποτα εκεί, το όνομα θα ήταν Function1.

Η δεύτερη επιλογή για να δοκιμάσουμε το UDF είναι να γράψουμε το SELECT (ή ό,τι άλλο κώδικα T-SQL χρειάζεται) στο αρχείο Test.sql που υπάρχει στο project μας και εξυπηρετεί ακριβώς αυτόν το σκοπό. Αυτό το αρχείο τρέχει αν ξεκινήσουμε το debugging. Μπορούμε να έχουμε πολλαπλά test scripts και να επιλέγουμε με δεξί κλικ και “Set as Default Debug Script” ποιο θα τρέχει με την έναρξη του Debugging.

Διάφορα αξιοσημείωτα

  • Όταν φτιάχνουμε ένα managed object μέσω template τότε δημιουργείται ένα partial class ώστε αν φτιάξουμε πολλαπλά objects να έχουμε τον κώδικα σε ξεχωριστά αρχεία, άλλα όλα μαζί σε μία κλάση.
  • Κάθε managed object που δημιουργούμε είναι και ένα Shared Function/Sub (Static στη C#) έτσι ώστε να μην χρειάζεται instance της κλάσης για να χρησιμοποιηθεί. Αυτό συνεπάγεται τον εξής περιορισμό: Μέσα σε ένα Shared Function/Sub μπορούμε να χρησιμοποιήσουμε μόνο shared objects. Δηλαδή ο παρακάτω κώδικας θα χτυπήσει κατά το compilation
    Public Class UserDefinedFunctions1 
        Public Class test 
            Public Val As Integer 
        End Class
    
        Dim t As New test
    
        <Microsoft.SqlServer.Server.SqlFunction()> _ 
        Public Shared Function Function1() As SqlString 
            ' Add your code here 
            t.Val = 5 
            Return New SqlString("Hello") 
        End Function 
    End Class

Σε προσεχές post θα δούμε κάτι πιο χρήσιμο πέρα από το Hello κι επίσης θα εξετάσουμε τη δημιουργία κι άλλων τύπων managed objects όπως stored procedures, triggers, κλπ.

Advertisements


Σχολιάστε

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s