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.
Pobieranie z https://www.enterprisedb.com/download-postgresql-binaries
Pobieranie z https://dbeaver.io/download/
Pobieranie z https://www.libreoffice.org/download/portable-versions/
Pobrany plik np. postgresql-17.4-1-windows-x64-binaries.zip rozpakowujemy np. do postaci:
postgresql-17.4-1-windows-x64-binaries.zip
C:\pgsql
W czasie pisania niniejszego dokumentu miałem problem z uruchomieniem wersji postgresql-18.0-2-windows-x64-binaries.zip. Otrzymywałem komunikat:
postgresql-18.0-2-windows-x64-binaries.zip
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.
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.
C:\pgsql\data
Uruchomienie
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
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:
cmd
C:\pgsql\bin\pg_ctl.exe status -D C:\pgsql\pgdata
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.
Show all databases
Admin4
CREATE ROLE piotr LOGIN PASSWORD 'piotr123';
lub
CREATE USER piotr WITH PASSWORD 'piotr123';
CREATE DATABASE mojadb OWNER piotr;
CREATE USER adam WITH PASSWORD 'adam123';
GRANT CONNECT ON DATABASE mojadb TO adam;
\c mojadb GRANT USAGE ON SCHEMA public TO adam;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO adam;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO adam;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO nowyuzytkownik;
-- 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;
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.
\c mojabaza
mojabaza
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 ();
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 );
ALTER TABLE test_table ADD COLUMN lokalizacja TEXT;
ALTER TABLE test_table ADD COLUMN rok INTEGER DEFAULT 2025;
ALTER TABLE test_table ADD COLUMN kraj TEXT NOT NULL DEFAULT 'Polska';
Dzięki temu test_table.artysta_id będzie wskazywać na artysci.id.
test_table.artysta_id
artysci.id
ALTER TABLE test_table ADD COLUMN artysta_id INTEGER REFERENCES artysci(id);
CREATE TABLE artysci ( id SERIAL PRIMARY KEY, nazwa TEXT NOT NULL UNIQUE );
CREATE TABLE utwory ( id SERIAL PRIMARY KEY, tytul TEXT NOT NULL, rok INTEGER, czas INTERVAL, opis TEXT );
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) );
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)