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

 

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

AFTER INSERT TRIGGER

Îåêßíçóå áðü ôï ìÝëïò axaros. Τελευταία δημοσίευση από το μέλος axaros στις 22-07-2005, 10:48. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-07-2005, 14:05 3326

    AFTER INSERT TRIGGER


    Παιδιά ,
    στην περίπτωση ενός INSERT
    μπορώ να κάνω rollback μόνο το action του trigger χωρίς να χάσω την εγγραφή που τον ενεργοποίησε;


    Πάνος Αβραμίδης
  •  05-07-2005, 17:23 3330 σε απάντηση της 3326

    Re: AFTER INSERT TRIGGER

    Συγνώμη που βιάστηκα αλλά το transaction είναι distibuted με χρήση linked server.
    Το παρακάτω statement κάνει αυτό που θέλω αλλά ζητώ τη γνώμη σας :

    CREATE TRIGGER tgrTest ON dbo.tblSourceTest
    AFTER INSERT
    AS

    SET XACT_ABORT ON
    BEGIN DISTRIBUTED TRANSACTION
    Insert Into [PC-PAVRM].[TEST DATABASE].dbo.tblTest
     Select Id,Des From Inserted
    Commit TRAN

    COMMIT TRANSACTION


    Πάνος Αβραμίδης
  •  05-07-2005, 17:46 3331 σε απάντηση της 3326

    Re: AFTER INSERT TRIGGER

    Τρίχες δουλεύει ... Παιδιά τα φώτα σας ....


    Πάνος Αβραμίδης
  •  16-07-2005, 11:36 3521 σε απάντηση της 3326

    Re: AFTER INSERT TRIGGER

    Το μόνο που βρήκα είναι η χρήση SAVEPOINT το οποίο δουλεύει μόνο για local transaction. Για distributed υποθέτω ότι έχασα ;
    Μπορεί να με βοηθήσει κάποιος ;


    Πάνος Αβραμίδης
  •  16-07-2005, 20:02 3532 σε απάντηση της 3521

    Re: AFTER INSERT TRIGGER

    Μπορείς να είσαι πιό σαφής και αναλυτικός στο τι θες να κάνεις;

    Από τον T-SQL κώδικα, το μόνο που καταλαβαίνω είναι ότι θες να εισάγεις κάποια από τα εισαχθέντα στοιχεία και κάπου αλλού ...

    Άρης
    Aris
  •  16-07-2005, 20:38 3533 σε απάντηση της 3532

    Re: AFTER INSERT TRIGGER

    Όχι ακριβώς ...
    Θέλω σε κάποιο INSERT να γίνεται triggered η εγγραφή σε κάποιο άλλο πίνακα σε κάποια άλλη βάση αλλά σε περίπτωση αποτυχίας να γίνεται rollback μόνο το action του trigger ...

    Βασικά το ζητούμενο είναι ότι και στο αντίστοιχο θέμα στο COM+ forum. Θέλω να κάνω export κάποιες πληροφορίες από μία βάση σε μία άλλη ...


    Πάνος Αβραμίδης
  •  16-07-2005, 21:28 3535 σε απάντηση της 3533

    Re: AFTER INSERT TRIGGER

    Τι εννοείς "αποτυχία"; Αφού η εγγραφή έχει μπει επιτυχώς...

    Η εισαγωγή γίνεται στα πλαίσια ευρύτερου Transaction που μπορεί να αποτύχει αργότερα;
    Σε αυτή την περίπτωση, μήπως πρέπει να τροποποιήσεις την σειρά των ενεργειών;

    Είναι η περίπτωση με τον Adaptive Sever Anywhere; Μου έχει μείνει η απορία γιατί ήθελες να έχεις ένα αποτυχημένο transaction ... Embarrassed

    Άρης


    Aris
  •  18-07-2005, 12:57 3567 σε απάντηση της 3326

    Re: AFTER INSERT TRIGGER

    Άρη καλημέρα ,
    Από το άρθρο :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/acdata/ac_8_md_06_4qcz.asp

    A trigger always operates as if there were an outstanding transaction in effect when the trigger is executed. This is definitely true if the statement firing the trigger is in an implicit or explicit transaction. It is also true in autocommit mode. When a statement begins executing in autocommit mode, there is an implied BEGIN TRANSACTION to allow the recovery of all modifications generated by the statement if it encounters an error. This implied transaction has no effect on the other statements in the batch because it is either committed or rolled back when the statement completes. This implied transaction is still in effect, however, when a trigger is called.

    Όσον αφορά το serviced component απλά ήθελα να δοκιμάσω την περίπτωση που πάει κάτι στραβά για αυτόν ακριβώς το λόγο έκανα rollback στο τέλος.
    Δεν θέλω να κάνω κάτι με κάποιο αποτυχημένο transaction.

    Παρεπιπτόντως ακόμα δεν έχω βρει κάτι για την περίπτωση Sybase. Από SQL server σε SQL Server δουλεύει μια χαρά ...

    Εάν τώρα εναλλακτικά το ίδιο πρόβλημα (export δεδομένων από μία βάση σε μία άλλη) το λύσω με trigger θέλω οπωσδήποτε η εγγραφή που (γίνεται Insert) να καταχωρείται πάντα και εάν συμβεί κάτι (π.χ. χάνω στιγμιαία την τοπική σύνδεση δικτύου) να γίνεται rollback μόνο το action του trigger.

    Για local transactions βρήκα ότι αυτό γίνεται με SAVEPOINTS.
    Στην περίπτωση που χρησιμοποιήσω linked server και distributed transaction από ότι διάβασα δεν υπάρχει υποστήριξη για SAVEPOINTS.


    Πάνος Αβραμίδης
  •  18-07-2005, 15:34 3574 σε απάντηση της 3567

    Re: AFTER INSERT TRIGGER

    Επανέρχομαι στο ζήτημα της λογικής που πρέπει να υλοποιηθεί:
    Στο άλλο thread, είχες πει ότι:

     axaros wrote:
    Αυτό που θέλω να κάνω είναι σε ένα βήμα να 
       1)Διαβάσω ένα set εγγραφών
       2)Να το μαρκάρω σαν exported
       3)Nα το εισάγω σε μία Export βάση

    Εάν αυτό ισχύει, και μπορείς να έχεις ένα tri-state flag (Not for export - Under export - Exported), μήπως θα μπορούσες να τροποποιήσεις την σειρά των ενεργειών ώστε να ξεμπλέξει λίγο το θέμα; Δηλαδή:
    1. Επιλέγεις τι πρέπει να εξαχθεί, και μαρκάρεις σαν "Under export"
    2. Κάνεις την εισαγωγή στην άλλη βάση
    3. Εξετάζεις το αποτέλεσμα του [2], διαβάζοντας τι μπήκε (ή τρως Timeout)
    4. Ανάλογα με το [3], αλλάζεις το "Under export" σε "Exported"
    Τα [2],[3],[4] θα μπορούσαν να παίζουν και σε άλλο Thread.

    Η [1] δεν έχει πρόβλημα transaction (ως προς την άλλη βάση). Εάν αποτυγχάνει τοπικά (ως προς την πρώτη βάση), το διαχειρίζεσαι τοπικά Smile
    Τα άλλα στάδια παίζουν ανεξάρτητα. Όταν πάρεις αποτέλεσμα, ή ενημερώνεις την πρώτη βάση ότι "ξεμπέρδεψες" ή επαναλαμβάνεις.

    Ελπίζω ότι έχω καταλάβει σωστά το πρόβλημα.Embarrassed
    Εάν όχι, ...

    Άρης


    Aris
  •  18-07-2005, 15:51 3575 σε απάντηση της 3574

    Re: AFTER INSERT TRIGGER

     Aris wrote:
    Επανέρχομαι στο ζήτημα της λογικής που πρέπει να υλοποιηθεί:
    Στο άλλο thread, είχες πει ότι:

     axaros wrote:
    Αυτό που θέλω να κάνω είναι σε ένα βήμα να 
       1)Διαβάσω ένα set εγγραφών
       2)Να το μαρκάρω σαν exported
       3)Nα το εισάγω σε μία Export βάση

    Εάν αυτό ισχύει, και μπορείς να έχεις ένα tri-state flag (Not for export - Under export - Exported), μήπως θα μπορούσες να τροποποιήσεις την σειρά των ενεργειών ώστε να ξεμπλέξει λίγο το θέμα; Δηλαδή:

    1. Επιλέγεις τι πρέπει να εξαχθεί, και μαρκάρεις σαν "Under export"



    Μου βάζεις ένα έξτρα βήμα ... Γιατί να κάνω update σαν under export ;
    Άλλα ούτως ή άλλως το serviced component δουλεύει μια χαρά.

    Εάν πάμε στη λογική trigger αλλάζει το πράγμα ...

    Βασικά η λύση serviced component "δεν άρεσε" γιατί ο συνεργάτης που θέλει τις πληροφορίες δουλεύει με το Omnis studio και για κάποιο λόγο μου έθεσε ότι δεν μπορεί να μιλήσει με COM. Οπότε καλούσε ένα console app με κάποιες παραμέτρους και αυτό με τη σειρά του έκανε το call στο serviced component με αποτέλεσμα να υπάρχει μία καθυστέρηση στην ενημέρωση των βάσεων. Επειδή όποια εγγραφή "πέφτει" στο σύστημα μου πρέπει να εμφανίζεται και στο δικό του (συγκεκριμένα τα παραπάνω γίνονταν όταν καλούσε κάποια εύρεση στην εφαρμογή του) και κάτω από αυτούς τους όρους η λύση trigger κρίθηκε καλύτερη.

    Υπό αυτό το σενάριο όταν "πέφτει" μια εγγραφή στο σύστημα μου ενημερώνεται και το δικό του ...




    Πάνος Αβραμίδης
  •  18-07-2005, 18:07 3587 σε απάντηση της 3575

    Re: AFTER INSERT TRIGGER

    Το extra βήμα έχει σαν αποτέλεσμα την αποσύνδεση της εφαρμογής σου από την εφαρμογή του συνεργάτη σου. Είναι μιά λογική messaging, ουσιαστικά.

    Εάν καμμία καθυστέρηση δεν είναι αποδεκτή, γιατί δεν χρησιμοποιείτε, και οι δύο, την ίδια βάση;
    Εάν κάποια καθυστέρηση είναι αποδεκτή αλλά πρέπει να υπάρχει πλήρης έλεγχος των ενημερώσεων, τότε η προτεινόμενη λύση:
    - εξασφαλίζει την ακαιραιότητα των δεδομένων
    - απεμπλέκει τα δικά σου transactions από τις ανάγκες ενημέρωσης του άλλου συστήματος (το ενημερώνεις μόνον όταν είσαι εντάξει και μπορείς)
    - Επιταχύνεις την δική σου λειτουργία, ειδικά εάν κάνεις τα βήματα ενημέρωσης σε άλλο thread
    - έχεις την δυνατότητα να τον ενημερώσεις σε batch mode (π.χ. κάθε 10 εγγραφές)

    Το κόστος (ένα update και ένα read από την άλλη βάση) δεν είναι τραγικό, εάν συγκριθεί με το κόστος ενός πλήρους rollback εάν κάτι δεν πάει καλά στην άλλη βάση.

    Άρης
    Aris
  •  19-07-2005, 12:26 3606 σε απάντηση της 3326

    Re: AFTER INSERT TRIGGER

    Άρη,
    δεν έχεις άδικο όσον αφορά την χρήση της ίδιας βάσης ... Φυσικά θα μπορούσε ο συνεργάτης μου να διαβάζει κατευθείαν από το δικό μου σύστημα τις unexported εγγραφές τις οποίες και χρειάζεται για να τις εμφανίσει στο ευρετήριο του και με μία batch διαδικασία ή ένα service που τρέχει ανά x χρονικά διαστήματα να "πέφτουν" οι εγγραφές στη δική του βάση και να μαρκάρονται σαν exported στη δική μου.

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

    Στην περίπτωση του serviced component αυτό που γινόταν ήταν, για να εμφανίσει σε ένα ευρετήριο στην εφαρμογή του τις εγγραφές που "έπεφταν" στο δικό μου σύστημα καλούσε το console app κλπ κλπ σε άλλο instance σε άλλη βάση σε άλλο μηχάνημα με την όποια καθυστέρηση...

    Στην περίπτωση trigger η ενημέρωση είναι άμεση αλλά εάν χρησιμοποιήσω ένα linked sevrver (σε άλλο instance) και distributed transaction δεν έχω τρόπο να εγγυηθώ ότι αν κάτι πάει στραβά η εγγραφή στον δίκο μου πίνακα (που ενεργοποιεί και τον trigger) δεν θα γίνει rollback ...

    Οπότε κατέληξα στη λύση trigger για ενημέρωση μίας άλλης βάσης στο τοπικό instance με τη χρήση SAVEPOINT.


    Πάνος Αβραμίδης
  •  19-07-2005, 13:31 3612 σε απάντηση της 3606

    Re: AFTER INSERT TRIGGER

     axaros wrote:

    ...

    Στην περίπτωση trigger η ενημέρωση είναι άμεση αλλά εάν χρησιμοποιήσω ένα linked sevrver (σε άλλο instance) και distributed transaction δεν έχω τρόπο να εγγυηθώ ότι αν κάτι πάει στραβά η εγγραφή στον δίκο μου πίνακα (που ενεργοποιεί και τον trigger) δεν θα γίνει rollback ...

    Οπότε κατέληξα στη λύση trigger για ενημέρωση μίας άλλης βάσης στο τοπικό instance με τη χρήση SAVEPOINT.



    Ακριβώς. Big Smile

    Ή στο ίδιο instance (αποτυχία σε ένα μηχάνημα) ή με την λύση που σου πρότεινα (messaging λογική σε δύο μηχανήματα).

    Άρης
    Aris
  •  21-07-2005, 15:14 3715 σε απάντηση της 3612

    Απ:Re: AFTER INSERT TRIGGER

    Το παρακάτω δούλεψε :

    CREATE TRIGGER tgrExport ON [dbo].[tblTest]
    FOR INSERT
    AS

    DECLARE @IId BigInt
    DECLARE @IDes nvarchar(50)

    SET @Iid = (Select Id From Inserted)
    SET @IDes = (Select Des From Inserted)

    COMMIT TRANSACTION
    EXECUTE Laptop.[TEST DATABASE].dbo.spInsertTestValues @IId,@IDes

     

     με linked server και RPC χωρίς να χάνω ποτέ την εγγραφή που ενεργοποιεί τον trigger.
    (Κάνω export σε άλλο instance,βάση σε άλλο μηχάνημα)
    Το ξέρω ότι δεν είναι ότι καλύτερο αλλά τι λέτε;

     


    Πάνος Αβραμίδης
  •  21-07-2005, 20:54 3735 σε απάντηση της 3715

    Απ:Re: AFTER INSERT TRIGGER

    Μιά χαρά είναι Smile [:)]

    Εάν θεωρήσουμε ότι ο trigger ξεκινάει implicit transaction, τότε το "κλείνεις" με το commit και επομένως δεν έχεις rollback του insert σου (sic).

    Εάν λοιπόν αποτύχει το execute, δεν σε χαλάει Cool [H]

    Άρης

    Υ.Γ. Καιρός να αναβθμιστείς σε "Ζωγράφος Μεγάλων Επιφανειών"Stick out tongue [:P]


    Aris
  • Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
    Προβολή Τροφοδοσίας RSS με μορφή XML
    Με χρήση του Community Server (Commercial Edition), από την Telligent Systems