Τι είναι τα triggers
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
Έχουν overhead; Που είναι η χρησιμότητα τους; και τέλος πως φτιάχνονται;
Υπάρχουν 3 διαφορετικά είδη: DDL triggers για actions CREATE / DROP, AFTER LOGON triggers για όταν συνδέεται ένας χρήστης DML triggers για actions UPDATE, Insert, DELETE.
Στο άρθρο θα ασχοληθούμε με DML triggers.
Τι είναι τα DML triggers
Είναι μια ειδική procedure που τρέχει όταν κάποιος χρήστης προσπαθεί να κάνει κάποιο DML action (UPDATE,INSERT,DELETE) στον πίνακα ή view που έχει φτιαχτεί.
Ο σκοπός της όταν ενεργοποιηθεί ποικίλει, μπορεί να θέλουμε να σηκώσει κάποιο error, να στείλει κάποιο email, να κάνει log τις εγγραφές σε έναν άλλον πίνακα και πολλά άλλα.
Πως φτιάχνονται
Φτιάχνουμε ένα πίνακα με 3 εγγραφές:
IF NOT EXISTS(select * from sysobjects where name='test') create table test ( onoma varchar(10), tilefono varchar(20)) GO insert into test values('Stratos','210101010′) insert into test values('Georgos','213920193′) insert into test values('Nikos','210101010′)
Commands completed successfully.
(1 row affected)
(1 row affected)
(1 row affected)
Total execution time: 00:00:00.059
select onoma,tilefono from test;
Φτιάχνουμε ένα πίνακα που θα γεμίζει από τον trigger:
IF NOT EXISTS(select * from sysobjects where name='triggerINFO') create table triggerINFO(onoma varchar(100),tilefono varchar(100),pote_Svistike datetime)
Commands completed successfully.
Total execution time: 00:00:00.013
Είναι ώρα να φτιάξουμε τα trigger μας.
Όταν φτιάχνουμε ένα trigger πρέπει λαμβάνουμε πάντα υπόψιν μας τις 3 περιπτώσεις αναλόγα το σε ποιό action θέλουμε να γίνει activate:
/*
For INSERT operation, the INSERTED table will store the records being inserted
for DELETE operation, the DELETED table will store the records being deleted
for UPDATE operation, the DELETED table will store the original value of the records being updated and INSERTED stores the new value
*/
create trigger triggerfordelete on dbo.test for delete as insert into triggerinfo(onoma,tilefono,pote_Svistike) select d.onoma,d.tilefono,SYSDATETIME() from deleted d where tilefono like '210%'
Commands completed successfully.
Total execution time: 00:00:00.019
Τώρα που τον φτιάξαμε πάμε να τον δοκιμάσουμε σβήνοντας μια εγγραφή από τον πίνακα:
delete from test where onoma='Stratos'
(1 row affected)
(1 row affected)
Total execution time: 00:00:00.012
Βλέπουμε έχουμε την τιμή που έσβησε ο χρήστης φυλαγμένη στον άλλον πίνακα:
select * from triggerinfo
(1 row affected)
Total execution time: 00:00:00.016
Πάμε να φτιάξουμε άλλον έναν στον πίνακα για update:
create trigger triggerforupdate on dbo.test for update as insert into triggerinfo(onoma,tilefono,pote_Svistike) select d.onoma,d.tilefono,SYSDATETIME() from deleted d
Commands completed successfully.
Total execution time: 00:00:00.018
Ας κάνουμε την δοκιμή μας:
update test set tilefono = '2251020491' where onoma = 'Georgos'
(1 row affected)
(1 row affected)
Total execution time: 00:00:00.005
Όπως θα δείτε και σε αυτό το παράδειγμα έβγαλε 2 results. Γιατί άραγε;;;
Γιατι πολύ απλά στο πρώτο result έχει την εγγραφή της τιμής πριν αλλάξει στον INFO πίνακα απο το trigger.
Στην δεύτερη γραμμή βρίσκετε το αποτέλεσμα του update:
select * from triggerinfo
(2 rows affected)
Total execution time: 00:00:00.016
Όπως βλέπουμε αυτή την φορά μας κράτησε τη τιμή που είχε ο πίνακας πριν γίνει update λόγο της επιλογής στο trigger for update.
Οι triggers είναι χρήσιμα εργαλεία αλλά όπως και τα περισσότερα features έρχεται με overhead και δεν είναι και λίγο.