Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

SQL rollback tran

Îåêßíçóå áðü ôï ìÝëïò thodoros. Τελευταία δημοσίευση από το μέλος thodoros στις 29-11-2007, 22:31. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  21-11-2007, 22:46 37619

    SQL rollback tran

    Θέλω να δημιουργήσω ένα trigger σε SQL Server 2000, το οποίο θα ελέγχει την τιμή ενός απο τα πεδία του πίνακα και όταν αυτό θα είναι null θα κάνει rollback tran τη συγκεκριμένη εγγραφή. Όλα καλά στο σκεπτικό, αλλά μήπως μπορεί κάποιος να βοηθήσει στη σύνταξη;;

     

    Ευχαριστώ


    Live fast, die young
  •  22-11-2007, 09:06 37629 σε απάντηση της 37619

    Απ: SQL rollback tran

    Κατά το insert? Κατά το update? Πως είναι η δομή του πίνακα; Εφόσον θες βοήθεια στη σύνταξη θα πρέπει να είσαι πολύ συγκεκριμένος. Γενικά πάντως η σύνταξη είναι κάπως έτσι:

    CREATE TRIGGER <trigger_name> on <table_name> FOR UPDATE AS
        IF UPDATE(<column_name>)
        BEGIN
            RAISERROR ('my error here', 16, 1)
            ROLLBACK TRAN
            RETURN
        END
    

    Vir prudens non contra ventum mingit
  •  22-11-2007, 20:51 37662 σε απάντηση της 37629

    Απ: SQL rollback tran

    Θέλω να κάνω Insert. Ο πίνακας έχει 5 στήλες, η μία (Lock) είναι bit και παίρνει τιμές 0 και 1. Όταν είναι 0 (άρα unlocked) θέλω να γίνεται rollback. Έχω ακόμη μία απορία όμως. Πέρα απο το να δημιουργήσω το trigger, χρειάζεται να κάνω κάτι άλλο για να ενεργοποιηθεί, όπως θα έκανα για παράδειγμα με τη δόμηση ενός συμβάντος στην access (π.χ. με την φόρτωση της φόρμας)

    Ευχαριστώ.  


    Live fast, die young
  •  23-11-2007, 21:28 37688 σε απάντηση της 37662

    Απ: SQL rollback tran

     Καμια βοήθεια ρε παιδιά; 3 μέρες το παλεύω αλλά τίποτα.... 
    Live fast, die young
  •  26-11-2007, 08:58 37706 σε απάντηση της 37662

    Απ: SQL rollback tran

    CREATE TRIGGER <trigger_name>
    ON <table_name>
    FOR INSERT
    AS
      DECLARE @SOFTLOCK BIT

      SELECT @SOFTLOCK=SOFTLOCK
      FROM INSERTED
      
      IF @SOFTLOCK = 0
        ROLLBACK TRAN

    GO

    Ας πούμε ότι SoftLock ονομάζεται το πεδίο σου (μιας και το Lock είναι reserved). Αυτό παίζει μια χαρά όταν κάνεις τα insert ένα-ένα. Άν κάνεις INSERT INTO...SELECT τότε θα κάνει rollback ό,τι έχει μπει μέχρη τη στιγμή που θα συνατήσει το 0

    Κατά τ' άλλα δεν χρειάζεται να κάνεις κάτι άλλο, με το που θα τρέξεις το create αυτό, θα είναι ενεργό το trigger.


    Vir prudens non contra ventum mingit
  •  29-11-2007, 20:42 37865 σε απάντηση της 37706

    Απ: SQL rollback tran

    Δημιούργησα το εξής:

    CREATE TRIGGER [LockRecords] ON [dbo].[MainTablePer]

    FOR UPDATE

    AS

    IF (SELECT ReportingYear FROM MainTablePer) = 2007

    Begin

    RollBack

    end

    Υποτίθεται ότι όταν η ReportingYear, σε κάποια εγγραφή, έχει την τιμή 2007, δεν θα έπρεπε να επιτρέπονται αλλαγές. Το θέμα όμως είναι ότι ακόμη και στις εγγραφές που το πεδίο ReportingYear είναι Null, δεν επιτρέπονται οι αλλαγές, έτσι δεν μπορώ να κάνω update με την τιμή 2007, ώστε να την κλειδώσω όταν θα θέλω. Επιπλέον, μπορώ να αλλάξω την τιμή 2007 σε οτιδήποτε (π.χ.) σε 2008, αλλά μετά το 2008 δεν μπορώ να το αλλάξω!! 

    Είναι κάτι που δεν καταλαβαίνω και άρα το κάνω λάθος; Πρόθεσή μου είναι όσες εγγραφές έχουν 2007 στην πιό πάνω στήλη να μην είναι δυνατόν να τροποποιηθούν. 

     

    Ευχαριστώ.  


    Live fast, die young
  •  29-11-2007, 22:03 37869 σε απάντηση της 37865

    Απ: SQL rollback tran

    Το query που έγραψες λέει χονδρικά "Αν υπάρχει οποιαδήποτε εγγραφή στον πίνακα με την τιμή 2007, κάνε Rollback". Μάλιστα, ο τρόπος αυτός να γράφεις queries νομίζω ότι σημαίνει "διάλεξε μία τυχαία τιμή από τον πίνακα, και αν είναι 2007 κάνε rollback".

    Ο Μάνος σου έδωσε ένα καλό παράδειγμα στο προηγούμενο post για το πως να βρεις τις τιμές που άλλαξαν στον πίνακα. Σε ένα UPDATE trigger, οι νέες τιμές υπάρχουν στον προσωρινό πίνακα INSERTED ενώ οι προηγούμενες τιμές στον πίνακα DELETED. Οπότε, για να ελέγξεις αν άλλαξε μία εγγραφή η οποία είχε παλιά τιμή 2007, θα πρέπει να εκτελέσεις IF EXISTS(SELECT * FROM DELETED WHERE ReportingYear=2007) ...

    Τέλος, ρίξε μία ματιά στο Books Online. Περιγράφει πολύ καλά τον τρόπο με τον οποίο δουλεύουν τα triggers και τους πίνακες INSERTED, DELETED κλπ.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  29-11-2007, 22:31 37871 σε απάντηση της 37869

    Απ: SQL rollback tran

    Ευχαριστώ πολύ, τώρα δούλεψε!!!!


    Live fast, die young
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems