Skip to content

Commit 65d6efe

Browse files
[ADD] Triggers
1 parent 431b5b4 commit 65d6efe

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

classes/33-store-procedures.sql

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,72 @@ FROM employees;
5757

5858
SELECT *
5959
FROM raise_history;
60+
61+
-- user_login procedure
62+
CREATE EXTENSION IF NOT EXISTS pgcrypto;
63+
64+
INSERT INTO "user" (username, password, last_login, created_at, updated_at)
65+
VALUES ('Melissa', crypt('123456', gen_salt('bf')), NULL, NOW(), NOW());
66+
67+
CREATE OR REPLACE PROCEDURE user_login(user_name VARCHAR, user_password VARCHAR) AS $$
68+
DECLARE
69+
was_found BOOLEAN;
70+
found_user_id INT;
71+
are_valid_credentials BOOLEAN;
72+
BEGIN
73+
SELECT COUNT(*) INTO was_found
74+
FROM "user" WHERE username = user_name;
75+
76+
RAISE NOTICE 'was_found: %', was_found;
77+
78+
IF (was_found = false) THEN
79+
RAISE EXCEPTION 'User not found: %', user_name;
80+
END IF;
81+
82+
SELECT id INTO found_user_id
83+
FROM "user" WHERE username = user_name;
84+
85+
SELECT COUNT(*) INTO are_valid_credentials
86+
FROM "user"
87+
WHERE id = found_user_id
88+
AND password = crypt(user_password, password);
89+
90+
IF (are_valid_credentials = false) THEN
91+
INSERT INTO session_failed (user_id)
92+
VALUES (found_user_id);
93+
94+
COMMIT;
95+
96+
RAISE EXCEPTION 'Invalid credentials';
97+
END IF;
98+
99+
UPDATE "user"
100+
SET last_login = NOW()
101+
WHERE username = user_name;
102+
103+
COMMIT;
104+
105+
RAISE NOTICE 'User with valid credentials: %', are_valid_credentials;
106+
END;
107+
$$ LANGUAGE plpgsql;
108+
109+
CALL user_login('Stiven', '12345');
110+
111+
SELECT *
112+
FROM "user";
113+
114+
SELECT *
115+
FROM session_failed;
116+
117+
ALTER TABLE session_failed
118+
ADD CONSTRAINT fk_user_id
119+
FOREIGN KEY (user_id)
120+
REFERENCES "user" (id);
121+
122+
SELECT *
123+
FROM session;
124+
125+
ALTER TABLE session
126+
ADD CONSTRAINT fk_user_id
127+
FOREIGN KEY (user_id)
128+
REFERENCES "user" (id);

classes/34-triggers.sql

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
CREATE OR REPLACE FUNCTION create_session_log()
2+
RETURNS TRIGGER AS $$
3+
BEGIN
4+
INSERT INTO "session" (user_id)
5+
VALUES (NEW.id);
6+
7+
RETURN NEW;
8+
END;
9+
$$ LANGUAGE plpgsql;
10+
11+
CREATE OR REPLACE TRIGGER create_session_trigger
12+
AFTER UPDATE ON "user"
13+
FOR EACH ROW
14+
WHEN (OLD.last_login IS DISTINCT FROM NEW.last_login)
15+
EXECUTE FUNCTION create_session_log();
16+
17+
CALL user_login('Stiven', '123456');
18+
19+
SELECT *
20+
FROM "user";
21+
22+
SELECT *
23+
FROM "session";
24+
25+
SELECT *
26+
FROM session_failed;

0 commit comments

Comments
 (0)