Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Implementing Stored Procedures and Containerized Deployment in openGauss

Tech May 15 1

Overveiw of Server-Side Logic in openGauss

openGauss serves as a robust open-source relational database management system suitable for enterprise-grade scenarios. As organizational data scales and operational workflows become intricate, the necessity for automated database management grows. Leveraging server-side programming tools such as Stored Procedures allows developers to encapsulate complex logic directly within the database engine. This approach minimizes network traffic between the application layer and the database, thereby enhancing execution speed and securing sensitive data access patterns.

Fundamentals of Stored Procedures

Concept and Advantages

A stored procedure represents a compiled collection of SQL statements saved on the server. Unlike ad-hoc queries, these routines are pre-compiled and optimized, offering several architectural benefits:

  • Modularity: Complex operations are bundled into reusable modules.
  • Consistency: Business rule are enforced uniformly at the database layer.
  • Security: Access rights can be granted to execute specific procedures without exposing underlying tables.
  • Performance: Reduced round-trips lower latency compared to multiple individual queries.

Defining Basic Operations

To illustrate implementation, we define a schema for staff management and establish corresponding procedural functions for Create, Read, Update, and Delete (CRUD) operations.

Schema Initialization

-- Initialize the personnel inventory table
CREATE TABLE personnel_inventory (
    staff_id INTEGER PRIMARY KEY,
    full_name VARCHAR(100),
    compensation NUMERIC(15, 2),
    dept_code VARCHAR(50)
);

Procedure Implementation

The following examples demonstrate how to define logic using the PL/pgSQL language within openGauss.

-- Registration routine
CREATE OR REPLACE PROCEDURE register_staff(
    p_id INTEGER,
    p_name VARCHAR,
    p_pay NUMERIC,
    p_dept VARCHAR
)
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO personnel_inventory (staff_id, full_name, compensation, dept_code)
    VALUES (p_id, p_name, p_pay, p_dept);
END;
$$;
-- Modification routine
CREATE OR REPLACE PROCEDURE modify_staff_details(
    p_id INTEGER,
    p_name VARCHAR,
    p_pay NUMERIC,
    p_dept VARCHAR
)
LANGUAGE plpgsql
AS $$
BEGIN
    UPDATE personnel_inventory
    SET full_name = p_name, compensation = p_pay, dept_code = p_dept
    WHERE staff_id = p_id;
END;
$$;
-- Removal routine
CREATE OR REPLACE PROCEDURE remove_staff(p_id INTEGER)
LANGUAGE plpgsql
AS $$
BEGIN
    DELETE FROM personnel_inventory
    WHERE staff_id = p_id;
END;
$$;

Execution Examples

-- Invoke registration
CALL register_staff(101, 'Alice Chen', 65000.00, 'DEV');

-- Invoke modification
CALL modify_staff_details(101, 'Alice Chen', 72000.00, 'Architecture');

-- Invoke removal
CALL remove_staff(101);

Advanced Procedural Patterns

Beyond simple CRUD actions, stored procedures facilitate sophisticated data engineering tasks.

High-Volume Data Ingestion

Processing records individually can be inefficient. Utilizing composite types and loops allows for bulk ingestion within a single transaction context.

-- Define a custom record type
CREATE TYPE staff_batch_type AS (
    id_val INTEGER,
    name_val VARCHAR(100),
    wage_val NUMERIC(15, 2),
    sector_val VARCHAR(50)
);

-- Bulk loading procedure
CREATE OR REPLACE PROCEDURE ingest_staff_batch(staff_data staff_batch_type[])
LANGUAGE plpgsql
AS $$
DECLARE
    current_rec staff_batch_type;
BEGIN
    FOREACH current_rec IN ARRAY staff_data
    LOOP
        INSERT INTO personnel_inventory (staff_id, full_name, compensation, dept_code)
        VALUES (current_rec.id_val, current_rec.name_val, current_rec.wage_val, current_rec.sector_val);
    END LOOP;
END;
$$;

-- Execution call
CALL ingest_staff_batch(ARRAY[
    ROW(102, 'Bob Smith', 80000, 'Sales')::staff_batch_type,
    ROW(103, 'Carol White', 55000, 'Support')::staff_batch_type
]);

Integrity Enforcement

Data quality can be maintained by embedding validation rules directly within the insertion logic.

-- Enhanced registration with validation
CREATE OR REPLACE PROCEDURE secure_register_staff(
    p_id INTEGER,
    p_name VARCHAR,
    p_pay NUMERIC,
    p_dept VARCHAR
)
LANGUAGE plpgsql
AS $$
BEGIN
    -- Validate financial constraints
    IF p_pay IS NULL OR p_pay <= 0 THEN
        RAISE EXCEPTION 'Compensation value must be positive';
    END IF;

    -- Ensure departmental assignment
    IF TRIM(p_dept) = '' THEN
        RAISE EXCEPTION 'Department identifier is required';
    END IF;

    INSERT INTO personnel_inventory (staff_id, full_name, compensation, dept_code)
    VALUES (p_id, p_name, p_pay, p_dept);
    
    COMMIT;
END;
$$;

Scheduled Maintenance Routines

Procedures support maintenance workflows, such as archiving or backup activities triggered externally.

-- Daily archival logic
CREATE OR REPLACE PROCEDURE archive_daily_personnel()
LANGUAGE plpgsql
AS $$
DECLARE
    target_path TEXT := '/mnt/data/archives/';
    file_suffix TEXT := to_char(current_date, 'YYYYMMDD') || '.csv';
BEGIN
    EXECUTE format(
        'COPY personnel_inventory TO ''%s%s'' WITH CSV HEADER',
        target_path, 
        file_suffix
    );
END;
$$;

Containerized Deployment Workflow

Deploying openGauss efficiently often involves container orchestration. The following guide outlines preparing and launching a single-node instance using Docker.

Prerequisites and Architecture

Supported environments typically include x86_64 architectures running CentOS 7.6+ or ARM64 systems on openEuler 20.03 LTS. Prior to building, acquire the openGauss binary distribution package and ensure appropriate yum repositories are configured.

Docker Image Construction

The distribution includes a shell script (buildDockerImage.sh) designed to compile the database image. Verification integrity checks (SHA256) are mandatory unless explicit disabled.

# Navigate to the dockerfiles directory
cd openGauss-server/docker/dockerfiles/X.X.X

# Generate checksum file (if not using -i flag)
sha256sum openGauss-X.X.X-CentOS-64bit.tar.bz2 > sha256_file_amd64

# Build the image
./buildDockerImage.sh -v X.X.X

Runtime Configuration

Several environment variables govern the initialization process when starting a container.

  • GS_PASSWORD: Sets credentials for the default admin (omm) and test user (gaussdb). Requires complexity (mix of uppercase, lowercase, digits, special chars).
  • GS_NODENAME: Defines the cluster node identity (default: gaussdb).
  • GS_USERNAME: Specifies the connection username (default: gaussdb).
  • GS_PORT: Sets the listening port (default: 5432).

Instance Launch and Persistence

To run the service with persistent storage and port mapping:

# Start container with volume mount and password config
docker run --name opengauss-db \
  --privileged=true \
  -d \
  -e GS_PASSWORD=Str0ngP@ssw0rd! \
  -v /host/opengauss/data:/var/lib/opengauss \
  -p 8888:5432 \
  opengauss:latest

External connectivity requires passing the host IP and mapped port via the CLI tool:

$ gsql -d postgres -U gaussdb -W'YourPassword' -h 127.0.0.1 -p 8888

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.