====== LibreOffice z silnikiem bazy PostgreSQL ====== ===== Założenia ===== Konfiguracja umożliwiająca użytkowanie bez konieczności instalacji i bez uprawnień administratora: * **PostgreSQL** - Zastosowanie tego silnika zdejmuje wszelkie ograniczenia bazy HSQLDB. Ponadto bezproblemowa instalacja i uruchomienie bez instalacji. W pełni profesjonalny silnik bazy danych. * **DBeaver** - Z uwagi na ograniczenia zarządzania bazą z poziomu LibreOffice Base korzystnie jest użyć do tego celu DBeaver. Przewyższa możliwościami również Admin4. Oczywiście nie wymaga instalacji. * **LibreOffice** - Zastosowanie wersji Portable umożliwia użycie w systemie gdzie nie mamy możliwości instalacji oprogramowania. 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** 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ć: * wciśnij **Win+R**, * wpisz: shell:startup * i naciśnij Enter. **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'': 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 ===== * Połącz z istniejąca bazą danych * wybierz **PostgreSQL** * Dalej * Nazwa bazy danych: **mojadb** * Serwer: **localhost** * Numer portu: **5432** * Dalej * Nazwa użytkownika: **piotr** * Wymagane hasło: **tak** * Dalej * Zakończ * Nadaj nazwę pliku * Zapisz