<?xml version="1.0" encoding="UTF-8"?>
<chapter id="details.database">
<chapterinfo>
  <authorgroup>
    <author
>&Tony.Bloomfield; &Tony.Bloomfield.mail;</author>
    <author
>&Jack.H.Ostroff; &Jack.H.Ostroff.mail; </author>
  </authorgroup>
  <date
>1 грудня 2024 року</date>
  <releaseinfo
>5.2.0</releaseinfo>
</chapterinfo>
<title
>База даних</title>

<sect1 id="details.database.usage"
><title
>Користування реляційними базами даних</title>

<sect2
><title
>Вступ</title>
<para
>Починаючи з версії 1.0, &kmymoney; надає вам змогу зберігати ваші дані у реляційній базі даних. Однією з переваг використання цього загальновизнаного формату є те, що він уможливлює перегляд ваших даних за допомогою графічних інтерфейсів, зокрема OpenOffice.org<trademark class="copyright"
></trademark
> або LibreOffice<trademark class="copyright"
></trademark
>, а також перетворення їх у формат, з яким ще не може працювати &kmymoney;. Крім того, навіть незначні знання <acronym
><ulink url="https://en.wikipedia.org/wiki/SQL"
>SQL</ulink
></acronym
> (Structured Query Language (структурованої мови запитів), мови, що повсюдно використовується для доступу до реляційних баз даних) нададуть вам змогу спростити експортування даних до зовнішньої програми, наприклад до програми для роботи з бюджетами. </para>

<note>
  <para
>Хоча більшість систем реляційних баз даних дозволяють одночасний доступ до бази даних більш ніж одному користувачеві, це неможливо з &kmymoney;. Незважаючи на те, що &kmymoney; може зберігати свої дані в реляційній базі даних, програма фактично використовує базу даних як інший тип зберігання файлів. Коли ви відкриваєте файл, програма зчитує всі дані з бази даних. Коли ви працюєте зі своїми даними, зміни вносяться лише до внутрішньої пам'яті; вони не відразу записуються назад до бази даних. Лише коли ви зберігаєте свої дані, &kmymoney; записуватиме увесь файл назад до бази даних. </para>

  <para
>Надходили запити щодо того, щоб програма &kmymoney; оновлювала базу даних для кожної зміни даних, але це вимагатиме суттєвих змін в усій методиці, за якою програма керує своїми внутрішніми структурами даних, тому вкрай малоймовірно, що це станеться в осяжному майбутньому. </para>
</note>
</sect2>

<sect2
><title
>Приготування</title>
<para
>Для отримання доступу до бази даних &kmymoney; використовує модуль SQL, створений компанією &Qt; Software як частина програмної бібліотеки &Qt;. У цьому модулі на основі драйверів передбачено підтримку декількох різних систем роботи з базами даних. У &Qt;є драйвери для багатьох відкритих і закритих систем роботи з реляційними базами даних, зокрема <trademark
>MySQL</trademark
>, PostgreSQL і SQLCipher.. У модулі передбачено також підтримку деяких «важчих», промислових систем, зокрема Oracle<trademark class="registered"
></trademark
> і IBM DB2<trademark class="registered"
></trademark
>. </para>

<para
>У попередніх версіях &kmymoney; було передбачено підтримку <ulink url="https://www.sqlite.org"
>SQLite</ulink
>. Її було замінено підтримкою <ulink url="https://www.zetetic.net/sqlcipher"
>SQLCipher</ulink
>, автономного відгалуження бібліотеки бази даних SQLite, у якому додано 256-бітове шифрування AES та інші захисні можливості. Драйвер SQLCipher здатен читати наявні файли SQLite. Додаткові відомості наведено у розділі <link linkend="details.database.sqlcipher"
>SQLCipher</link
> нижче. </para>

<para
>За винятком SQLCipher, у вказаних системах використовується клієнт-серверна модель: клієнтське програмне забезпечення працює на «вашому» комп’ютері, а серверна частина — на комп’ютері, на якому зберігається сама база даних і який може обмінюватися даними з вашим комп’ютером локальною мережею або інтернетом. Звичайно ж, у типовому режимі керування вашими особистими фінансами &kmymoney; «ваш» комп’ютер може виконувати обидві функції: клієнта і сервера. Отже, насамперед вам слід визначитися з тим, яку систему роботи з базою даних ви бажаєте використовувати, отже визначитися: слід встановити лише клієнт чи клієнт разом з сервером. </para>

<para
>Окрім самого програмного забезпечення для роботи з базою даних, вам слід встановити і відповідний модуль драйвера &Qt;. Модулі драйверів для більшості поширених баз даних можна знайти у пакунках більшості дистрибутивів &Linux;. Якщо потрібного вам пакунка немає, пошукайте на <ulink url="https://www.qt.io/"
>вебсайті &Qt;</ulink
> за ключовими словами «SQL drivers». </para>

<note>
  <para
>SQLCipher та SQLite не працюють у межах моделі клієнт-сервер; всі бази даних зберігаються у звичайних файлах, локальних або віддалених, програма отримує до них доступ за допомогою звичайних для основної операційної системи методів. У разі використання цієї системи роботи з базами даних достатньо встановити лише один пакунок програмного забезпечення та драйвер. Крім того, деякі з наведених нижче відомостей, що стосуються адміністрування, можуть бути незастосовними. </para>
</note>
</sect2>

<sect2
><title
>Адміністрування</title>
<para
>Нагляд за базами даних є трохи складнішим, ніж робота зі звичайними файлами. У різних системах передбачено різні способи виконання необхідних адміністративних завдань, зокрема створення баз даних, призначення прав доступ для користувачів або створення резервних копій. Опис цих способів не належить до предмету цього підручника, але ви можете знайти відповіді на свої питання у документації програми для роботи з базами даних: простий пошук у інтернеті надасть вам змогу отримати адреси для отримання підручників з відповідного питання. </para>

<sect3
><title
>Створення бази даних</title>
<para
>До &kmymoney; включено код SQL для створення початкової бази даних для зберігання ваших даних, якщо такої бази даних ще не існує. Але автори програми наполегливо рекомендують вам попередньо створити цю базу даних, оскільки  у більшості програм для роботи з базами даних передбачено багато параметрів, які можуть вплинути на характеристики створеної бази даних. Одним з таких важливих параметрів є визначення кодування символів (наприклад UTF-8), яке слід використовувати у полях, що міститиме текстові дані. </para>

<para
>Крім того, вам слід вказати права доступу до виконання певних дій різними користувачами бази даних. Здебільшого, користувачеві, який створив базу даних буде автоматично надано всі можливі дозволи, але вам все ж варто звернутися до документації, щоб у цьому переконатися. </para>

<para
>Під час першого доступу до бази даних і, можливо, наступних доступів, коли ви змінюватимете компонування бази даних, вам потрібні будуть права доступу (які ще називають привілеями) для створення і зміни таблиць і переглядів (див. наступний розділ). Назви полів прав доступу/привілеїв у різних системах можуть бути різними, але здебільшого цими назвами будуть CREATE і ALTER. Для нормальної роботи вам потрібно мати права доступу на читання і запис; ці дозволи, зазвичай, визначаються ключовими словами SQL SELECT, INSERT, UPDATE і DELETE. </para>
</sect3>

<sect3
><title
>Створення таблиць</title>
<para
>Під час першого доступу до бази даних &kmymoney; спробує створити потрібну програмі структуру бази даних. Щоб досягти максимальної сумісності між базами даних різних типів, програма використовуватиме лише певну підмножину типових типів даних. Але можливі випадки, коли окремі типи не підтримуватимуться. У такому разі слід якось забезпечити створення коду SQL потрібного для створення таблиць. Цей код згодом може бути змінено бажаним чином і використано для створення баз даних поза межами &kmymoney;. Якщо ви опинитеся у подібній ситуації, зазвичай, довідку з потрібних вам команд можна отримати у одному з каналів зі списку у розділі щодо <link linkend="firsttime.contact"
>отримання довідки</link
>. Щоб дізнатися про це більше, зверніться до розділу <link linkend="details.database.generatesql"
>Створення бази даних вручну</link
>. </para>
</sect3>
</sect2>

<sect2 id="details.database.selectdatabase"
><title
>Створення бази даних</title>
<para
>За допомогою &kmymoney; відкрийте або імпортуйте наявний файл з даними або створіть новий файл. Після цього скористайтеся пунктом <guimenuitem
>Зберегти як базу даних</guimenuitem
> з меню <guimenu
>Файл</guimenu
>. Виберіть пункт <guilabel
>SQL</guilabel
> у спадному списку <guilabel
>Тип сховища для ваших даних</guilabel
> і натисніть кнопку <guibutton
>Гаразд</guibutton
>. Після цього програма відкриє таке діалогове вікно: </para>

<screenshot>
  <screeninfo
>Створення бази даних</screeninfo>
  <mediaobject>
    <imageobject>
      <imagedata fileref="select_database.png" format="PNG"/>
    </imageobject>
    <textobject>
      <phrase
>Створення бази даних</phrase>
    </textobject>
  </mediaobject>
</screenshot>

<para
>Заповніть поля, що відповідають вказаному типу бази даних (як і всюди, обов’язкові до заповнення поля буде підсвічено), а потім натисніть кнопку <guibutton
>Гаразд</guibutton
>, щоб наказати програмі створити базу даних. </para>

<sect3
><title
>Тип бази даних</title>
<para
>У цьому спадному списку буде показано усі драйвери SQL &Qt;, встановлених у вашій системі. Оберіть драйвер для вашого типу бази даних. Якщо потрібного вам драйвера немає у списку, вам доведеться встановити його. Ознайомтеся з документацією з вашого дистрибутива або відкрийте сторінку <ulink url="https://www.qt.io/"
>вебсайта &Qt;</ulink
> і виконайте пошук за ключовими словами «SQL drivers». </para>
</sect3>

<sect3 id="details.database.sqlcipher"
><title
>Файл (лише SQLite/SQLCipher)</title>
<para
>У SQLCipher кожна база даних зберігається у окремому файлі, отже вам слід зазначити назву файла, у якому ви бажаєте створити базу даних. Щоб вказати розташування файла у файловій системі, натисніть кнопку з піктограмою, розташовану праворуч від поля назви файла. Для баз даних SQLCipher вміст полів <guilabel
>Назва бази даних</guilabel
>, <guilabel
>Назва вузла</guilabel
>, <guilabel
>Користувач</guilabel
> не має значення. Файл SQLCipher повинен мати належні права доступу на читання або запис у файловій системі, щоб поточний користувач програми зміг отримувати до нього доступ. </para>

<para
>Розробниками <ulink url="https://www.zetetic.net/sqlcipher"
>SQLCipher</ulink
> у листопаді 2018 року випущено версію 4.0. Проте багато користувачів &kmymoney;, особливо тих, хто не дуже часто оновлює програми або використовує дистрибутив LTS (довгострокову підтримку) &Linux;, може все ще використовувати базу даних, створену за допомогою версії 3 SQLCipher. У якийсь момент, зазвичай після оновлення &kmymoney; або їхнього дистрибутива, вони виявлять, що не можуть відкрити свою базу даних із повідомленням про помилку, яке не є особливо інформативним чи корисним. У цьому випадку потрібно оновити саму базу даних з версії 3 до версії 4. Настанови щодо цього можна знайти на <ulink url="https://discuss.zetetic.net/t/upgrading-to-sqlcipher-4/3283"
>вебсайті SQLCipher</ulink
>. </para>
</sect3>

<sect3>
<title
>Назва бази даних (інші)</title>
<para
>Типовою назвою бази даних буде <literal
>KMyMoney</literal
>, але ви можете обрати будь-яку іншу назву. Програму &kmymoney; може бути не пристосовано до створення певних типів баз даних, отже вам доведеться створити такі бази даних за допомогою сторонніх інструментів адміністрування баз даних. Але програма &kmymoney;, зазвичай, здатна створити всю потрібну структуру відповідної бази даних. Якщо можливості програми не задовольняють ваші потреби, ви можете створити базу даних власноруч. Докладніше про це можна дізнатися з розділу <link linkend="details.database.generatesql"
>Створення бази даних вручну</link
>. </para>
</sect3>

<sect3
><title
>Назва вузла</title>
<para
>Для типового користувача типовою назвою вузла буде «localhost», отже цю назву не потрібно змінювати. Якщо ж ви маєте справу з базами даних у мережі, введіть назву вузла сервера бази даних. </para>
</sect3>

<sect3
><title
>Ім’я користувача і пароль</title>
<para
>Щоб визначити правильні значення у цих полях, перегляньте права доступу до вашої бази даних або зверніться до адміністратора бази даних. Вказаний вами користувач повинен мати права доступу для пошуку, вилучення, вставлення та оновлення записів бази даних. Якщо ім’я користувача збігається з іменем користувача системи, вказувати пароль зазвичай не потрібно. </para>
</sect3>
</sect2>

<sect2
><title
>Доступ до ваших даних</title>

<sect3
><title
>Компонування таблиці</title>
<para
>Щоб отримати доступ до даних у &kmymoney;, скористайтеся пунктом <guimenuitem
>Відкрити базу даних</guimenuitem
> у меню <guimenu
>Файл</guimenu
>. Програма відкриє діалогове вікно, подібне до показано вище. </para>

<note>
  <para
>Якщо вами було створено базу даних відкриттям файла з наступним використанням дії <guimenu
>Файл</guimenu
> <guimenuitem
>Зберегти</guimenuitem
> і вибором пункту <guilabel
>SQL</guilabel
> , як це описано вище, будь-які наступні зміни, внесені до ваших даних, зберігатимуться лише у базі даних, а не у файлі. Це означає, що ви можете використовувати файл як резервну копію або знімок даних у певний момент часу. Щоб створити нову резервну копію у файлі, відкрийте базу даних і скористайтеся пунктом <menuchoice
><guimenu
>Файл</guimenu
><guimenuitem
>Зберегти як...</guimenuitem
></menuchoice
>, виберіть <guilabel
>XML</guilabel
> як тип сховища даних і надайте файлу відповідної назви. Не забудьте потім повторно відкрити вашу базу даних, щоб &kmymoney; не зберігала зміни у файлі. </para>
</note>

<para
>Для отримання доступу до ваших даних у різних форматах вам слід ознайомитися зі способами зберігання даних у реляційних базах даних. Набагато простіше відкрити вашу базу даних у графічній оболонці, зокрема OpenOffice.org. Ви побачите список різноманітних таблиць, з яких складається база даних і зможете переглянути компонування всіх цих таблиць. </para>

<para
>Щоб видобути дані, наприклад до електронної таблиці чи зовнішнього файла, майже завжди потрібно виконати збирання пов’язаних даних з декількох таблиць. Програма робить це шляхом «з’єднання» таблиць на основі спільного для них поля. Докладніше дізнатися про алгоритми роботи баз даних ви можете з підручників, про які ми згадували раніше. У наведеній нижче таблиці вказано поля, які використовуються для встановлення подібних міжтабличних взаємозв’язків. </para>

<informaltable pgwide="1">
  <tgroup cols="3">
    <thead>
      <row>
        <entry valign="top">
          <para
>Взаємозв’язок</para>
        </entry>
        <entry valign="top">
          <para
>Відповідність</para>
        </entry>
        <entry valign="top">
          <para
>З</para>
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry valign="top">
          <para
>Установи і рахунки</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmInstitutions.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.institutionId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Батьківські/Дочірні рахунки</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.parentId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Операції і дроблення (див. Зауваження 1)</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.transactionId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Рахунки і дроблення</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.accountId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Отримувачі і дроблення</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPayees.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.payeeId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Розклади і операції</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSchedules.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.id</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Операції і валюти</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.currencyId</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmCurrencies.ISOCode</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
><literal
>Рахунки і цінні папери (див. Зауваження 2)</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.currencyId</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSecurities.id</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Цінні папери і ціни</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSecurities.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPrices.fromId</literal
> або <literal
>kmmPrices.toId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Курси валют</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmCurrencies.ISOCode</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPrices.fromId</literal
> або <literal
>kmmPrices.toId</literal
></para>
        </entry>
      </row>
    </tbody>
  </tgroup>
</informaltable>

<para
>Нотатки: </para>

<!-- For ndash and right and left double quotes I switched from Unicode &#x2013,
     &#x201C, and &#x201D. to direct names, but couldn't find one for left double
     quote.  JHO -->
<para
>1 &ndash; txType = "N&rdquor; для звичайних операцій, "S&rdquor; для запланованих операцій </para>

<para
>2 &ndash; if kmmAccounts.isStockAccount = "Y&rdquor; </para>
</sect3>

<sect3
><title
>Формати полів</title>
<para
>Вміст деяких з полів даних зберігається у внутрішньому форматі, яким, можливо, не зможуть скористатися зовнішні програми. Якщо у таблиці є такі поля, їх вміст буде дубльовано у зовнішньому форматі. </para>

<para
>Грошові суми та вартості акцій буде показано у форматах чисельник/знаменник і, у полі з суфіксом назви <literal
>Formatted</literal
>, у формі, у якій їх буде типово показано. </para>

<para
>Так само, деякі з полів, зокрема поле типу рахунку буде збережено у формі числового коду і, у полі з суфіксом назви <literal
>String</literal
>, у формі і форматі мови програми. </para>
</sect3>

<sect3
><title
>Оновлення ваших даних</title>
<para
>Зберігання даних у загальновизнаному стандартному форматі не надає вам змоги змінювати дані поза межами програми &kmymoney;. НЕ РОБІТЬ ЦЬОГО, якщо вам не відомі наслідки ваших дій, завжди спочатку створюйте резервні копії даних. Якщо ви зробите щось не так, &kmymoney; може втратити можливість доступу до ваших даних, ви навіть можете просто їх втратити. Ми вас попереджали! </para>
</sect3>

<sect3
><title
>Збережені запити</title>
<para
>У більшості систем роботи з базами даних передбачено можливість зберігання типових запитів і процедур, а у деяких випадках їх можна зберігати як таблиці або інші об’єкти у самій базі даних. Як ви вже певно зрозуміли, назви всіх таблиць, які використовуються у &kmymoney;, починаються з літер у нижньому регістрі <literal
>kmm</literal
>. Цей стандарт підтримуватиметься і надалі: оновлюватимуться лише таблиці, назви яких починатимуться з цих літер. Отже, якщо ви уникатимете використання цих літер у назвах ваших запитів і процедур, у вас не повинно виникнути ніяких проблем. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql"
><title
>Створення бази даних вручну</title>
<note>
  <para
>У цьому розділі описано способи керування базами даних для досвідчених користувачів, його може бути пропущено звичайними користувачами програми. </para>
</note>

<sect3
><title
>Умови використання</title>
<para
>Іноді програма &kmymoney; не здатна створити базу даних у автоматичному режимі або створює базу даних, яка за певними параметрами не задовольняє потреби користувача. Наприклад, система бази даних може не повністю відповідати стандартному використанню SQL або користувачеві потрібна підтримка новітніх систем, які ще не достатньо перевірено на надійність користування у &kmymoney;. </para>

<para
>Перш ніж користуватися описаними способами, вам слід спробувати створити базу даних власноруч (тобто за допомогою інструкції <literal
>CREATE DATABASE</literal
>). Після створення бази даних &kmymoney; зможе створювати у ній, наприклад, таблиці під час звичайного процесу збереження бази даних, описаного вище. </para>
</sect3>

<sect3
><title
>Створення SQL</title>
<para
>Якщо описаний вище спосіб не спрацює, основні потрібні вам для створення різноманітних таблиць, областей перегляду та покажчиків команди SQL можна створити окремо. Скористайтеся пунктом <guimenuitem
>Створити базу даних SQL</guimenuitem
> з меню <guimenu
>Інструменти</guimenu
>. Програма відкриє таке діалогове вікно: </para>

<screenshot>
  <screeninfo
>Породження sql для створення бази даних</screeninfo>
  <mediaobject>
    <imageobject>
      <imagedata fileref="generate_sql.png" format="PNG"/>
    </imageobject>
    <textobject>
      <phrase
>Породження sql для створення бази даних</phrase>
    </textobject>
  </mediaobject>
</screenshot>

<para
>Після вибору типу бази даних відповідний запис SQL з’явиться у полі <guilabel
>Команди SQL для створення</guilabel
>; користувач зможе змінити значення у цьому полі або зберегти дані до текстового файла за допомогою натискання кнопки <guibutton
>Зберегти SQL</guibutton
>. У останньому випадку, базу даних доведеться створити за допомогою інструментів адміністрування, передбачених у самій системі керування базами даних. </para>

<para
>Якщо після коригування тексту у діалоговому вікні ви бажаєте, щоб програма &kmymoney; створила базу даних, вам слід заповнити інші поля діалогового вікна, як це раніше було докладно описано у розділі <link linkend="details.database.selectdatabase"
>Створення бази даних</link
> і натиснути кнопку <guibutton
>Створити таблиці</guibutton
>. Зауважте, що окрім випадку з SQLite, вам слід або включити відповідну інструкцію <literal
>CREATE DATABASE</literal
> як першу команду або спочатку виконати цю інструкцію поза межами &kmymoney; </para>
</sect3>

<sect3
><title
>Попередження</title>
<para
>Вам слід бути дуже обережними з редагуванням визначень будь-якої з базових таблиць або областей перегляду (чиї назви починаються з <literal
>kmm</literal
>). Деякі зі змін, зокрема збільшення довжини поля цілих чисел, мають незначний вплив на роботу бази, але вам не слід вилучати поля або змінювати послідовність полів, щоб не зашкодити нормальній роботі &kmymoney; та убезпечити ваші дані від пошкодження. </para>

<para
>Хоча додавання або вилучення покажчиків може збільшити швидкодію програми, вам слід пам’ятати, що такі дії можуть призвести і до зовсім протилежних наслідків. Щоб досягти найкращої швидкодії, вам знадобляться певні знання зі структури роботи &kmymoney;. </para>
</sect3>
</sect2>

<sect2
><title
>Шифрування</title>
<para
>У поточній версії шифрування вашої бази даних не підтримується. </para>
</sect2>
</sect1>
</chapter>
