Jump to content

antonch

Administrators
  • Posts

    1030
  • Joined

  • Last visited

  • Days Won

    7

Blog Entries posted by antonch

  1. antonch
    Την προηγούμενη εβδομάδα έγινε το SQL PASS SUMMIT 2011 στο Seattle. Στο keynote o Ted Kummert έκανε διάφορες ανακοινώσεις μία από αυτές ήταν ότι το τελικό όνομα για τα SQL Server Developer Tools με την κωδική ονομασία Juneau θα είναι SQL Server Data Tools (SSDT).
     
    Όμως πέρα από την ονομασία ας δούμε μερικά χαρακτηριστικά των SSDT
    Θα είναι διαθέσιμο σε όλους τους SQL Server users σαν free component!!! Θα παίζει με SQL Server 2005, 2008, 2008 R2, 2012 και Azure! Θα γίνεται update κάθε 4-6 μήνες ακολουθόντας τα updates του SQL Azure. Θα είναι hosted στο Visual Studio 2010 SP1 shell. Θα είναι ο αντικαταστάτης των database tools & projects στην επόμενη έκδοση του Visual Studio. Τέλος η full έκδοση θα είναι διαθέσιμη Online με την χρήση του Web Platform Installer
  2. antonch
    Όπως φαντάζομαι είναι ήδη γνωστό ο SQL Server ‘Denali’ απέκτησε πλέον επίσημο όνομα και αυτό είναι το SQL Server 2012. Θα είναι διαθέσιμος σαν τελικό προϊόν στο πρώτο εξάμηνο του 2012.
    Όπως είναι φυσικό αυτό έχει άμεσες επιπτώσεις στα σεμινάρια αλλά και στις πιστοποιήσεις και στα exams αυτών. Ας δούμε τι σεμινάρια έχουν προγραμματιστεί να βγουν σαν σεμινάρια και εξετάσεις.
    Title Course Exam Administering a Microsoft SQL Server 2012 Database 10775 70-462 Building Data Warehouses with Microsoft SQL Server 2012 10777 70-463 Developing a Microsoft SQL Server 2012 Database 10776 70-464 Designing Database Solutions for SQL Server 2012 10778 70-465 Implementing Data Models and Reports with Microsoft SQL Server 2012 TBD 70-466 Designing Business Intelligence Solutions with Microsoft SQL Server 2012 Platform TBD 70-467 Το ποιο σημαντικό όμως είναι ότι πλέον δεν θα χρειάζεται να παρακολουθήσεις περισσότερα από ένα σεμινάριο ώστε να δώσεις εξετάσεις ακολουθεί πλέον την λογική 1:1, αλλά τα exams πλέον θα είναι ποιο δύσκολα και το σημαντικότερο ίσως όλων είναι ότι για να περάσεις θέλει πραγματική εργασία στο προϊόν
    Πηγή : Microsoft Learning
  3. antonch
    Το πρόβλημα
    Σαν DBA και ειδικά σε enterprise environments έχουμε το καθήκον να διαχειριζόμαστε ένα αρκετά σημαντικό αριθμό από SQL Server instances που υπάρχουν διάσπαρτα μέσα στο οργανισμό ή την εταιρεία στην οποία εργαζόμαστε. Αυτό σημαίνει ότι πρέπει καθημερινά να παρακολουθούμε την πορεία αυτών των instances ώστε προληπτικά και όχι πυροσβεστικά να δίνουμε λύσεις σε issues που τυχόν θα εμφανιστούν.
    Για να μπορώ όμως σαν DBA να έχω την εικόνα όλων των instances που διαχειρίζομαι θα πρέπει να τα παρακολουθώ ξεχωριστά και αυτό είναι ένας μεγάλος καθημερινός πόνος. Λύσεις για αυτό υπάρχουν πολλές. Τόσο η Microsoft όσο και third party vendors μας παρέχουν σουίτες εργαλείων που μας βοηθούν στο συγκεκριμένο task. Φυσικά αυτό σημαίνει έξτρα κόστος και αξία έχει να το επωμιστώ εφόσον έχω και αλλά πράγματα που θέλω να παρακολουθώ με την χρήση τους. Αν έχω όμως ή θέλω μόνο να παρακολουθώ SQL Server instances αξίζει να επωμιστώ το κόστος;
    Το εργαλείο
    Κατά την άποψη μου όχι καθώς έχω πληθώρα από εργαλεία που ο SQL Server μου δίνει. Ένα από αυτά που δεν είναι και τόσο δημοφιλές (κακώς κατά την άποψη μου), και είναι διαθέσιμο στις Datacenter και Enterprise εκδόσεις τους SQL Server 2008 R2, είναι το SQL Server Utility (SSU).
    To SSU δίνει την δυνατότητα στο DBA να μοντελοποιήσει όλα τα instances που έχει υπό την προστασία του μέσα στην εταιρεία, ώστε μέσω ενός unified view να μπορεί να έχει μια ολιστική εικόνα των resources που το κάθε instance έχει, συγκεντρωτικά ή αναλυτικά μέσω των SQL Server Utility viewpoints. Όλα αυτά μέσα από το γνώριμο σε αυτόν περιβάλλον που δεν είναι άλλο από το SQL Server Management Studio (SSMS).
    Πως λειτουργεί
    Θεμέλιο στην λειτουργία του SSU είναι η δημιουργία ενός κεντρικού σημείου στο οποίο θα συγκεντρώνονται σε τακτά χρονικά διαστήματα (το default interval είναι κάθε 15 λεπτά) στοιχεία που αφορούν SQL Server instances, Data-tier applications, Database files και Storage volumes. Το σημείο αυτό ονομάζεται Utility Control Point (UCP).
    Στην πραγματικότητα το UCP δεν είναι τίποτα περισσότερο από μια database που δημιουργείται στο instance που έχω επιλέξει σαν σημείο συγκέντρωσης των δεδομένων και παίζει το ρόλο ενός data warehouse.
    Από την στιγμή που ο DBA ορίσει το UCP θα πρέπει να εντάξει σε αυτό τα instance που θέλει να παρακολουθεί ώστε να αρχίσει η συγκέντρωση δεδομένων από αυτά και η αποστολή τους προς το UCP.
    Τα δεδομένα που αποστέλλονται από το κάθε instance προς το UCP αφορούν παράγοντες που είναι σημαντικοί για την λειτουργία ενός SQL Server όπως CPU utilization, Storage space utilization.
    Το σημαντικότερο όμως δεν είναι η απλή καταγραφή που έτσι και αλλιώς έχουμε και άλλους τρόπους με τους οποίους μπορούμε να την υλοποιήσουμε όσο η δυνατότητα να συγκρίνουμε τα καταγεγραμμένα αυτά δεδομένα με polices τις οποίες μπορούμε να ορίσουμε μέσα σε αυτό (SSU) είτε καθολικά για όλα τα instances είτε για το κάθε ένα ξεχωριστά. Αυτά αφορούν τις εξής κατηγορίες:
    Instance CPU utilization policies για SQL Server instances και data-tier applications. File space utilization policies για database και log files. Computer CPU utilization policies για host resources Storage volume utilization policies για host resources H συλλογή, αποστολή, επεξεργασία των δεδομένων γίνεται με την χρήση jobs που δημιουργούνται στο κάθε instance που συμμετέχει και για το λόγο αυτό είναι υποχρεωτική η ενεργοποίηση του SQL Server Agent στο κάθε ένα ξεχωριστά το οποίο μάλιστα θα πρέπει να ξεκινάει με domain account.
    Στην παρακάτω εικόνα (κλεμμένη από τα BOL) βλέπουμε μια επισκόπηση της λειτουργίας-αρχιτεκτονικής που το εργαλείο χρησιμοποιεί ώστε να επιτύχει τον σκοπό του.

    Απαιτήσεις
    Φυσικά για την χρήση του SSU υπάρχουν κάποιες απαιτήσεις για τα instance τα οποία μπορούν να συμμετέχουν στην ενημέρωση των στοιχείων και αυτές είναι
    Τα SQL Server instances πρέπει να είναι έκδοσης 10.50 (SQL Server 2008 R2) ή μεγαλύτερη, μπορούμε όμως να έχουμε και 10.00 (SQL Server 2008) αρκεί σε αυτή να έχουμε το SP2. Καταγράφονται πληροφορίες μόνο για τα Database Engine instance και μόνο αυτά μπορούν να μπουν. Το SSU πρέπει να λειτουργεί με Windows domain account. Τα accounts του SQL Server service στο UCP αλλά και σε όλα τα instances που στέλνουν δεδομένα πρέπει να έχουν read permission στους Users στο Active Directory. Απαιτήσεις όμως έχει και το instance το οποίο θα παίζει το ρόλο του UCP και αυτές είναι:
    Η SQL Server edition πρέπει να είναι Datacenter, Enterprise, Developer, ή Evaluation. Πρέπει να υπολογίζουμε περίπου 2GB χώρου στην UCP database (sysutility_mdw) για κάθε managed instance το χρόνο. Ακόμα
    Εάν το UCP instance είναι σε case-insensitive collation τότε όλα τα managed instances του SQL Server πρέπει και αυτά να είναι σε case-insensitive collation. Προτείνετε το UCP instance είναι σε case-sensitive collation Τέλος FILESTREAM data δεν υποστηρίζονται στο SSU. Επίλογος
    Προσωπικά πιστεύω ότι το συγκεκριμένο εργαλείο θα πρέπει να τύχη της προσοχής σας για αυτό και αξίζει να του δώσετε μια ευκαιρία δοκιμάζοντας το. Δεν σας γράφω λεπτομερείς οδηγίες χρήσης αν και μου ήταν εύκολο και αυτό γιατί όλα όσα θέλετε να μάθετε για την χρήση του υπάρχουν στα BOL στο link αυτό Managing the SQL Server Utility
  4. antonch
    Με μια ανακοίνωση που ακολουθεί η Microsoft παρουσίασε τον Microsoft SQL Server ODBC Driver for Linux. Διαλειτουργικότητα σε όλο της το μεγαλείο.


    Greetings Developer community:
    We heard yesterday and today at the PASS conference about the exciting new areas that we are investing in bringing the power of SQL Server to our customers. Many of our developers who rely on native connectivity to SQL Server primarily use ODBC for their connectivity needs. We have been supporting ODBC as a part of the SQL Native Access Client (SNAC) libraries. In our continued commitment to interoperability, today we also announced that we will be releasing the Microsoft SQL Server ODBC Driver for Linux. We will be releasing first community technology preview (CTP) around mid-November and will be available along with SQL Server 2012 when it is released. Please look for announcement on our SQL Connectivity home page and SQL Server blog page.
    We will be showcasing Microsoft SQL Server ODBC Driver for Linux along with our Java and PHP solutions for SQL Server and Azure at PASS conference session “[AD-211-M] Developing Multi-Platform Applications for Microsoft SQL Server and Azure” on Thursday October 13th at 5:00PM at Washington State Convention Center Room #4C4. Also, if you have any questions or feedback on our multi-platform strategy as well as the entire gamut of support we provide to the application developers, I would encourage you to attend the PASS Panel Discussion with SQL Connectivity Leadership “[AD-101-M] SQL Connectivity Leadership Unplugged” on Friday, October 14, 2011, 2:30 PM - 3:45 PM at Washington State Convention Centre Room# 612 where I will be hosting a panel along with the rest of the leadership team that drives the strategy for our application platform.
    Thanks,
    Raghu Ram
    Principal Group Program Manager
    SQL Server
  5. antonch
    Όπως αρκετές φορές έχω αναφέρει, τρεις είναι οι παράγοντες που επηρεάζουν την λειτουργία ενός SQL Server και αυτοί είναι: Memory, CPU, I/O.
    Αρκετοί συνάδελφοι δηλώνουν λάτρεις των Dynamic Management Views (DMV) μεταξύ αυτών είμαι και εγώ , όμως το μυστικό σε αυτές είναι να τις χρησιμοποιείς έτσι ώστε να παίρνει από αυτές συνδυαστικά τις περισσότερες φορές τη μέγιστη δυνατή πληροφορία που αυτές μπορούν να σου σώσουν.
    Σε αυτό το post θα σας δείξω πως χρησιμοποιώντας μια εξ αυτών θα μπορέσουμε να αποφανθούμε αν έχουμε IO πρόβλημα στον SQL Server μας γενικά, αλλά και ειδικά σε ποια ή ποιες database(s).
    Δεν θα σας απασχολήσω με την γενική σύνταξη της DMV αυτής ούτε και το τι δείχνει, καθώς είναι εύκολο να το κάνει κάποιος τα BOL.
    Για λόγους καθαρά πρακτικούς όμως θα αναφέρω ότι η sys.dm_io_virtual_file_stats επιστρέφει Ι/Ο στατιστικά για τα database files.
    Εκτελώντας απλά ένα
    Query 1 select * from sys.dm_io_virtual_file_stats(null,null) θα πάρουμε ένα αρκετά μεγάλο, ανάλογα πάντα με τον αριθμό των βάσεων και τα αρχεία που έχουμε σε αυτές.
    Επίσης αρκετά μεγάλος είναι και ο αριθμός των πληροφοριών που μας επιστέφει η dmv αυτή. Έτσι κάπως εύκολα χάνεται κάποιος και δεν μπορεί να βγάλει το επιθυμητό αποτέλεσμα. Αν όμως αρχίσει να φιλτράρει το τι πληροφορία θα χρησιμοποιήσει από την DMV αυτή τότε πραγματικά θα πάρει το αποτέλεσμα που επιθυμεί. Αφού έχουμε διαβάσει από τα BOL το τι μας επιστρέφει αυτή εύκολα μπορούμε να υπολογίσουμε το I/O για κάθε database χρησιμοποιώντας τα num_of_bytes_read και num_of_bytes_written πεδία αυτής. Αυτό μπορεί να γίνει με το παρακάτω query
    Query 2 SELECT     DB_NAME(database_id) AS database_name,     CAST(SUM(num_of_bytes_read + num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB FROM     sys.dm_io_virtual_file_stats(NULL, NULL)-- AS d GROUP BY     database_id ORDER BY     2 DESC  
    Όμως θα ήθελα να έχω ακόμα μία στήλη που να μου δείχνει το ποσοστό Ι/Ο σε κάθε βάση σε σχέση με το συνολικό Ι/Ο που έχω. Έτσι το παραπάνω query διαμορφώνεται ως εξής:
    Query 3 WITH DB_IO_STATISTICS AS (   SELECT     DB_NAME(database_id) AS database_name,     CAST(SUM(num_of_bytes_read + num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB   FROM     sys.dm_io_virtual_file_stats(NULL, NULL)   GROUP BY     database_id ) SELECT   database_name,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO] FROM     DB_IO_STATISTICS ORDER BY     [% IO] desc;  
    Στις περισσότερες περιπτώσεις το παραπάνω query και το αποτέλεσμα του μας κάνει, και μπορούμε να εντοπίσουμε αυτές τις databases που έχουν πρόβλημα Ι/Ο. Όμως ποιο ή ποια είναι τα αρχεία από αυτή ή αυτές που πραγματικά έχουν πρόβλημα Ι/Ο, ώστε να τα μεταφέρουμε σε άλλο disk array; Απάντηση στο ερώτημα αυτό δίνει το παρακάτω query
    Query 4 WITH DB_IO_STATISTICS AS (   SELECT     DB_NAME(fs.database_id) AS database_name,     mf.name as logical_file_name,     CAST(SUM(fs.num_of_bytes_read + fs.num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB   FROM     sys.dm_io_virtual_file_stats(NULL, NULL) as fs   INNER JOIN     sys.master_files as mf on fs.database_id=mf.database_id and fs.file_id = mf.file_id   GROUP BY     fs.database_id,mf.name ) SELECT   database_name,   logical_file_name,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO] FROM     DB_IO_STATISTICS ORDER BY     [% IO] desc;  
    Από το παραπάνω εύκολα βλέπουμε ποιο file και σε ποια database έχει I/O issues. Όμως και αυτό δεν είναι αρκετό. Αν για παράδειγμα δούμε ότι κάποιο file έχει 80% Ι/Ο δεν σημαίνει απαραίτητα ότι είναι και προβληματικό. Για να μπορέσουμε να αποφανθούμε θα πρέπει να ελέγξουμε το πόσο περιμένει ή περιμένουν ο χρήστης ή οι χρήστες μέχρι να εκτελέσουν ένα read ή ένα write και αυτό διότι άλλο να είναι ένας χρήστης στην βάση και άλλο πολλοί.
    Για να γίνει αυτό θα πρέπει να δούμε τα στοιχεία που τα πεδία io_stall_read_ms και io_stall_write_ms της DMV μας δίνουν και να τα συνδυάσουμε με τα μέχρι τώρα διαμορφωμένα στοιχεία. Αυτά δείχνουν πόσο περιμένουν οι χρήστες για να κάνουνε ένα read ή write. Βέβαια υπάρχει και το io_stall που δείχνει το σύνολο που οι χρήστες περιμένουν για read και write. Εδώ επειδή δεν μας ενδιαφέρει να το αναλύσουμε περισσότερο αν και είναι εύκολο σαν άσκηση να το κάνετε θα πάρουμε το σύνολο και το παραπάνω query μετατρέπεται ως εξής
    Query 5 WITH DB_IO_STATISTICS AS (   SELECT     DB_NAME(fs.database_id) AS database_name,     mf.name as logical_file_name,     CAST(SUM(fs.num_of_bytes_read + fs.num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB,     SUM(fs.io_stall) as io_stall   FROM     sys.dm_io_virtual_file_stats(NULL, NULL) as fs   INNER JOIN     sys.master_files as mf on fs.database_id=mf.database_id and fs.file_id = mf.file_id   GROUP BY     fs.database_id,mf.name ) SELECT   database_name,   logical_file_name,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO],   CAST(io_stall / 1000. as DECIMAL(10,2)) as io_stall_in_seconds,   CAST(100. * io_stall / SUM(io_stall) OVER() AS DECIMAL(10, 2)) AS [% IO stall] FROM     DB_IO_STATISTICS ORDER BY     [% IO stall] desc  
    Και επειδή πιθανότατα κάποιος να θελήσει να δει όλα τα παραπάνω αλλά σε επίπεδο drive στο οποίο φυσικά έχει database files ώστε να δει που μπορεί να μεταφέρει database files ώστε να εξομαλύνει το I/O πρόβλημα του, υπάρχει και αυτό σαν δυνατότητα χρησιμοποιώντας την ίδια dmv όπως παρακάτω
    Query 6 WITH DB_IO_STATISTICS AS (   SELECT     left(mf.physical_name,1) as drive,     CAST(SUM(fs.num_of_bytes_read + fs.num_of_bytes_written) / (1024*1024) AS DECIMAL(12, 2)) AS db_IO_in_MB,     SUM(fs.io_stall) as io_stall   FROM     sys.dm_io_virtual_file_stats(NULL, NULL) as fs   INNER JOIN     sys.master_files as mf on fs.database_id=mf.database_id and fs.file_id = mf.file_id   GROUP BY     left(mf.physical_name,1) ) SELECT   drive,   db_IO_in_MB,   CAST(db_IO_in_MB / SUM(db_IO_in_MB) OVER() * 100  AS DECIMAL(5, 2)) AS [% IO],   CAST(io_stall / 1000. as DECIMAL(10,2)) as io_stall_in_seconds,   CAST(100. * io_stall / SUM(io_stall) OVER() AS DECIMAL(10, 2)) AS [% IO stall] FROM     DB_IO_STATISTICS ORDER BY     [% IO] desc /*antonch*/
  6. antonch
    Όταν βάζουμε το WITH ENCRYPTION option σε μια stored procedure, ένα trigger, μια function ή ένα view ξέρουμε ότι αυτόματα ο κώδικας δεν είναι ορατός. Θα μπορούσαμε να πούμε ότι είναι κλειδωμένος.

    Δεν ξέρω αν το γνωρίζεται αλλά ο SQL Server δεν είναι ένα digital rights management system αυτό σημαίνει ότι ο κώδικας που έχει γραφεί μέσα μια sp, function κλπ δεν είναι encrypted, αλλά απλά obfuscated.

    Το obfuscation αυτό ο SQL Server εδώ και πολλά χρόνια από τότε που εμφανίστηκε το with encryption option (ούτε καν θυμάμαι από πότε) το κάνει με το να εφαρμόσει bitwise OR στο κείμενο του κώδικα.

    Αυτό σημαίνει ότι όποιος χρήστης έχει δικαιώματα VIEW DEFINITION μπορεί να δει τον κώδικα μιας encrypted stored procedure κλπ, αρκεί να εκτελέσει μια άλλη sp που κάνει decrypt το περιεχόμενο της.

    Αν ψάξετε στο internet θα βρείτε πολλές. Απλά σας παραθέτω μία που τυχαία τσίμπησα από τα msdn forums και η οποία δουλεύει σε SQL Server 2008 R2, αλλά μόνο για stored procedures.



    ShowDecrypted Stored Procedure


    CREATE PROCEDURE dbo.ShowDecrypted(@ProcName SYSNAME = NULL)
    AS
    SET NOCOUNT ON
    IF EXISTS
    (
    SELECT * FROM sys.dm_exec_connections ec JOIN sys.endpoints e
    on (ec.[endpoint_id]=e.[endpoint_id])
    WHERE e.[name]='Dedicated Admin Connection'
    AND ec.[session_id] = @@SPID
    )
        BEGIN
     
        DECLARE @i BIGINT,@a NVARCHAR(MAX),@b NVARCHAR(MAX),@d NVARCHAR(MAX),@c NVARCHAR(MAX)
        SET @a=(SELECT [imageval] FROM [sys].[sysobjvalues] WHERE [objid] = OBJECT_ID(@ProcName) and [valclass] = 1 and [subobjid] = 1)
        SET @b='ALTER PROCEDURE '+ @ProcName +' WITH ENCRYPTION AS '+REPLICATE('-', 8000)
     
            BEGIN TRANSACTION
                EXECUTE (@b)
                SET @c=(SELECT [imageval] FROM [sys].[sysobjvalues] WHERE [objid] = OBJECT_ID(@ProcName) and [valclass] = 1 and [subobjid] = 1)    
            ROLLBACK TRANSACTION
     
        SET @d = REPLICATE(N'A', (DATALENGTH(@a) /2 ))
        SET @i=1
        WHILE @iDATALENGTH(@a)/2)
        BEGIN
        SET @d = STUFF(@d, @i, 1,NCHAR(UNICODE(SUBSTRING(@a, @i, 1)) ^(UNICODE(SUBSTRING('CREATE PROCEDURE '+ @ProcName +' WITH ENCRYPTION AS ' + REPLICATE('-', 8000), @i, 1)) ^UNICODE(SUBSTRING(@c, @i, 1)))))
        SET @i=@i+1
        END
     
        SELECT @d [storedProcedure]
     
        END
        ELSE
        BEGIN
            PRINT 'Use a DAC Connection'
        END
     
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO




     

    /*antonch*/
  7. antonch
    Σήμερα ανακοινώθηκε η διάθεση του SP3 για τον SQL Server 2008. Αρκετές βελτιώσεις και διορθώσεις έχουν γίνει σε αυτό.Μπορείτε να το κατεβάζετε από τα παρακάτω links
     
    Download SQL Server 2008 SP3 Download SQL Server 2008 SP3 Express Download SQL Server 2008 SP3 Feature Packs Knowledge Base Article for Microsoft SQL Server 2008 SP3
  8. antonch
    Αρκετές φορές είναι απαραίτητο να καταγράφονται οι αλλαγές που γίνονται στις εγγραφές των πινάκων σε μια βάση. Μέχρι πριν τον SQL Server 2008 υπήρχαν οι παραδοσιακές μέθοδοι όπως πχ triggers. Τώρα όμως υπάρχουν και άλλοι τρόποι. Σε αυτή την παρουσίαση θα δούμε τους άλλους αυτούς τρόπους.
    Για να παρακολουθήσετε την παρουσίαση αυτή θα πρέπει να κάνετε εγγραφή πατώντας απλά στο παρακάτω image.

    Όσοι παρακολουθήσουν ζωντάνα την παρουσίαση αυτή θα συμμετάσχουν στην κλήρωση που θα γίνει για ένα (1) μήνα δωρεάν εκπαίδευση σε .NET από την pluralsight
  9. antonch
    Αν ποτέ κατα την διάρκεια που σχεδιάζετε ένα report μέσα στο BIDS χαθεί ξαφνικά το Report Data window το οποίο εμφανίζει τα datasets τα οποία χρησιμοποιούνται στο report που φτιάχνετε μην σας πιάσει πανικός, αλλα ούτε να ψάξετε στα menus.
    Απλά πατήστε Ctrl+Alt+D
  10. antonch
    Για όσους θέλουν να χρησιμοποιήσουν ένα hotmail account σαν SMTP account για το SQL Server Database Mail θα πρέπει να κάνουν τις ρυθμίσεις σε αυτό όπως φαίνονται στην παρακάτω εικόνα

    ΠΡΟΣΟΧΗ ΠΡΟΣΟΧΗ ΠΡΟΣΟΧΗ
    ΣΕ ΚΑΜΙΑ ΠΕΡΙΠΤΩΣΗ ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΣΥΠΛΗΡΩΘΟΥΝ ΤΑ ΕΞΗΣ ΠΕΔΙΑ ΤΗΣ ΠΑΡΑΠΑΝΩ ΦΟΡΜΑΣ ΚΑΘΩΣ ΑΝ ΑΥΤΟ ΓΙΝΕΙ ΔΕΝ ΘΑ ΜΠΟΡΕΙΤΕ ΝΑ ΣΤΕΙΛΕΤΕ EMAIL.
    Description Display Name Reply e-mail
  11. antonch
    Σκεφτόμαστε να αλλάξουμε την ημέρα διεξαγωγής των SQL Saturday Nights. Ποιά ημέρα θα προτιμούσατε να γίνονται;

    Επειδή η γνώμη σας μετράει θα θέλαμε να απαντήσετε στην δημοσκόπηση που κάνουμε και την οποία θα βρείτε στο www.sqlschool.gr.

    Αν έχετε κάποια διαφορετική πρόταση από αυτές που η ψηφοφορία έχει θα θέλαμε να την ξέρουμε και αυτό μπορείτε να το κάνετε αφήνοντας το σχόλιο σας σε αυτό το post

    Σας ευχαριστούμε για την συνεργασία και το χρόνο σας.
  12. antonch
    Είναι γνωστή η τρέλλα μου να έχω το μέγιστο δυνατό user experience στα virtual machines μου. Περίμενα με αγωνία το RemoteFX το οποίο είναι άψογο. Αν παρόλα αυτά δεν έχετε το ReportFX να ένας απλός τρόπος να έχετε Aero σε αυτές όταν όμως συνδέεστε με Remote Desktop
    Βάλετε το Desktop Experience feature από τον Server Manager. Ενεργοποιήστε το themes service σε autostart, και ξεκινήστε το. Ενεργοποιήστε το “Allow desktop composition for remote desktop sessions” policy από το Edit Group Policy. Αυτό είναι στο path “ComputerConfiguration\AdministrativeTemplates\WindowsComponents\Remote Desktop Services\Remote Desktop Session Host\Remote Session Environment” Ορίστε το “Limit Maximum Color Depth” στο να παίρνει ότι έχει ο client. Αυτό ήταν έχετε Aero Theme
  13. antonch
    Αρκετοί, ιδιαίτερα όσοι είναι μερακλήδες και κάνουν estimated capacity plan πριν δημιουργήσουν την βάση τους παραπονούνται ότι η δημιουργία μιας μεγάλης βάσης παίρνει αρκετό χρόνο.
    Το web cast αυτό δείχνει την λύση. Για να το δείτε πατήστε εδώ
    /*antonch*/
  14. antonch
    Για ακόμα μια φορά θα πρέπει να ασχοληθούμε με το transaction log. Καθημερινά αντιμετωπίζω περιστατικά τα οποία μου δείχνουν ότι υπάρχει θέμα κατανόησης με την αξία, την λειτουργία αλλά και την χρήση του transaction log. Η βασική ερώτηση που μου έχει τεθεί αρκετές φορές και έχω γράφει αρκετά άρθρα για αυτή είναι γνωστή πλέον και αφορά το μέγεθος του transaction log file. Αν έχετε έρθει για πρώτη φορά στο blog αυτό μια απλή αναζήτηση εδώ θα σας φέρει αρκετά άρθρα για το θέμα αυτό. Αλλά αν ψάξετε και στον internet θα βρείτε ακόμα περισσότερα.
    Αρκετές φορές έχω περιγράψει την φυσική δομή μιας βάσης τόσο μέσα από τα μαθήματα που κάνω όσο και από εδώ ή τα SQL Server Saturday Nights. Σε όλες αυτές τις περιπτώσεις έχω τονίσει ότι το transaction log εσωτερικά δομείται σε virtual log files (VLFs). Επίσης αρκετές φορές έχω αναφέρει ότι το transaction log γίνεται truncate μόνο όταν παίρνουμε transaction log backup (εφόσον είμαστε σε full ή bulk recovery model). Και ακόμα αρκετές φορές έχω αναφέρει ότι σε αυτή την περίπτωση γίνεται truncate το μη ενεργό κομμάτι αυτού το ή τα οποίο(α) δεν είναι άλλο(α) από τα VLFs που δεν έχουν ενεργό(α) transaction(s).
    Για όσους λοιπόν αναρωτιούνται τι γίνεται με το transaction log τους και πώς θα συμπεριφερθεί στο επόμενο transaction log backup ή ακόμα καλύτερα θέλουν να βάλουν το δάκτυλο επί τον τύπο τον ήλο, υπάρχει ένα undocumented αλλά ευρέως γνωστό και φυσικά χρησιμοποιούμενο dbcc command και δεν είναι άλλο από το DBCC LOGINFO.
    Το command αυτό μας δίνει πληροφορίες για τα VLFs που υπάρχουν μέσα στο transaction log της βάσης μας
    Η εκτέλεση του είναι αρκετά απλή καθώς η μόνη παράμετρος που παίρνει το όνομα της βάσης.
    dbcc loginfo (AdventureWorks2008R2)
    Το αποτέλεσμα που βγάζει έχει την παρακάτω μορφή

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 458752 8192 46 2 64 0
    2 458752 466944 43 0 128 0
    2 458752 925696 44 0 128 0
    2 712704 1384448 45 0 128 0
    Ας δούμε όμως λίγο τι είναι το κάθε πεδίο που μας εμφανίζεται από την εκτέλεση της dbcc loginfo.



    FileID : To ID του αρχείου στην συγκεκριμένη βάση

    FileSize : Το μέγεθος του VLF σε bytes

    StartOffset : Το σημείο αρχής του VLF

    FSeqNo : Το sequence number του VLF

    Status: Η κατάσταση του VLF 0=Inactive, 2=Active

    Parity : Parity info για το VLF

    CreateLSN : To Log Sequence Number με το οποίο ξεκινάει το VLF
    Ας δούμε λίγο τα πράγματα με ένα απλό παράδειγμα

    Δημιουργώ μια βάση

    use master
    go

    create database DemoDB
    on primary

    ( name='demodb_data',
    filename='c:\temp\demodb_data.mdf',
    size=10MB
    )
    log on
    ( name='demodb_log',
    filename='c:\temp\demodb_log.ldf',
    size=5MB
    )
    go


    Με αυτό έχω φτιάξει μια βάση με μέγεθος data file 10MB και log file 5ΜΒ

    Εκτελώ την dbcc loginfo (demodb) και έχω το εξής

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 28 2 64 0
    2 1245184 1253376 0 0 0 0
    2 1245184 2498560 0 0 0 0
    2 1499136 3743744 0 0 0 0

    Από το αποτέλεσμα καταλαβαίνω ότι έχω ένα transaction log το οποίο έχει τέσσερα VLFs, από τα οποία χρησιμοποιείται το πρώτο καθώς το Status=2. Το μέγεθος των VLFs είναι περίπου 1,2 ΜΒ.

    Δημιουργώ έναν πίνακα

    create table T
    ( id int identity(1,1) primary key,
    data char(8000) default 'abcdefghijklmnopqrstuvwxyz'
    )
    go


    Και τον γεμίζω με 1000 εγγραφές

    insert into T default values
    go 1000

    Εκτελώντας την DBCC LOGINFO έχω το εξής αποτέλεσμα

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 32 0 128 0
    2 1245184 1253376 33 0 128 0
    2 1245184 2498560 34 2 128 0
    2 1499136 3743744 35 2 128 0

    Παρατηρόντας το βλέπουμε ότι έχουν γεμίζει σειριακά το VLFs (FSeqNo) και ότι τα ενεργά είναι τα δύο τελευταία (Status=2).

    Αν κάνω checkpoint και μετά δω ξανά το log με την dbcc θα έχω το εξής αποτέλεσμα

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 32 0 128 0
    2 1245184 1253376 33 0 128 0
    2 1245184 2498560 34 0 128 0
    2 1499136 3743744 35 2 128 0

    Παρατηρώ ότι μόνο το τελευταίο VLF είναι πλεόν ενεργό

    Βάζω ακόμα 1000 εγγραφές στον πίνακα μου και έχω το εξής αποτελεσμα μετά από την εκτέλεση της dbcc

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 40 0 128 0
    2 1245184 1253376 41 2 128 0
    2 1245184 2498560 42 2 128 0
    2 1499136 3743744 39 0 64 0

    Παρατηρώ ότι τα δύο μεσαία είναι ενεργά. Παίρνω το πρώτο full backup και το πρώτο log backup



    backup database demodb to disk='c:\temp\demodb.bak'
    go

    backup log demodb to disk='c:\temp\demodb.bak'
    go


    Eκτελώ την dbcc το αποτέλεσμα είναι το παρακάτω



    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 40 0 128 0
    2 1245184 1253376 41 0 128 0
    2 1245184 2498560 42 2 128 0
    2 1499136 3743744 39 0 64 0

    Βάζω μια εγγραφή που δεν την κάνω commit στο transaction

    BEGIN TRAN
    insert into T default values



    και παράλληλα από ένα άλλο session βάζω ακόμα 1000 εγγραφές, εκτελώ την dbcc από την οποία έχω το εξής απότελεσμα

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 44 2 64 0
    2 1245184 1253376 45 2 64 0
    2 1245184 2498560 42 2 128 0
    2 1499136 3743744 43 2 128 0
    2 253952 5242880 46 2 64 45000000203100009
    2 270336 5496832 47 2 64 45000000203100009
    2 253952 5767168 48 2 64 47000000014000009
    2 335872 6021120 49 2 64 47000000014000009
    2 253952 6356992 50 2 64 49000000026900009
    2 401408 6610944 51 2 64 49000000026900009
    2 253952 7012352 52 2 64 51000000038300009
    2 466944 7266304 53 2 64 51000000038300009
    2 253952 7733248 54 2 64 53000000052200013
    2 253952 7987200 55 2 64 53000000052200013
    2 278528 8241152 56 2 64 53000000052200013
    2 253952 8519680 57 2 64 56000000014100015
    2 253952 8773632 58 2 64 56000000014100015
    2 344064 9027584 59 2 64 56000000014100015
    2 253952 9371648 60 2 64 59000000028700003
    2 253952 9625600 61 2 64 59000000028700003
    2 475136 9879552 62 2 64 59000000028700003
    2 253952 10354688 63 2 64 62000000054000009
    2 253952 10608640 0 0 0 62000000054000009
    2 253952 10862592 0 0 0 62000000054000009
    2 286720 11116544 0 0 0 62000000054000009

    Χωρίς άλλη σκέψη παίρνω transaction log backup και εκτελώ την dbcc

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 44 2 64 0
    2 1245184 1253376 45 2 64 0
    2 1245184 2498560 42 2 128 0
    2 1499136 3743744 43 2 128 0
    2 253952 5242880 46 2 64 45000000203100009
    2 270336 5496832 47 2 64 45000000203100009
    2 253952 5767168 48 2 64 47000000014000009
    2 335872 6021120 49 2 64 47000000014000009
    2 253952 6356992 50 2 64 49000000026900009
    2 401408 6610944 51 2 64 49000000026900009
    2 253952 7012352 52 2 64 51000000038300009
    2 466944 7266304 53 2 64 51000000038300009
    2 253952 7733248 54 2 64 53000000052200013
    2 253952 7987200 55 2 64 53000000052200013
    2 278528 8241152 56 2 64 53000000052200013
    2 253952 8519680 57 2 64 56000000014100015
    2 253952 8773632 58 2 64 56000000014100015
    2 344064 9027584 59 2 64 56000000014100015
    2 253952 9371648 60 2 64 59000000028700003
    2 253952 9625600 61 2 64 59000000028700003
    2 475136 9879552 62 2 64 59000000028700003
    2 253952 10354688 63 2 64 62000000054000009
    2 253952 10608640 0 0 0 62000000054000009
    2 253952 10862592 0 0 0 62000000054000009
    2 286720 11116544 0 0 0 62000000054000009

    Κανω commit το transaction που είχα αφήσει πριν και ξαναπαίρνω log backup και εκτελώ την dbcc

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 44 0 64 0
    2 1245184 1253376 45 0 64 0
    2 1245184 2498560 42 0 128 0
    2 1499136 3743744 43 0 128 0
    2 253952 5242880 46 0 64 45000000203100009
    2 270336 5496832 47 0 64 45000000203100009
    2 253952 5767168 48 0 64 47000000014000009
    2 335872 6021120 49 0 64 47000000014000009
    2 253952 6356992 50 0 64 49000000026900009
    2 401408 6610944 51 0 64 49000000026900009
    2 253952 7012352 52 0 64 51000000038300009
    2 466944 7266304 53 0 64 51000000038300009
    2 253952 7733248 54 0 64 53000000052200013
    2 253952 7987200 55 0 64 53000000052200013
    2 278528 8241152 56 0 64 53000000052200013
    2 253952 8519680 57 0 64 56000000014100015
    2 253952 8773632 58 0 64 56000000014100015
    2 344064 9027584 59 0 64 56000000014100015
    2 253952 9371648 60 0 64 59000000028700003
    2 253952 9625600 61 0 64 59000000028700003
    2 475136 9879552 62 0 64 59000000028700003
    2 253952 10354688 63 2 64 62000000054000009
    2 253952 10608640 0 0 0 62000000054000009
    2 253952 10862592 0 0 0 62000000054000009
    2 286720 11116544 0 0 0 62000000054000009

    Βάζω ακόμα 1000 εγγραφές και εκτελώ την dbcc

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 69 2 128 0
    2 1245184 1253376 70 2 128 0
    2 1245184 2498560 67 2 64 0
    2 1499136 3743744 68 2 64 0
    2 253952 5242880 71 2 128 45000000203100009
    2 270336 5496832 72 2 128 45000000203100009
    2 253952 5767168 73 2 128 47000000014000009
    2 335872 6021120 74 2 128 47000000014000009
    2 253952 6356992 75 2 128 49000000026900009
    2 401408 6610944 76 2 128 49000000026900009
    2 253952 7012352 77 2 128 51000000038300009
    2 466944 7266304 78 2 128 51000000038300009
    2 253952 7733248 79 2 128 53000000052200013
    2 253952 7987200 80 2 128 53000000052200013
    2 278528 8241152 81 2 128 53000000052200013
    2 253952 8519680 82 2 128 56000000014100015
    2 253952 8773632 58 0 64 56000000014100015
    2 344064 9027584 59 0 64 56000000014100015
    2 253952 9371648 60 0 64 59000000028700003
    2 253952 9625600 61 0 64 59000000028700003
    2 475136 9879552 62 0 64 59000000028700003
    2 253952 10354688 63 2 64 62000000054000009
    2 253952 10608640 64 2 64 62000000054000009
    2 253952 10862592 65 2 64 62000000054000009
    2 286720 11116544 66 2 64 62000000054000009

    Από όλα τα παραπάνω βλέπω παρατηρώντας τα FSeqNo και Status ποια VLF είναι ενεργά και ποια όχι έτσι βλέπω πως γίνεται η ανακύκλωση του transaction log εσωτερικά και ποια είναι αυτά το VLFs τα οποία έχουν γίνει truncate.

    Αυτό μου είναι χρήσιμο ακόμα όταν θέλω να κάνω shrink το log file καθώς όπως έχουμε πει αρκετές φορές για να γίνει shrink θα πρέπει τα μην ενεργά VLFs να είναι στο τέλος όχι όπως στο παραπάνω δείγμα όπου αν είμαι σε αυτή την περίπτωση θα πρέπει να παίρνω ανεπάληλα transaction log backups ώστε να φτάσω σε μια μορφή όπως αυτή

    FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    2 1245184 8192 44 2 64 0
    2 1245184 1253376 45 2 64 0
    2 1245184 2498560 42 2 128 0
    2 1499136 3743744 43 2 128 0
    2 253952 5242880 46 2 64 45000000203100009
    2 270336 5496832 47 2 64 45000000203100009
    2 253952 5767168 48 2 64 47000000014000009
    2 335872 6021120 49 2 64 47000000014000009
    2 253952 6356992 50 2 64 49000000026900009
    2 401408 6610944 51 2 64 49000000026900009
    2 253952 7012352 52 2 64 51000000038300009
    2 466944 7266304 53 2 64 51000000038300009
    2 253952 7733248 54 2 64 53000000052200013
    2 253952 7987200 55 2 64 53000000052200013
    2 278528 8241152 56 2 64 53000000052200013
    2 253952 8519680 57 2 64 56000000014100015
    2 253952 8773632 58 2 64 56000000014100015
    2 344064 9027584 59 2 64 56000000014100015
    2 253952 9371648 60 2 64 59000000028700003
    2 253952 9625600 61 2 64 59000000028700003
    2 475136 9879552 62 2 64 59000000028700003
    2 253952 10354688 63 2 64 62000000054000009
    2 253952 10608640 0 0 0 62000000054000009
    2 253952 10862592 0 0 0 62000000054000009
    2 286720 11116544 0 0 0 62000000054000009

    SQL Server ‘Denali’

    Επειδή αρκετοί από εσάς φαντάζομαι ότι ήδη έχετε αρχίσει και βλέπετε την επόμενη έκδοση του SQL Server με την κωδική ονομασία Denali, πιθανότατα να έχετε εκτελέσει ή να εκτελέσετε την dbcc αυτή. Σε κάθε περίπτωση θα βρεθείτε σε μια έκπληξη καθώς σε αυτή υπάρχει νέα κολώνα και δεν είναι άλλη από την πρώτη με την ονομασία RecoveryUnitID όπου σε όλες τις γραμμές που θα εμφανιστούν έχει την τιμή μηδέν (0). Για την ενημέρωση σας χωρίς να έχω την εξουσιοδότηση να μπω σε περισσότερες λεπτομέρειες λόγω NDA, η κολώνα αυτή θα έχει πρακτική αξία στην μετά Denali έκδοση του SQL Server.

    RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
    -------------- ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
    0 2 253952 8192 49 2 128 0
    0 2 253952 262144 44 0 64 0
    0 2 270336 516096 45 0 64 43000000003000331
    0 2 262144 786432 46 0 64 44000000013600398
    0 2 262144 1048576 47 0 64 44000000038000359
    0 2 262144 1310720 48 0 64 45000000025400069
  15. antonch
    Δύο μέρες ΔΩΡΕΑΝ SQL Server Training
    Σήμερα ξεκινάμε το διήμερο free SQL Server training με 24ώρα live webcasts όπου θα δείτε στιγμιότυπα από το PASS Summit 2011. Με την υποστήριξη της Dell, το μέρος αυτό του 24 Hours of PASS θα σας παρουσιάσει τα σημαντικότερα νέα του SQL Server κατευθείαν στον υπολογιστή σας σε δύο 12ωρα, 7-8 Σεπτ., όπου κάθε 12ωρο ξεκινά στις 15:00 ώρα Ελλάδας. Εγγραφείτε εδώ για να παρακολουθήσετε τα αγαπημένα σας θέματα!
    Δείτε τι λένε γνωστοί ομιλητές για το 24 Hours of PASS:
    More Free Training from PASS - Rob Farley Watch Me (and 23 Others!) During 24 Hours of PASS: Summit Preview - Jes Schultz Borland Register for 24 Hours of PASS NOW! - Tim Radney Presenting Hardware 301 at 24 Hours of PASS on September 7 - Glenn Berry Βιαστείτε – Οι θέσεις είναι περιορισμένες!

    Δείτε το #24hop στο Twitter για τις τελευταίες συζητήσεις κ’ ενημερώσεις!
  16. antonch
    Πριν τις καλοκαιρινές μου διακοπές είχα ένα τμήμα στο οποίο έκανα μάθημα όλη την σειρά σεμιναρίων του SQL Server 2008 R2. Το τμήμα αυτό είχε συναδέλφους που ήταν αποκλειστικά Oracle DBAs και Devs. Κατά την διάρκεια των σεμιναρίων είχα αρκετές ερωτήσεις του στυλ στην Oracle κάνουμε αυτό στο SQL το κάνουμε και πώς το κάνουμε. Από μια σύμπτωση η σειρά το σεμιναρίων ήταν πρώτα το administration, και μετά το programming και μετά το σεμινάριο με την T-SQL.
    Μια ερώτηση που τέθηκε από την πρώτη μέρα από όλους αλλά ειδικά από τον Τ (ας τον πούμε έτσι για λόγους ανωνυμίας) ήταν αν ο SQL Server έχει cursors. Επειδή το θέμα θα το βλέπαμε διεξοδικά στο τελευταίο σεμινάριο, αλλά είναι και ένα θέμα που χωράει μεγάλη κουβέντα και ανάλυση του απάντησα όπως απαντώ όταν δεν έχω αρκετό χρόνο στην διάθεση μου ότι ναι έχει αλλά προσπαθούμε να τους αποφύγουμε.
    Φυσικά η απάντηση μου αυτή δεν άρεσε σε κανένα συμμετέχοντα καθώς παιδιά της Oracle τα κάνουν όλα με cursors. Εξήγησα ότι θα το εξετάσουμε το θέμα όταν έρθει ή ώρα του. Το δέχθηκαν και συνεχίσαμε ομαλά. Φυσικά ο φίλος Τ πάντα ρωτούσε με cursor μπορώ να κάνω αυτό ή αυτό το κάνω πανεύκολα με ένα cursor όταν έδειχνα κάτι. Για να μην πλατειάσω στην εισαγωγή η απάντηση μου ήταν σταθερά η ίδια και φυσικά αυτό έκανε τον φίλο T έξαλλο (μέχρι που ήρθε η στιγμή και τους εξηγήσαμε αναλυτικά και ηρέμησε).
    Αν ψάξουμε στο internet ή ρωτήσουμε ανθρώπους που ασχολούνται με τον SQL Server το σύνηθες είναι να διαβάσετε ή να ακούσετε ότι δεν είναι καλό στον SQL Server να χρησιμοποιούμε cursors γιατί
    καταναλώνουν αρκετή μνήμη, έχουν μεγάλο I/O, είναι αργοί σε απόκριση/ταχύτητα είναι κακός προγραμματισμός. Τελικά ισχύουν όλα αυτά; Είναι τόσο κακοί οι cursors που δεν πρέπει να τους χρησιμοποιούμε;
    Η αλήθεια είναι ότι οι cursors έχουν την φήμη αυτή γιατί έχουν κακοχρησιμοποιηθεί από junior devs ή από ανθρώπους που αγνοούν παντελώς την T-SQL γλώσσα και απλά κάποιος τους έδειξε τυχαία αυτό και το χρησιμοποιούν σαν ευαγγέλιο.
    Αν για παράδειγμα πούμε ότι είναι κακός προγραμματισμός τότε όλοι οι devs του SQL Server στην Microsoft είναι κακοί προγραμματιστές καθώς αν κάνουμε το παρακάτω query
    use master
    go
    select distinct id from sys.syscomments where text like '%cursor%'
    go

    θα δούμε πάνω από 200 system stored procedures και functions να κάνουν την χρήση cursor. Είναι όλοι αυτοί κακοί προγραμματιστές; Δεν το νομίζω…


    Πολλοί, μέσα σε αυτούς και εγώ, πιστεύουν ότι οι cursors υπάρχουν καλώς μέσα στον SQL Server αρκεί να γνωρίζουμε το πως δουλεύουν καθώς είναι απαραίτητοι για εργασίες όπως



    dynamic operations που δεν μπορούν να υλοποιηθούν με set-based operations,

    είναι εύκολοι στην κατανόηση και εύχρηστοι,

    προσφέρουν την γραμμή-γραμμή επεξεργασία,

    είναι ιδανικοί για scrolling ενός μέρους από ένα μεγάλο result set.


    Όμως έχουν και μειονεκτήματα όπως



    προσφέρονται για quick & dirty προγραμματισμό ειδικά από junior developers αλλά και από αυτούς που έμαθαν κάτι τυχαία και το έχουν κάνει ψωμοτύρι,

    εξαιτίας του ότι είναι memory resident set of pointers καταναλώνουν μνήμη,

    είναι γρηγορότεροι από ένα while loop αλλά έχουν περισσότερο overhead,

    όταν δεν ξέρεις πώς να τους χρησιμοποιήσεις τους χρησιμοποιείς με λάθος τρόπο και γράφει και λάθος τον κώδικα σε αυτούς.


    Δόξα το Θεό τα BOL του SQL Server περιγράφουν λεπτομερέστατα του cursors και δεν χρειάζεται να κάνω μια διεξοδική αναφορά σε αυτό το post.


    Αυτό που θα κάνω όμως είναι να εστιάσω την προσοχή σας στο πως δηλώνω ένα cursor με την παρατήρηση ότι υπάρχουν δύο συντάξεις η ISO και η T-SQL Extended, σας προτείνω να το διαβάσετε αναλυτικά και με προσοχή ιδιαίτερα την T-SQL Extended εκδοχή.


    Γνωρίζοντας τα παραπάνω θα είστε σε θέση την επόμενη φορά να χρησιμοποιήσετε σωστά τους cursors δηλώνοντας το σωστό cursor option με το οποίο θα χρησιμοποιηθεί ιδανικά τόσο η tempdb όσο και η μνήμη του συστήματος σας χωρίς να υπάρχουν performance penalties. Είναι τόσο απλό….


    /*antonch*/
  17. antonch
    Ένα query δεν το κρίνουμε αν είναι καλό ή κακό από το πόσο μεγάλο ή περίπλοκο είναι. Το κρίνουμε από το πόσο αποτελεσματικά κάνει τη δουλειά για την οποία έχει γραφτεί όπερ αν έχει το ιδανικό execution plan σε σχέση με το περιβάλλον που τρέχει.

    Για τους φίλους μου τους developers που όταν βλέπουν ένα query πάνω από 2 γραμμές το θεωρούν άσχημο.
  18. antonch
    Καλό φθινόπωρο σε όλες και σε όλους.
    Μετά από μια αποχή αρκετών μηνών τα SQL Saturday Night είναι πάλι εδώ!!!.
    Θα ξεκινήσουμε με ένα απλό αλλά ουσιαστικό θέμα το οποίο δεν είναι άλλο από να δούμε τι μπορούμε να κάνουμε με τον SQL Server Agent service. Αρκετά χρήσιμος για κάθε DBA αλλα και Developer.
    Σας περιμένω στην συντροφιά μας αλλά για να γίνει αυτό θα πρέπει πρώτα να κάνετε register με μία απλή κίνηση, κάνοντας click στο banner παραπάνω.
    Φιλικά
    /*antonch*/
  19. antonch
    Πριν από ένα μήνα είχα αναρτήσει μια δημοσκόπηση στο site του SqlSchool.gr με την εξής ερώτηση:

    Έχετε ενεργοποιήσει το "Optimize for Ad Hoc Workloads" στα instances του SQL Server 2008 & R2 που έχετε;

    Η συγκεκριμένη δημοσκόπηση έγινε με αφορμή κάποιες συζητήσεις που είχα με κάποιους συναδέλφους σχετικά με θέματα performance πάνω στον SQL Server. Αν και γενικά έχουν γραφτεί στο παρελθόν αρκετά για το συγκεκριμένο θέμα πίστευα ότι το συγκεκριμένο ήταν αρκετά γνωστό. Από τις συζητήσεις όμως διαπίστωσα ότι στην χώρα μας δεν ήταν και τόσο. Θέλησα να μετρήσω περισσότερο το συγκεκριμένο έτσι και έβαλα την συγκεκριμένη δημοσκόπηση.
    Τα αποτελέσματα μετά από ένα μήνα που ήταν ενεργή η συγκεκριμένη δημοσκόπηση ήταν τα παρακάτω
    Ναί 23,08% Όχι 7,69% Εξαρτάται 0% Δεν ξέρω τι είναι αυτό 69,23% Η έκπληξη ήταν αρκετά μεγάλη βλέποντας το αποτέλεσμα και έτσι αποφάσισα να δω και τον αριθμό συμμετοχών στην δημοσκόπηση αυτή ώστε να εξασφαλίσω την εγκυρότητα του δείγματος. Ο αριθμός αυτό δεν ήταν καθόλου μικρός (173 μοναδικές συμμετοχές). Βλέποντας τον αριθμό και τα αποτελέσματα μου διαπίστωσα ότι καλά έκανα και μέτρησα το συγκεκριμένο θέμα.
    Ας πάρουμε τα πράγματα όμως με την σειρά ώστε στο τέλος να έχουμε βγάλει μια άκρη σχετικά με το τι τελικά είναι το Optimize for Ad Hoc Workloads και αν πρέπει ή όχι να το έχουμε ενεργοποιημένο .
    Τι είναι το Optimize for Ad Hoc Workloads;
    Σήμερα όλο και περισσότερες εφαρμογές χρησιμοποιούν ORMs για να διαβάσουν δεδομένα από τις databases πχ Entity Framework , Linq to SQL, NHibernate κλπ. Είναι τα αγαπημένα εργαλεία των devs που θέλουν να γράφουν σε αυτό που ξέρουν πχ C# και object oriented programming. Γενικά είναι αγαπημένα εργαλεία σε αυτούς που θέλουν να βλέπουν την βάση σαν ένα κουβά (αυτό είναι κάτι το οποίο με κάνει να εξοργίζομαι). Μέσα από τα εργαλεία αυτά ο κάθε dev χωρίς να το βασανίσει ιδιαίτερα κάνει ad hoc queries χρησιμοποιώντας τα εργαλεία αυτά. Για κάθε ένα από αυτά ο SQL Server αποθηκεύει το execution plan του στην plan cache που είναι μέρος της buffer cache που είναι και στην ουσία αυτή που καταναλώνει memory στην μηχανή που είναι εγκατεστημένος ο SQL Server. Πολλά από αυτά το πιθανότερο είναι να μην χρησιμοποιηθούνε ποτέ ξανά, αυτό σημαίνει ότι μνήμη που έχει δεσμευτεί για τα execution plans τους παραμένει κατειλημμένη. Βέβαια το ίδιο ισχύει και για εφαρμογές που δεν είναι γραμμένες χρησιμοποιώντας τα εργαλεία αυτά αλλά είναι κακογραμμένες ή ο dev δεν έχει ανακαλύψει ακόμα την χρήση των stored procedure. Σημασία όμως έχει ότι είτε έτσι είτε αλλιώς έχω αυτό που ονομάζεται plan cache bloat όπως έχει καθιερωθεί να λέγεται τα φαινόμενο αυτό στην κοινότητα των SQL Server experts.

    Plan Cache bloat means that much of your plan cache is wasted by execution plans that will never be used again.

    Το φαινόμενο αυτό μπορεί να εξαλειφθεί όταν ενεργοποιήσω το option optimize for ad hoc workloads, το οποίο by default είναι off. Με ενεργοποιημένο το option αυτό ο SQL Server αντί να αποθηκεύσει το full execution plan του ad hoc query αποθηκεύει ένα μικρό compiled plan stub όπως λέγεται κατά την πρώτη του εκτέλεση. Το full execution plan θα αποθηκευτεί όταν θα υπάρχει και επόμενη εκτέλεση του ίδιου ad hoc query.
    Πώς βρίσκω αν πρέπει να ενεργοποιήσω το Optimize for Ad Hoc Workloads;
    Για να εντοπίσω, σαν DBA, αν έχω το φαινόμενο του plan cache bloat o τρόπος είναι ένας και αυτός δεν είναι άλλος από το να χρησιμοποιήσω την DMV sys.dm_exec_cached_plans.
    Για καλύτερα όμως αποτελέσματα καλό είναι να εκτελέσετε το παρακάτω script στο οποίο γίνεται με την χρήση της sys.dm_exec_cached_plans
    declare @TotalPlanCacheSizeInMBs decimal(18,2), @TotalSingleUsedPlansInMBs decimal(18,2)
    select @TotalPlanCacheSizeInMBs = (sum(cast(size_in_bytes as decimal(18,2)))/1024)/1024
    , @TotalSingleUsedPlansInMBs = (sum(cast((case when usecounts = 1 and objtype in ('Adhoc','Prepared') then size_in_bytes else 0 end) as decimal(12,2)))/1024)/1024
    from sys.dm_exec_cached_plans
    select @TotalPlanCacheSizeInMBs AS [Total Plan Cache Size In MBs]
    , @TotalSingleUsedPlansInMBs AS [Total Single Used Plans In MBs]
    , cast((@TotalSingleUsedPlansInMBs * 100 ) / @TotalPlanCacheSizeInMBs as decimal(18,2)) AS [% of Wasted space from single used plans]
    go



    Αν το % of Wasted space from single used plans είναι πάνω από το 20% (αν και το ποσοστό αυτό μπορεί να αλλάξει ανάλογα με το περιβάλλον) τότε καλό είναι να ενεργοποιηθεί το option αν και βέβαια αυτή είναι μια εκτίμηση γίνεται σε βάση την σχέση του χαμένου χώρου και του συνολικό μέγεθος της plan cache.


    Αν θέλουμε μπορούμε να δούμε πόσο χώρο χάνουμε σε σχέση με την γενικότερη μνήμη που ο SQL Server καταναλώνει με το παρακάτω script


    declare @SQLConfiguration table
    ( [name] nvarchar(35)
    , [minimum] int
    , [maximum] int
    , [config_value] int
    , [run_value] int
    );

    insert @SQLConfiguration
    exec ('sp_configure ''max server memory''');

    DECLARE @ConfiguredMemory decimal(19,3)
    , @PhysicalMemory decimal(19,3)
    , @InUseMemory decimal(19,3)


    SELECT @ConfiguredMemory = (run_value/1024)/1024
    FROM @SQLConfiguration
    WHERE name = 'max server memory (MB)'

    SELECT @PhysicalMemory = total_physical_memory_kb/1024
    FROM sys.dm_os_sys_memory

    SELECT @InUseMemory = physical_memory_in_use_kb/1024
    FROM sys.dm_os_process_memory

    declare @TotalSingleUsedPlansInMBs decimal(18,2)
    select @TotalSingleUsedPlansInMBs = (sum(cast((case when usecounts = 1 and objtype in ('Adhoc','Prepared') then size_in_bytes else 0 end) as decimal(12,2)))/1024)/1024
    from sys.dm_exec_cached_plans
    select @ConfiguredMemory AS [sql Configured Memory]
    , @PhysicalMemory AS [Physical Memory]
    , @InUseMemory AS [used Memory by SQL Server]
    , cast((@InUseMemory * 100 ) / @ConfiguredMemory as decimal(18,2)) AS [% of SQL Server used memory on Configured Memory]
    , @TotalSingleUsedPlansInMBs AS [Total Single Used Plans In MBs]
    , cast((@TotalSingleUsedPlansInMBs * 100 ) / @ConfiguredMemory as decimal(18,2)) AS [% of Wasted space from single used plans on Configured Memory]
    , cast((@TotalSingleUsedPlansInMBs * 100 ) / @InUseMemory as decimal(18,2)) AS [% of Wasted space from single used plans on Used Memory]
    go


    Εάν έχουμε [% of SQL Server used memory on Configured Memory] πάνω από το 50% και δούμε το [% of Wasted space from single used plans on Used Memory] να είναι πάνω από το 10-15% τότε είναι ένα καλό σημάδι να ενεργοποιήσουμε option.


    Τέλος υπάρχει ακόμα και περίπτωση που αν θέλουμε μπορούμε να κοιτάξουμε σε σχέση όμως αυτή την φορά με την Plan Cache Pressure Limit . Για να το γίνει αυτό θα πρέπει να γνωρίζουμε πως δουλεύει το plan caching στον SQL Server. Για αυτό υπάρχει ένα εξαιρετικό white paper από τον Greg Low με τίτλο Plan Caching in SQL Server 2008 από το οποίο ιδιαίτερη μνεία θα πρέπει να δοθεί στην παράγραφο με τίτλο Memory Allocated To Plan Caching την οποία και μεταφέρω αυτούσια για την ευκολία στο διάβασμα του post.




    Most memory used by SQL Server is allocated to the Buffer Pool, which is used to store data pages. SQL Server steals a proportion of this memory for use in caching query plans. The overall amount of memory available to SQL Server depends upon the amount of memory installed on the server, the architecture of the server, the version and edition of SQL Server and the amount of memory pressure being experienced by SQL Server. This pressure can be internal (SQL Server resources need memory) or external (operating system needs memory). SQL Server is designed to respond to memory pressure when necessary.


    Four types of object are stored in the Plan Cache: Object Plans, SQL Plans, Bound Trees and Extended Stored Procedures. SQL Server decides the appropriate allocation of memory to the Plan Cache from the Buffer Pool. The algorithm used for this has been improved in successive service packs since SQL Server 2005 was introduced.





    SQL Server Version




    Cache Pressure Limit






    SQL Server 2008 and SQL Server 2005 SP2




    75% of visible target memory from 0-4GB + 10% of visible target memory from 4Gb-64GB + 5% of visible target memory > 64GB






    SQL Server 2005 RTM and SQL Server 2005 SP1




    75% of visible target memory from 0-8GB + 50% of visible target memory from 8Gb-64GB + 25% of visible target memory > 64GB






    SQL Server 2000




    SQL Server 2000 4GB upper cap on the plan cache






    Table 1: Plan cache memory allocation by SQL Server version


    While 32-bit systems may use AWE (Address Window Extensions) memory to extend the available memory beyond the 4G virtual address space limit of the 32-bit architecture, this additional memory can only be used for data pages in the Buffer Pool, not by pages in the Plan Cache. It is not considered visible memory. No such limitation applies to 64-bit systems.




    Για την ευκολία σας θα αναφέρω το παρακάτω από το βιβλίο της Kalen Delaney SQL Server Internals όπου ορίζονται με εξαιρετικό τρόπο τα παρακάτω:




    When discussing memory pressure, we refer to the term visible memory—that is, the directly addressable physical memory available to the SQL Server buffer pool. On a 32-bit SQL Server instance, the maximum value for visible memory is either 2GB or 3GB, depending on whether you have the /3GB flag set in your boot.ini file. Memory with addresses greater than 2GB or 3GB is available only indirectly, through AWE-mapped memory. On a 64-bit SQL Server instance, “visible” memory has no special meaning, as all the memory is directly addressable. If I refer to visible memory greater than 3GB, keep in mind that this is possible only on a 64-bit SQL Server system. The term target memory means the maximum amount of memory that can be committed to the SQL Server process. Target memory refers to the physical memory committed to the buffer pool and is the lesser of the values you’ve configured for “max server memory” and the total amount of physical memory available to the OS. Thus, visible target memory is the visible portion of the target memory. Query plans can be stored only in the non–AWE-mapped memory, which is why the concept of visible memory is important.




    Από το ίδιο βιβλίο θα πάρω και ένα παράδειγμα




    Assume you’re on SQL Server 2008 on a 64-bit SQL Server instance with 28GB of target memory. Per the formula in Table 1, the plan-cache pressure limit would be 75 percent of 4GB plus 10 percent of the target memory over 4GB (or 10 percent of 24GB)—that is, (.75 × 4GB) + (.10 × 24GB) = 3GB + 2.4GB = 5.4GB.




    Αφού εφαρμόσουμε τον παραπάνω αλγόριθμο βρίσκουμε το plan cache pressure limit και το συσχετίζουμε με τον αποτελέσματα από τον πρώτο τρόπο. Αν το ποσοστό που θα βρούμε είναι μεγάλο τότε όχι μόνο θα πρέπει να ενεργοποιήσουμε το option αλλά να κάνουμε καθαρισμό της plan cache. Βέβαια αυτό θα πρέπει να γίνει και για τι άλλες περιπτώσεις που έχω αναφέρει παραπάνω.


    Πώς καθαρίζω την Plan Cache


    Ο εύκολος τρόπος για να γίνει αυτό είναι να χρησιμοποιήσω την


    DBCC FREESYSTEMCACHE('SQL Plans')

    Το θέμα όμως με αυτή την σύνταξη είναι ότι καθαρίζει όλη την plan cache. Αυτό σημαίνει ότι θα φύγουν και αυτά που χρησιμοποιούνται πολλές φορές. Αν θέλω να καθαρίζω αυτά που έχουν χρησιμοποιηθεί μόνο μια φορά θα πρέπει να δράσω κάπως διαφορετικά όπως παρακάτω


    select plan_handle from sys.dm_exec_cached_plans
    where usecounts=1
    go

    DECLARE clearplancache CURSOR
    READ_ONLY
    FOR select plan_handle from sys.dm_exec_cached_plans

    DECLARE @plan_handle varbinary(8000)
    OPEN clearplancache

    FETCH NEXT FROM clearplancache INTO @plan_handle
    WHILE (@@fetch_status -1)
    BEGIN
    IF (@@fetch_status -2)
    BEGIN
    DBCC FREEPROCCACHE (@plan_handle)
    END
    FETCH NEXT FROM clearplancache INTO @plan_handle
    END

    CLOSE clearplancache
    DEALLOCATE clearplancache
    GO
    select plan_handle from sys.dm_exec_cached_plans
    where usecounts=1
    go



    Πώς ενεργοποιώ το Optimize for Ad Hoc Workloads;


    Για να ενεργοποιήσω το συγκεκριμένο option μπορώ να το κάνω με το εξής script


    sp_configure 'show advanced options',1
    go

    reconfigure
    go

    sp_configure 'optimize for ad hoc workloads',1
    go

    reconfigure
    go
  20. antonch
    Ένα νέο γκάλοπ έχει αναρτηθεί στον www.sqlschool.gr με την παρακάτω ερώτηση


    Εάν είστε αυτός που πρέπει να επιλέξει ένα νέο server για τον βασικό database server στην εταιρία σας, αλλά έχετε περιορισμένο budget, σε τι από τα παρακάτω δεν θα κάνετε «εκπτώσεις» στα χαρακτηριστικά του και στις δυνατότητες του;


    Παρακαλώ θερμά για την συμμετοχή σας.

    /*antonch*/
  21. antonch
    Συχνά έχω την ερώτηση από μαθητές μου αλλά και από συνεργάτες που ήταν συνηθισμένοι με τα SQL Server 2000 DTS όπου υπήρχε η δυνατότητα να κάνουν export αυτά σε VB code module και να τα καλούν μέσα από τις εφαρμογές τους, πως μπορούν να κάνουν το ίδιο ή σχεδόν το ίδιο με τα SSIS packages.
    Η απάντηση είναι σχετικά απλή και θα σας την παρουσιάσω σε αυτό το post. Όμως θα πρέπει εξ αρχής να επισημάνω ότι απαιτούνται γνώσεις προγραμματισμού σε .net περιβάλλον άνω του μετρίου.
    Επίσης κατά την άποψη μου πρέπει να υπάρχει μια αρκετά καλή εξοικειώσει με το object model των SSIS καθώς αυτό είναι λίγο περίεργο σε σχέση με άλλα, και αυτό πάλι είναι μια προσωπική άποψη που ίσως να μην σας βρει σύμφωνους. Όπως και να έχει όμως η δουλεία μας γίνεται.
    Το SSIS Πακέτο
    Ας πάρουμε τα πράγματα από την αρχή και ας φτιάξουμε ένα απλό SSIS πακέτο (με το όνομα ThePackage) το οποίο θα κάνει κάτι αρκετά απλό.

    Θα έχει ένα Data Flow Task

    το οποίο θα έχει ένα OLEDB Data Source που θα διαβάζει τον πίνακα Products από την Northwind database και θα κάνει export τα δεδομένα του πίνακα σε ένα semicolon( delimited flat file.

    Για να γίνει το παραπάνω θα έχω δύο Connection Managers,

    ένα Flat File Connection Manager με το όνομα FlatFile που θα έχει τα στοιχεία για το flat file που θα κάνουμε export και έναν OLEDB Connection Manager που θα συνδέεται στην Northwind database από την οποία θα διαβάζουμε τον πίνακα Products. Το όνομα αυτού είναι Northwind.
    Για εκπαιδευτικούς λόγους βάζω ένα variable το οποίο δεν θα το χρησιμοποιήσω πουθενά καθώς το πακέτο που φτιάχνω δεν έχει κάποια απαίτηση τέτοια, αλλά θέλω να σας δείξω πως μπορώ να την γεμίσω από την εφαρμογή μου. Το όνομα της variable είναι AVar.

    Το σενάριο μου είναι ότι θέλω να ορίζω κατά την εκτέλεση, από την εφαρμογή μου, του SSIS πακέτου τα connection strings των connection managers αλλά και να θέτω τιμή στην variable.
    Η εγκατάσταση του στον SQL Server
    Αφού το έχω φτιάξει και το έχω δοκιμάσει ότι δουλεύει μέσα από το BIDS (BI Development Studio aka Visual Studio) θέλω να βγάλω deployment manifest ώστε να μπορώ να το κάνω deploy στο SQL Server που θέλω.
    Για να γίνει αυτό πάω πάνω στο SSIS Project στον Solution Explorer και κάνω δεξι κλικ και επιλέγω Properties όπου και μου εμφανίζεται το Property Pages Window. Επιλέγω Deployment Utility από τα Configuration Properties και στα δεξιά εμφανίζονται οι επιλογές αυτού όπου επιλέγω να κάνω true το CreateDeploymentUtility property.

    Με την ολοκλήρωση τις διαδικασίας αυτής και αφού κάνω Build to SSIS Project μου, στο φάκελο Deployment ο οποίος υπάρχει μέσα στο Bin folder του folder που έχω φτιάξει το SSIS Project θα έχω τα παρακάτω αρχεία

    Παίρνω τα περιεχόμενα του φακέλου αυτού και τα πάω στον SQL Server στον οποίο και θέλω να στήσω το πακέτο που. Αφού γίνει αυτό απλά κάνω double click στο αρχείο με το extention SSISDeploymentManifest και ο SSIS Package Installation Wizard ξεκινάει. Στο βήμα που ακολουθεί επιλέγω να κάνω εγκατάσταση στον SQL Server και όχι στο file system και πατώ Next.

    Στο επόμενο βήμα μιας και είμαι πάνω στο SQL Server που θέλω να γίνει η εγκατάσταση κάνω τις εξής επιλογές και πατώ Next.

    Στα επόμενα βήματα πατάω απλά Next μέχρι που θα γίνει η εγκατάσταση στον SQL Server.
    Αφού αυτή ολοκληρωθεί επιτυχώς τότε μέσα από τον SSMS συνδέομαι στα SSIS και θα δω το πακέτο να είναι εγκατεστημένο.

    To Application που θα εκτελεί το SSIS Package
    Ας έρθουμε να φτιάξουμε τώρα το application το οποίο θα καλεί το πακέτο που μόλις βάλαμε στον SQL Server. Με το Visual Studio φτιάχνω ένα console application σε C# στο οποίο για να μπορέσω να χρησιμοποιήσω τον SSIS Runtime θα πρέπει να κάνω reference το Microsoft.SQLServer.ManagedDTS assembly.

    Ο κώδικας που χρειάζεται να έχω γράψει για να μπορέσω να καλέσω μέσα από την εφαρμογή μου είναι ο παρακάτω
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.SqlServer.Dts.Runtime;

    namespace CallingSSISPackage
    {
    class Program
    {
    static void Main(string[] args)
    {
    Application app = new Application();

    Package pkg = new Package();
    pkg = app.LoadFromSqlServer(@"\ThePackage", "SQL2008R2", null, null, null);

    Variables vars2 = pkg.Variables;
    vars2["AVar"].Value = "20";


    ConnectionManager filemgr = pkg.Connections["FlatFile"];
    filemgr.ConnectionString = @"c:\temp\products4.txt";
    Console.WriteLine(pkg.Connections["FlatFile"].ConnectionString);


    ConnectionManager NWDB = pkg.Connections["Northwind"];
    NWDB.ConnectionString = @"Data Source=SQL2008R2;
    Initial Catalog=Northwind;
    Provider=SQLNCLI10.1;
    Integrated Security=SSPI;";
    Console.WriteLine(pkg.Connections["Northwind"].ConnectionString);

    DTSExecResult rv = pkg.Execute();
    Console.WriteLine("Package Execution results: {0}",rv.ToString());

    Console.Read();
    }
    }
    }

    Ας εξηγήσουμε λίγο τι κάνει αυτός.


    Δημιουργούμε ένα νέο instance του SSIS Application object.


    Application app = new Application();
    Φορτώνουμε το πακέτο από τον SQL Server συνδεόμενοι στο SQL Server με Windows integration όσον αφορά το security

    Package pkg = new Package();
    pkg = app.LoadFromSqlServer(@"\ThePackage", "SQL2008R2", null, null, null);

    Θέτουμε τιμή στις διάφορες μεταβλητές (αυτό είναι για εκπαιδευτικούς σκοπούς, δεν κάνει τίποτα η μεταβλητή αυτή μέσα στο πακέτο)


    Variables vars2 = pkg.Variables;
    vars2["AVar"].Value = "20";

    Και το επόμενο είναι ορίσουμε τις τιμές στα connection strings των connection managers που έχω μέσα στο πακέτο μου.


    ConnectionManager filemgr = pkg.Connections["FlatFile"];
    filemgr.ConnectionString = @"c:\temp\products4.txt";
    Console.WriteLine(pkg.Connections["FlatFile"].ConnectionString);


    ConnectionManager NWDB = pkg.Connections["Northwind"];
    NWDB.ConnectionString = @"Data Source=SQL2008R2;
    Initial Catalog=Northwind;
    Provider=SQLNCLI10.1;
    Integrated Security=SSPI;";
    Console.WriteLine(pkg.Connections["Northwind"].ConnectionString);

    Τέλος απλά κάνω την εκτέλεση του SSIS πακέτου και δείχνω το status της εκτέλεσης.


    DTSExecResult rv = pkg.Execute();
    Console.WriteLine("Package Execution results: {0}",rv.ToString());

    Εγκαθιστώντας την εφαρμογή πάνω στον SQL Server και εκτελώντας την όλα θα δουλέψουν μια χαρά εφόσον έχω κάνει login στον server με ένα account το οποίο είναι στους local admins της μηχανής και είναι και sysadmin στον SQL Server.


    H εκτέλεση της εφαρμογής από έναν σταθμό εργασίας


    To ίδιο ισχύει και αν εκτελέσω την εφαρμογή από έναν άλλο σταθμό εργασίας, εφόσον σε αυτόν έχω συνδεθεί με το ίδιο account που χρησιμοποίησα παραπάνω.


    Στην περίπτωση όμως που πάω σε ένα σταθμό εργασίας στο οποίο έχω συνδεθεί με ένα απλό χρήστη που δεν είναι admin και απλά έχει δικαιώματα πρόσβασης στον SQL Server και δικαιώματα read στην Northwind database τότε αρχίσει μια μικρή περιπέτεια.


    Δοκιμάζοντας να εκτελέσω το πακέτο εμφανίζεται το πρώτο μήνυμα λάθους





    Αποφασίζω να πάω και να δώσω πρόσβαση στο συγκεκριμένο χρήστη στην msdb database βάζοντας τον ταυτόχρονα να είναι μέλος του database role που υπάρχει στην msdb db_ssisltduser.


    Στην επόμενη εκτέλεση που θα κάνω θα πάρω το επόμενο διαφορετικό μήνυμα λάθους





    Η επόμενη κίνηση είναι το συγκεκριμένο χρήστη να του δώσω περισσότερα δικαιώματα όσον αφορά την εκτέλεση των SSIS πακέτων και αυτό γίνεται βάζοντας τον στον msdb database role db_ssisoperator. Αυτό έχει σαν αποτέλεσμα όλα να δουλέψουν ομαλά.


    Όλα τα παραπάνω δουλεύουν εφόσον είμαι σε domain environment. Σε διαφορετική περίπτωση θα πρέπει τα accounts να υπάρχουν και στις δύο μηχανές με το ίδιο password.


    Υπάρχουν όμως και άλλες περιπτώσεις που πιθανότατα δεν θα μπορείτε να συνδεθείτε στα Integrations Services για μερικές από αυτές μπορείτε να δείτε αυτό, αλλά γενικά αυτές είναι σπάνιες. Εάν πάντως πέσετε σε κάποια από αυτές θα μπορούσα να σας βοηθήσω εφόσον μου αναφέρεται όλες τις λεπτομέρειες για το πώς προσπαθείτε να κάνετε την εκτέλεση αυτή.


    Αυτή είναι σε γενικές γραμμές η λύση για το πώς εύκολα μπορείτε να καλέσετε ένα SSIS πακέτο μέσα από την εφαρμογή σας.


    /*antonch*/
  22. antonch
    Από χθες είναι πλέον διαθέσιμο ένα αξιολογότατο download για όσους λατρεύουν τον SQL Server και αφορά την επόμενη έκδοση του με την ονομασία Denali και συγκεκριμένα την CTP 3 που πριν λίγες εβδομάδες έγινε διαθέσιμη σε όλο τον κόσμο.
    Όπως χαρακτηριστικά αναφέρει το email το οποίο έλαβα από άνθρωπο του product group
    The SQL Server Code Name “Denali” CTP3 Product Guide includes useful resources and demos that will help IT Professionals better evaluate of CTP3. This includes:
    14 Product Datasheets 8 PowerPoint Presentations 5 Technical White Papers 13 Hands-On Lab Preview Documents 6 Click-Through Demonstrations 13 Self-Running Demonstrations 26 Links to On-Line References 44 Links to On-Line Videos including 26 Presentations from North America TechEd 2011 Αξίζει το κόπο κάποιος να το κατεβάσει από εδώ και να ασχοληθεί μαζί του ιδιαίτερα αν δεν έχει να κάνει κάτι άλλο τώρα στις διακοπές του.
    Υ.Γ για να μην ξεχνιόμαστε.

    150 θέσεις σε super τιμή σας περιμένουν για το επόμενο IT PRO|DEV Connections 2011. Βιαστείτε γιατί εξαντλούνται γρήγορα.

  23. antonch
    Εάν έχετε βαρεθεί να περιμένετε να ανοίξει το SQL Server Management Studio υπάρχει λύση. Απλά ανοίξτε τον Internet Explorer και πηγαίνεται στα Tools>Internet Options. Στα παράθυρο που θα εμφανιστεί διαλέξτε και το Advanced Tab και εκει βρείτε και κάνετε uncheck το Check for server certificate revocation, κάνετε Apply και restart τον IE. Την επόμενη φορά που θα ανοίξετε τον SSMS θα δείτε την διαφορά .

  24. antonch
    Με αφορμή την ενασχόληση μου με την επιμέλεια των ελληνικών μηνυμάτων λαθών στον SQL Server DENALI, διαπίστωσα ότι έχουν γίνει αρκετά ενδιαφέρουσες αλλαγές σε αυτά.
    Μια τέτοια η οποία είναι αρκετά ενδιαφέρουσα και πρωτίστως χρήσιμη είναι ότι όταν πλέον έχει λάθος το οποίο παραβιάζει τον primary key constraint δηλαδή πάμε να βάλουμε ένα pk το οποίο ήδη υπάρχει ενώ μέχρι τώρα απλά είχα το μήνυμα λάθους τώρα έχω και την τιμή . Cool!!!
    Ας δούμε ένα παράδειγμα για αυτό
    create table X (id int not null primary key, data nvarchar(100))
    insert into X(id,data) values (1,'A'),(2,'B'),(3,'C')
    insert into X(id,data) values (1,'A'),(4,'B'),(5,'C')
    set language 'greek'
    insert into X(id,data) values (1,'A'),(4,'B'),(5,'C')
    Πλέον το μήνυμα λάθους είναι
    Msg 2627, Level 14, State 1, Line 1
    Violation of PRIMARY KEY constraint 'PK__X__3213E83F7B68C891'. Cannot insert duplicate key in object 'dbo.X'. The duplicate key value is (1).
    Και στα ελληνικά
    Msg 2627, Level 14, State 1, Line 4
    Παραβίαση του περιορισμού PRIMARY KEY 'PK__X__3213E83F7B68C891'. Δεν είναι δυνατή η εισαγωγή διπλότυπου κλειδιού στο αντικείμενο 'dbo.X'. Η τιμή του διπλότυπου κλειδιού είναι (1).
  25. antonch
    Ακόμα ένα χαρακτηριστικό το οποίο δεν έχει διαφημιστεί στον SQL Server DENALI είναι ότι πλέον υπάρχουν όλα τα μηνύματα των λαθών που έχει ο SQL Server στην Ελληνική γλώσσα!!!.
    Άλλη μια απαίτηση χρόνων έγινε πραγματικότητα .
    Εάν ρωτήσετε τον sys.messages και τον sys.sysmessages θα δείτε πλέον ότι υπάρχει και ελληνική γλώσσα μέσα σε αυτούς (language id = 1032).
    Έτσι πλέον αν στο χρήστη έχετε βάλει default language Greek εκτός από το ότι θα μπορεί να εισάγει ημερομηνίες σύμφωνες με το ελληνικό format ΗΗ/ΜΜ/ΕΕΕΕ θα μπορεί να βλέπει και τα λάθη στην ελληνική γλώσσα.
    Αυτό βέβαια μπορείτε να το κάνετε και στο session του χρήστη όπου ανά πάσα στιγμή μπορείτε να αλλάξετε την γλώσσα με την χρήση της
    SET LANGUAGE ‘Greek’
    Έτσι αν πχ εκτελέσουμε την εντολή
    DROP TABLE X
    όπου ο πίνακας Χ δεν υπάρχει και αφού έχουμε αλλάξει την γλώσσα στα ελληνικά με την SET LANGUAGE θα δούμε το παρακάτω μήνυμα λάθους
    Msg 3701, Level 11, State 5, Line 1
    Δεν είναι δυνατή η απόρριψη της πίνακας 'X', επειδή δεν υπάρχει ή επειδή δεν έχετε δικαιώματα.
    Ξέρω τώρα ότι θα αρχίσετε την γκρίνια αλλά θα τα διορθώσουμε όλα αυτά τα χαζά όπως «της πίνακας». Ήδη ετοιμάζω τις διορθώσεις να τις στείλω στο product group.
    /*antonch*/
×
×
  • Create New...