| | 11 | {{{ |
| | 12 | #!sql |
| | 13 | CREATE TRIGGER trg_failed_login_threshold |
| | 14 | AFTER INSERT ON Login_Attempt |
| | 15 | FOR EACH ROW |
| | 16 | EXECUTE FUNCTION trg_failed_login_threshold(); |
| | 17 | }}} |
| | 18 | |
| | 19 | == Функција == |
| | 20 | ==== SQL код ==== |
| | 21 | {{{ |
| | 22 | #!sql |
| | 23 | CREATE OR REPLACE FUNCTION trg_failed_login_threshold() |
| | 24 | RETURNS TRIGGER |
| | 25 | LANGUAGE plpgsql |
| | 26 | AS $$ |
| | 27 | DECLARE |
| | 28 | failed_count INTEGER; --declarirame promenliva so tip int za broenje na 3 neuspesni obidi |
| | 29 | BEGIN |
| | 30 | IF NEW.successful = FALSE THEN --dokolku loginot e neuspesen |
| | 31 | SELECT COUNT(*) |
| | 32 | INTO failed_count --zapisi vo failed_count promenlivata |
| | 33 | FROM Login_Attempt la --od Login_Attempt tabelata |
| | 34 | WHERE la.user_id = NEW.user_id -- kade sto e ist user id |
| | 35 | AND la.successful = FALSE --neuspesen obid |
| | 36 | AND la.attempt_date >= COALESCE( |
| | 37 | ( |
| | 38 | SELECT MAX(successful_login.attempt_date) |
| | 39 | FROM Login_Attempt successful_login |
| | 40 | WHERE successful_login.user_id = NEW.user_id |
| | 41 | AND successful_login.successful = TRUE |
| | 42 | AND successful_login.attempt_date < NEW.attempt_date |
| | 43 | ), |
| | 44 | '-infinity'::timestamptz |
| | 45 | ); |
| | 46 | |
| | 47 | IF failed_count > 0 AND MOD(failed_count, 3) = 0 THEN --failed count mora da bide > 0 i failed count modul 3 mora da bide 0 |
| | 48 | |
| | 49 | INSERT INTO System_Event ( |
| | 50 | user_id, |
| | 51 | user_email, |
| | 52 | event_type, |
| | 53 | description |
| | 54 | ) |
| | 55 | VALUES ( |
| | 56 | NEW.user_id, |
| | 57 | NEW.email, |
| | 58 | 'THREE_UNSUCCESSFUL_LOGINS', |
| | 59 | 'The user failed to login 3 times in a row' |
| | 60 | ); |
| | 61 | END IF; |
| | 62 | END IF; |
| | 63 | RETURN NEW; |
| | 64 | END; |
| | 65 | $$; |
| | 66 | }}} |