Τι είναι τα triggers

Τι είναι τα triggers
Τι είναι τα triggers

Έχουν 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;
Τι είναι τα triggers

Φτιάχνουμε ένα πίνακα που θα γεμίζει από τον 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
Τι είναι τα triggers

Πάμε να φτιάξουμε άλλον έναν στον πίνακα για 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
Τι είναι τα triggers

Όπως βλέπουμε αυτή την φορά μας κράτησε τη τιμή που είχε ο πίνακας πριν γίνει update λόγο της επιλογής στο trigger for update.

Οι triggers είναι χρήσιμα εργαλεία αλλά όπως και τα περισσότερα features έρχεται με overhead και δεν είναι και λίγο.

Μοιράσου το

Αφήστε μία απάντηση