Spis treści

LibreOffice z silnikiem bazy PostgreSQL

Założenia

Konfiguracja umożliwiająca użytkowanie bez konieczności instalacji i bez uprawnień administratora:

Opis dotyczy konfiguracji w systemie Windows gdyż najczęściej tam mamy ograniczenia administracyjne.

PostgreSQL

Pobieranie z https://www.enterprisedb.com/download-postgresql-binaries

DBeaver

Pobieranie z https://dbeaver.io/download/

LibreOffice Portable

Pobieranie z https://www.libreoffice.org/download/portable-versions/

Konfiguracja i utworzenie bazy

Pobrany plik np. postgresql-17.4-1-windows-x64-binaries.zip rozpakowujemy np. do postaci:

C:\pgsql

W czasie pisania niniejszego dokumentu miałem problem z uruchomieniem wersji postgresql-18.0-2-windows-x64-binaries.zip. Otrzymywałem komunikat:

wykonywanie skryptu ładowania wstępnego ... ok 
wykonywanie inicjacji po ładowaniu wstępnym ... 
proces potomny został zatrzymany przez wyjątek 0xC0000005 
initdb: removing data directory "C:/pgsql_new/pgdata"

dlatego została użyta poprzednia wersja.

Inicjalizacja bazy

C:\pgsql\bin\initdb -D C:\pgsql\pgdata -U postgres -W -E UTF8 -A scram-sha-256

Jak widać pliki danych zostaną umieszczone w katalogu C:\pgsql\data.

Skrypty .vbs uruchamiania i wyłączenia silnika baz

Uruchomienie

start_postgres.vbs
Set WshShell = CreateObject("WScript.Shell")
cmd = """C:\pgsql\bin\pg_ctl.exe"" start -D ""C:\pgsql\pgdata"" -l ""C:\pgsql\pgdata\pgsql.log"""
WshShell.Run cmd, 0, False

Plik możemy podlinkować do Autostart systemu. Otwórz folder autostartu użytkownika przez wpisanie do Eksploratora plików:

%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup

lub możesz to szybko otworzyć:

shell:startup

Wyłączenie

stop_postgres.vbs
Set WshShell = CreateObject("WScript.Shell")
cmd = """C:\pgsql\bin\pg_ctl.exe"" stop -D ""C:\pgsql\pgdata"" -m fast"
WshShell.Run cmd, 0, False

Po ponownym uruchomieniu systemu silnik bazy danych powinien działać i możemy to sprawdzić w cmd:

C:\pgsql\bin\pg_ctl.exe status -D C:\pgsql\pgdata

Połączenie DBeaver

Za pierwszym razem łączymy się do bazy postgres z zaznaczeniem opcji Show all databases. Bez tego nie utworzymy nowej bazy danych. Oczywiście utworzenie nowego użytkownika, bazy i jej stryktury można zrobić „z palca” z poziomu cmd czy Admin4, ale lepiej od początku przywyknąć do użytkowania DBeaver. W DBeaver otrzymujemy kolorowanie składni, gdzie w cmd tego nie mamy.

Tworzenie użytkownika dla przyszłej bazy

CREATE ROLE piotr LOGIN PASSWORD 'piotr123';

lub

CREATE USER piotr WITH PASSWORD 'piotr123';

Tworzenie bazy dla uprzednio dodanego użytkownika

CREATE DATABASE mojadb OWNER piotr;

Tworzenie kolejnego użytkownika utworzonej bazy

CREATE USER adam WITH PASSWORD 'adam123';

Nadanie mu uprawnień do połączenia się z bazą

GRANT CONNECT ON DATABASE mojadb TO adam;

Nadanie uprawnień do korzystania ze schematu public

\c mojadb
GRANT USAGE ON SCHEMA public TO adam;

Nadanie uprawnień do odczytu danych

GRANT SELECT ON ALL TABLES IN SCHEMA public TO adam;

Nadanie pełnych uprawnień czyli do odczytu, usuwania, dodawania

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO adam;

Automatyczne uprawnienia dla przyszłych tabel

ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON TABLES TO nowyuzytkownik;

Minimalny ciąg dla nowego użytkownika pracującego z LO Base

-- Utwórz użytkownika (z loginem i hasłem)
CREATE USER uzytkownik WITH PASSWORD 'haslo123';
 
-- Daj mu możliwość łączenia się z bazą
GRANT CONNECT ON DATABASE mojabaza TO uzytkownik;
 
-- Przełącz się na daną bazę
\c mojabaza
 
-- Nadaj dostęp do schematu public (gdzie są tabele)
GRANT USAGE ON SCHEMA public TO uzytkownik;
 
-- Daj pełne prawa do wszystkich tabel i sekwencji (czyli danych)
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO uzytkownik;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO uzytkownik;
 
-- Ustaw, żeby wszystkie NOWE tabele i sekwencje też automatycznie były dostępne
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON TABLES TO uzytkownik;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON SEQUENCES TO uzytkownik;

Dlaczego \c mojabaza?

Będą połączonym do serwera postgresql z poziomu użytkownika postgres i użycia \c mojabaza możemy się rozłączyć i połączyć bezpośrednio do mojabaza użytkownikiem z uprawnieniami i dokończyć nadawanie uprawnień nowemu użytkownikowi.

Tabele

Tworzenie tabeli 'test_table'

Tworzona tabela musi zawierać minimum jedną kolumnę. Wprowadzenie polecenia CREATE TABLE test_table (); zakończy się błędem ERROR: cannot create a table without columns.

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    nazwa TEXT NOT NULL,
    opis TEXT,
    data_utworzenia TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Uwaga. Dodana kolumna o typie TEXT skutkuje tym, że po odświeżeniu tabel i wprowadzaniu danych tekstowych czasem w polach mogą pojawić się zera. Jeżeli tak się stanie odświeżenie tabel nie wystarcza. Trzeba wyłączyć i włączyć LO Base.

Dodanie kolumny 'lokalizacja' do tabeli 'test_table'

ALTER TABLE test_table
ADD COLUMN lokalizacja TEXT;

Dodanie kolumny 'rok' z wartością domyślną '2025' do tabeli 'test_table'

ALTER TABLE test_table
ADD COLUMN rok INTEGER DEFAULT 2025;

Dodanie kolumny 'kraj' z wartością domyślną 'Polska' obowiązkiem wpisu do tabeli 'test_table'

ALTER TABLE test_table
ADD COLUMN kraj TEXT NOT NULL DEFAULT 'Polska';

Dodanie kolumny 'artysta_id' z kluczem obcym 'artysci(id)'

Dzięki temu test_table.artysta_id będzie wskazywać na artysci.id.

ALTER TABLE test_table
ADD COLUMN artysta_id INTEGER REFERENCES artysci(id);

Struktura bazy

Tworzenie przykładowej tabeli artyści

CREATE TABLE artysci (
    id SERIAL PRIMARY KEY,
    nazwa TEXT NOT NULL UNIQUE
);

Tworzenie przykładowej tabeli utwory

CREATE TABLE utwory (
    id SERIAL PRIMARY KEY,
    tytul TEXT NOT NULL,
    rok INTEGER,
    czas INTERVAL,
    opis TEXT
);

Tworzenie tabeli łącznikowej

Ponieważ jeden utwór może mieć wielu artystów, a jeden artysta wiele utworów → relacja wiele-do-wielu (many-to-many).

CREATE TABLE utwor_artysta (
    utwor_id INTEGER REFERENCES utwory(id) ON DELETE CASCADE,
    artysta_id INTEGER REFERENCES artysci(id) ON DELETE CASCADE,
    PRIMARY KEY (utwor_id, artysta_id)
);

Unikanie duplikatów

Jeśli chcesz uniknąć duplikatów (np. dwa razy ten sam utwór-artysta), możesz wstawić unikatowe ograniczenie:

ALTER TABLE utwor_artysta ADD CONSTRAINT unikalny_utwor_artysta UNIQUE (utwor_id, artysta_id)

Połączenie LibreOffice Base