[파이썬] PostgreSQL 데이터베이스 트리거

PostgreSQL is a powerful and robust open-source relational database management system. One of its key features is the ability to create triggers, which are special database objects that are executed automatically when certain events occur.

In this blog post, we will explore how to create and use PostgreSQL triggers using Python. We will cover the basics of triggers, their syntax, and provide a simple example to illustrate their usage.

What is a PostgreSQL Trigger?

A trigger in PostgreSQL is a function that is automatically executed before or after a specified event occurs on a table, such as an INSERT, UPDATE, or DELETE operation. Triggers are commonly used to enforce data integrity rules, log changes, or perform additional actions based on certain events.

Creating a PostgreSQL Trigger

To create a trigger in PostgreSQL, you need to define a trigger function and associate it with a specific event on a table. You can use Python along with the plpython3u extension in PostgreSQL to define trigger functions in Python.

The basic syntax for creating a trigger is as follows:

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {event} ON table_name
[FOR EACH {ROW | STATEMENT}]
EXECUTE FUNCTION function_name(arguments);

Where:

Example: Logging Changes with a Trigger

Let’s illustrate the usage of triggers in PostgreSQL with a simple example. We will create a trigger that logs any changes made to a specific table by inserting a new record into a log table.

First, let’s create the main table:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    position TEXT NOT NULL,
    salary NUMERIC(10, 2) NOT NULL
);

Next, we create the log table, which will store the changes:

CREATE TABLE employee_log (
    id SERIAL PRIMARY KEY,
    change_time TIMESTAMP DEFAULT NOW(),
    operation TEXT NOT NULL,
    employee_id INT NOT NULL,
    old_values JSONB,
    new_values JSONB
);

Now, we can define our trigger function in Python. The function will be executed after each INSERT, UPDATE, or DELETE operation on the employees table:

CREATE OR REPLACE FUNCTION log_employee_changes()
RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP = 'INSERT' THEN
        INSERT INTO employee_log (operation, employee_id, new_values)
        VALUES ('INSERT', NEW.id, ROW_TO_JSON(NEW));
    ELSIF TG_OP = 'UPDATE' THEN
        INSERT INTO employee_log (operation, employee_id, old_values, new_values)
        VALUES ('UPDATE', OLD.id, ROW_TO_JSON(OLD), ROW_TO_JSON(NEW));
    ELSIF TG_OP = 'DELETE' THEN
        INSERT INTO employee_log (operation, employee_id, old_values)
        VALUES ('DELETE', OLD.id, ROW_TO_JSON(OLD));
    END IF;
    
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

Finally, we can create the trigger and associate it with the employees table:

CREATE TRIGGER employee_changes_trigger
AFTER INSERT OR UPDATE OR DELETE ON employees
FOR EACH ROW
EXECUTE FUNCTION log_employee_changes();

Now, whenever a new employee is inserted, updated, or deleted in the employees table, a corresponding record will be added to the employee_log table, capturing the details of the change.

Conclusion

PostgreSQL triggers provide a powerful way to automate actions and enforce data integrity rules when certain events occur on a table. By using Python, we can define trigger functions that can perform complex tasks to enhance the functionality and maintain the consistency of a PostgreSQL database.

In this blog post, we explored the basics of creating triggers in PostgreSQL using Python. We covered the syntax for creating triggers and provided a simple example of how to use triggers for logging changes in a table.

Using triggers effectively can greatly improve the flexibility and functionality of your PostgreSQL database applications. It is worth exploring further to discover the many possibilities that triggers offer.