]> begriffs open source - ai-pg/blob - full-docs/src/sgml/html/event-trigger-database-login-example.html
PG 18 docs from https://ftp.postgresql.org/pub/source/v18.0/postgresql-18.0-docs...
[ai-pg] / full-docs / src / sgml / html / event-trigger-database-login-example.html
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>38.5. A Database Login Event Trigger Example</title><link rel="stylesheet" type="text/css" href="stylesheet.css" /><link rev="made" href="pgsql-docs@lists.postgresql.org" /><meta name="generator" content="DocBook XSL Stylesheets Vsnapshot" /><link rel="prev" href="event-trigger-table-rewrite-example.html" title="38.4. A Table Rewrite Event Trigger Example" /><link rel="next" href="rules.html" title="Chapter 39. The Rule System" /></head><body id="docContent" class="container-fluid col-10"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="5" align="center">38.5. A Database Login Event Trigger Example</th></tr><tr><td width="10%" align="left"><a accesskey="p" href="event-trigger-table-rewrite-example.html" title="38.4. A Table Rewrite Event Trigger Example">Prev</a> </td><td width="10%" align="left"><a accesskey="u" href="event-triggers.html" title="Chapter 38. Event Triggers">Up</a></td><th width="60%" align="center">Chapter 38. Event Triggers</th><td width="10%" align="right"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="10%" align="right"> <a accesskey="n" href="rules.html" title="Chapter 39. The Rule System">Next</a></td></tr></table><hr /></div><div class="sect1" id="EVENT-TRIGGER-DATABASE-LOGIN-EXAMPLE"><div class="titlepage"><div><div><h2 class="title" style="clear: both">38.5. A Database Login Event Trigger Example <a href="#EVENT-TRIGGER-DATABASE-LOGIN-EXAMPLE" class="id_link">#</a></h2></div></div></div><p>
3       The event trigger on the <code class="literal">login</code> event can be
4       useful for logging user logins, for verifying the connection and
5       assigning roles according to current circumstances, or for session
6       data initialization. It is very important that any event trigger using
7       the <code class="literal">login</code> event checks whether or not the database is
8       in recovery before performing any writes. Writing to a standby server
9       will make it inaccessible.
10     </p><p>
11       The following example demonstrates these options.
12 </p><pre class="programlisting">
13 -- create test tables and roles
14 CREATE TABLE user_login_log (
15   "user" text,
16   "session_start" timestamp with time zone
17 );
18 CREATE ROLE day_worker;
19 CREATE ROLE night_worker;
20
21 -- the example trigger function
22 CREATE OR REPLACE FUNCTION init_session()
23   RETURNS event_trigger SECURITY DEFINER
24   LANGUAGE plpgsql AS
25 $$
26 DECLARE
27   hour integer = EXTRACT('hour' FROM current_time at time zone 'utc');
28   rec boolean;
29 BEGIN
30 -- 1. Forbid logging in between 2AM and 4AM.
31 IF hour BETWEEN 2 AND 4 THEN
32   RAISE EXCEPTION 'Login forbidden';
33 END IF;
34
35 -- The checks below cannot be performed on standby servers so
36 -- ensure the database is not in recovery before we perform any
37 -- operations.
38 SELECT pg_is_in_recovery() INTO rec;
39 IF rec THEN
40   RETURN;
41 END IF;
42
43 -- 2. Assign some roles. At daytime, grant the day_worker role, else the
44 -- night_worker role.
45 IF hour BETWEEN 8 AND 20 THEN
46   EXECUTE 'REVOKE night_worker FROM ' || quote_ident(session_user);
47   EXECUTE 'GRANT day_worker TO ' || quote_ident(session_user);
48 ELSE
49   EXECUTE 'REVOKE day_worker FROM ' || quote_ident(session_user);
50   EXECUTE 'GRANT night_worker TO ' || quote_ident(session_user);
51 END IF;
52
53 -- 3. Initialize user session data
54 CREATE TEMP TABLE session_storage (x float, y integer);
55 ALTER TABLE session_storage OWNER TO session_user;
56
57 -- 4. Log the connection time
58 INSERT INTO public.user_login_log VALUES (session_user, current_timestamp);
59
60 END;
61 $$;
62
63 -- trigger definition
64 CREATE EVENT TRIGGER init_session
65   ON login
66   EXECUTE FUNCTION init_session();
67 ALTER EVENT TRIGGER init_session ENABLE ALWAYS;
68 </pre><p>
69     </p></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="event-trigger-table-rewrite-example.html" title="38.4. A Table Rewrite Event Trigger Example">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="event-triggers.html" title="Chapter 38. Event Triggers">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="rules.html" title="Chapter 39. The Rule System">Next</a></td></tr><tr><td width="40%" align="left" valign="top">38.4. A Table Rewrite Event Trigger Example </td><td width="20%" align="center"><a accesskey="h" href="index.html" title="PostgreSQL 18.0 Documentation">Home</a></td><td width="40%" align="right" valign="top"> Chapter 39. The Rule System</td></tr></table></div></body></html>