DedSec Project

t_sql — συγκεντρωτικός οδηγός — DedSec Project

t_sql — συγκεντρωτικός οδηγός Transact-SQL Τι προσφέρει η γλώσσα Η T-SQL επεκτείνει τη SQL στον Microsoft SQL Server με μεταβλητές, διαδικαστική ροή και ειδικές συναρτήσεις. Μικρό…

Transact-SQL

Τι προσφέρει η γλώσσα

Η T-SQL επεκτείνει τη SQL στον Microsoft SQL Server με μεταβλητές, διαδικαστική ροή και ειδικές συναρτήσεις.

Μικρό παράδειγμα προς μελέτη

DECLARE @n int = 3;
SELECT @n * @n AS squared;

Σε δοκιμαστική βάση σύγκρινε SELECT με συναλλαγή που κάνει ρητό ROLLBACK σε δοκιμαστική αλλαγή.

Τι να επαληθεύσεις

Κατάγραψε την πραγματική έκδοση εργαλείου, τις απαιτούμενες εξαρτήσεις και την έξοδο σε δοκιμαστικά δεδομένα για τη T_SQL. Πρόβλεψε το αποτέλεσμα πριν το ελέγξεις και διατήρησε την αρχική και τη διορθωμένη εκδοχή ώστε να φαίνεται η αιτιώδης διαφορά. Μην αποκαλείς ένα απόσπασμα εκτελεσμένο αν δεν έχεις το κατάλληλο περιβάλλον.

Παγίδα ειδική για το θέμα

Μη μεταφέρεις σύνταξη TOP, identity ή ημερομηνιών αυτούσια σε SQLite/PostgreSQL· έλεγξε τη διάλεκτο.

Εργαστήριο εξάσκησης: T SQL

Αντικατάστησε τα δεδομένα του συστήματος

Το sys.databases του αρχικού δείγματος εξαρτάται από τον SQL Server και τα δικαιώματα του χρήστη. Για προβλέψιμο αποτέλεσμα δημιούργησε προσωρινό πίνακα σε δοκιμαστική συνεδρία Microsoft SQL Server:

CREATE TABLE #scores (name varchar(20) NOT NULL, score int NULL);
INSERT INTO #scores (name, score)
VALUES ('Ada', 2), ('Lin', 5), ('Ava', 5), ('Noah', NULL);
SELECT TOP (2) name, score
FROM #scores
ORDER BY score DESC, name ASC;
DROP TABLE #scores;

Οι αναμενόμενες γραμμές είναι Ava, 5 και Lin, 5. Η ταξινόμηση πρώτα κατά βαθμολογία και έπειτα κατά όνομα καθορίζει τη σειρά ισοβαθμίας. Χωρίς δεύτερο κριτήριο δεν υπάρχει εγγυημένη σειρά ανάμεσα σε ισόβαθμες εγγραφές. Κράτησε την πραγματική έξοδο και έκδοση server· το παράδειγμα δεν έχει εκτελεστεί εδώ.

Ανάλυσε το NULL

Επανάλαβε το ερώτημα με WHERE score >= 2. Η εγγραφή με NULL αποκλείεται, αλλά αυτό δεν σημαίνει ότι NULL = 0. Οι συνήθεις συγκρίσεις με NULL παράγουν UNKNOWN στη λογική τριών τιμών. Για να εντοπίσεις την απουσία χρησιμοποίησε WHERE score IS NULL. Η χαμένη τιμή και η ανύπαρκτη γραμμή είναι διαφορετικές περιπτώσεις.

Δοκίμασε πραγματική αποτυχία

Τρέξε χωριστά SELECT TRY_CONVERT(int, 'oops') AS parsed και SELECT CONVERT(int, 'oops') AS parsed. Το πρώτο αναμένεται να παράγει NULL για τη συγκεκριμένη είσοδο· το δεύτερο σφάλμα μετατροπής. Φύλαξε τον πραγματικό αριθμό σφάλματος. Το NULL που επιστρέφει η ασφαλής απόπειρα χρειάζεται ρητή απόφαση: δεν πρέπει να γίνεται αυθαίρετα μηδέν.

Ανεξάρτητη επέκταση

Πρόσθεσε τρίτο άτομο με βαθμολογία 5. Πάρε τις δύο πρώτες εγγραφές με σταθερό ORDER BY score DESC, name ASC. Έπειτα σύγκρινε TOP (1) WITH TIES με ταξινόμηση μόνο κατά βαθμολογία, ώστε να φανεί πώς οι ισοβαθμίες αλλάζουν το πλήθος αποτελεσμάτων. Τεκμηρίωσε γιατί το TOP είναι σύνταξη T-SQL και δεν αντικαθίσταται παντού από LIMIT. Καθάρισε τον προσωρινό πίνακα. Οδηγός: https://learn.microsoft.com/sql/t-sql/

T_SQL — Διαδρομή ουσιαστικής εξάσκησης

Συναλλαγή με σαφή κανόνα αποτυχίας

Στον Microsoft SQL Server η T-SQL παρέχει TRY...CATCH και THROW για χειρισμό SQL errors. Η παρακάτω δομή είναι skeleton για μία μεταφορά: χρειάζεται επιπλέον έλεγχο για ύπαρξη εγγραφών και business rules πριν θεωρηθεί production-ready.

SET XACT_ABORT ON;
BEGIN TRY
  BEGIN TRANSACTION;
  UPDATE dbo.Accounts SET Balance = Balance - 10 WHERE Id = 1;
  UPDATE dbo.Accounts SET Balance = Balance + 10 WHERE Id = 2;
  COMMIT TRANSACTION;
END TRY
BEGIN CATCH
  IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
  THROW;
END CATCH;

Με XACT_ABORT ON πολλά runtime errors προκαλούν transaction abort. Το XACT_STATE() σε CATCH διακρίνει αν υπάρχει ενεργή transaction που χρειάζεται rollback. Μην προσπαθείς να κάνεις COMMIT μετά από uncommittable transaction.

Σημαντικό κενό στο παράδειγμα

Το UPDATE που επηρεάζει μηδέν γραμμές δεν παράγει αυτομάτως error. Αν Id=2 δεν υπάρχει, το δεύτερο update μπορεί να «πετύχει» χωρίς αλλαγή. Πρόσθεσε έλεγχο @@ROWCOUNT αμέσως μετά την κατάλληλη εντολή και THROW δικού σου validation error ώστε να ακυρωθεί η μεταφορά.

Isolation και ανταγωνισμός

Δύο sessions μπορεί να προσπαθήσουν παράλληλη ενημέρωση. Έλεγξε isolation level, κλειδώματα και τυχόν deadlocks σε sandbox. Η ύπαρξη transaction δεν αρκεί μόνη της για την πολιτική «μη αρνητικό balance». Για λήψη αποφάσεων με έλεγχο υπάρχοντος balance, σχεδίασε atomic predicate ή locking scheme και τεκμηρίωσε την ανάγκη.

Αξιολόγηση

Πριν το test δημιούργησε προσωρινό dbo.Accounts σε εκπαιδευτική βάση και κατέγραψε αρχικά υπόλοιπα. Επαλήθευσε επιτυχή μεταφορά, ανύπαρκτο destination, ανεπαρκές υπόλοιπο και rollback σε error. Κατάγραψε SQL Server version και ακριβή error number. Μην εκτελείς το εργαστήριο σε πραγματικές τραπεζικές εγγραφές.