4.4

この項では、接続とソース・スキーマに関するいくつかの仮定に基づいた、接続が作成されていることを前提とした例を示します。

4.4.1 単一スキーマ

この例は、単一の開発スキーマと単一の本番スキーマからなります。作成後、本番スキーマには、開発スキーマからのオブジェクトとLiquibase変更ログ・オブジェクトが含まれています。

概要

  1. SQLclデータベース・プロジェクトを作成します。
  2. データベース・プロジェクト内のgitリポジトリを初期化し、初期ファイルをメイン・ブランチにコミットします。
  3. base-releaseという新しいブランチを作成し、project exportを実行して接続hr-devからオブジェクトをエクスポートし、それらのファイルをそのブランチにコミットします。
  4. project stageを実行してブランチbase-releasemainブランチと比較し、ベース・リリースのインストールのための変更ログを生成します。
  5. project releaseを実行してその開発コードを1.0というバージョニングされたリリースに移行します。
  6. project gen-artifactを実行して<projectname>-<version>.zipというリリースのデプロイ可能zipファイルを作成します。
  7. 本番スキーマに接続し、project deployコマンドを使用してその成果物をデプロイします。

接続定義

hr-dev: 開発スキーマとして使用する接続です。

hr-prod: 本番スキーマとして使用する接続です。

開発の接続およびオブジェクト

開発スキーマで、HR sample schemaのオブジェクトをインストールします。これらのオブジェクトは、Githubで入手できます。oracle-samples/db-samples-schemasリポジトリをクローンします。

この例では、hrユーザーは、パスワードoracleを使用して設定されています。

$> git clone git@github.com:oracle-samples/db-sample-schemas.git
$> cd db-sample-schemas/human_resources
$> sql <SYSTEM_USER>/<SYSTEMPASSWORD>@<DATABASE_URL>

SQL> @hr_install
Thank you for installing the Oracle Human Resources Sample Schema.
This installation script will automatically exit your database session
at the end of the installation or if any error is encountered.
The entire installation will be logged into the 'hr_install.log' log file.
 
Enter a password for the user HR: ******
Enter a tablespace for HR [USERS]:
Do you want to overwrite the schema, if it already exists? [YES|no]: YES
Old HR schema has been dropped.
******  Creating REGIONS table ....
******  Creating COUNTRIES table ....
******  Creating LOCATIONS table ....
******  Creating DEPARTMENTS table .....
******  Creating JOBS table ....
******  Creating EMPLOYEES table ....
******  Creating JOB_HISTORY table ....
******  Creating EMP_DETAILS_VIEW view ...
******  Creating indexes ...
******  Adding table column comments ...

****** Populating REGIONS table ....
****** Populating COUNTRIES table ....
****** Populating LOCATIONS table ....
****** Populating DEPARTMENTS table ....
****** Populating JOBS table ....
****** Populating EMPLOYEES table ....
****** Populating JOB_HISTORY table ....
  
Installationverification   
___________________________
Verification:              
 
Table             provided    actual
______________ ___________ _________
regions                  5         5
countries               25        25
departments             27        27
locations               23        23
employees              107       107
jobs                    19        19
job_history             10        10
 

VSCode用またはOracle SQLcl用のOracle SQL Developer拡張機能で接続を作成します。

SQL> connect -save hr-dev -savepwd hr/oracle@localhost/freepdb1
Name: hr-dev
Connect String: localhost/freepdb1
User: hr
Password: ******
Connected.
SQL> connect -name hr-dev
Connected.

login.sqlファイルを使用して、ログイン・エクスペリエンスをカスタマイズします。ユーザー、データベース、プロジェクト、gitステータスおよび現在の作業ディレクトリを設定します。

–-login.sql
set sqlformat ansiconsole
set sqlprompt "@|red _USER|@@@|green _O_RELEASE|@@|blue   🚥  >|@"
set statusbar default editmode linecol git project cwd
set statusbar on

ステップ

  1. SQLclデータベース・プロジェクトを作成します。

    プロジェクトを作成するディレクトリを選択し、project initコマンドを実行します。

    SQL> project init -name demo -schemas hr -makeroot
    ------------------------
    PROJECT DETAILS
    ------------------------
    Project name:    demo
    Schema(s):       HR
    Directory:       /Users/abc/sandbox/projects/demo
    Connection name: hr-dev
    Config Only:     false
    Project root     demo
    Your project has been successfully created.

    このコマンドではプロジェクトが作成され、makerootオプションによりプロジェクト・フォルダが作成されます。

  2. Gitリポジトリを初期化します。

    プロジェクト・ディレクトリで、Gitリポジトリを初期化し、初期ファイルをメイン・ブランチにコミットします。メイン・ブランチはmainと呼ばれます。コミット時には、リリースに関して機能、バグおよびその他修正などのタイプを識別するために役立つように、コミット・メッセージにConventional Commits標準を使用することが重要です。このコード・ブロックでは、ホスト・コマンド(Gitコマンドの前の!文字によって示されている)を使用して、SQLclで実行されているGitを示しています。この文字により、ユーザーが、ホスト・シェルで使用可能な任意のコマンドを実行できるようになります。

    SQL>cd demo
    SQL>pwd
    /Users/abc/sandbox/projects/demo
    SQL> !git init --initial-branch=main
    Initialized empty Git repository in /Users/abc/sandbox/projects/demo/.git/
    SQL> !git add .
    SQL> !git commit -m "chore: initializing repository with default project files"   
    [main (root-commit) 6cc2434] chore: initializing repository with default project files
     8 files changed, 145 insertions(+)
     create mode 100644 .dbtools/filters/project.filters
     create mode 100644 .dbtools/project.config.json
     create mode 100644 .dbtools/project.sqlformat.xml
     create mode 100644 .gitignore
     create mode 100644 dist/README.md
     create mode 100644 dist/install.sql
     create mode 100644 src/README.md
     create mode 100644 src/database/README.md
    demoフォルダには、次のような、いくつかのフォルダとファイルがあります:
    • .dbtools: プロジェクトの構成ファイルが含まれています。
    • src: スキーマからエクスポートされたソース・ファイルが含まれます。
    • dist: 生成されたインストール・ファイルおよびリリースが含まれます。
    • artifact: リリース用に生成されたzipファイルが含まれます。
  3. base-releaseブランチを作成し、エクスポートされたファイルをコミットします。

    Gitにbase-releaseというブランチを作成し、それをチェックアウトします。project exportを実行してhr-dev接続からオブジェクトをエクスポートします。

    SQL> !git checkout -b base-release
    Switched to a new branch 'base-release'
    SQL> project export
    The current connection localhost/freepdb1 HR will be used for all operations.
    *** INDEXES ***
    *** PROCEDURES ***
    *** SEQUENCES ***
    *** TABLES ***
    *** TRIGGERS ***
    *** VIEWS ***
    *** COMMENTS ***
    *** REF_CONSTRAINTS ***
    --------------------------------
    TABLE                          6
    PROCEDURE                      2
    REF_CONSTRAINT                10
    CREATE_USER                    1
    TRIGGER                        2
    SEQUENCE                       3
    INDEX                         11
    VIEW                           1
    COMMENT                        7
    --------------------------------
    Exported 43 objects.
    Elapsed  13 sec.
    SQL>!git status
    On branch base-release
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        src/database/hr/
    SQL>!git add src
    SQL>!git status
    On branch base-release
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
        new file:   src/database/hr/comments/countries.sql
    ...
        new file:   src/database/hr/comments/regions.sql
        new file:   src/database/hr/create_users/create_user.sql
        new file:   src/database/hr/indexes/dept_location_ix.sql
    ...
        new file:   src/database/hr/indexes/loc_state_province_ix.sql
        new file:   src/database/hr/procedures/add_job_history.sql
        new file:   src/database/hr/procedures/secure_dml.sql
        new file:   src/database/hr/ref_constraints/countr_reg_fk.sql
    ...
        new file:   src/database/hr/ref_constraints/loc_c_id_fk.sql
        new file:   src/database/hr/sequences/departments_seq.sql
        new file:   src/database/hr/sequences/employees_seq.sql
        new file:   src/database/hr/sequences/locations_seq.sql
        new file:   src/database/hr/tables/countries.sql
    ...
        new file:   src/database/hr/tables/regions.sql
        new file:   src/database/hr/triggers/secure_employees.sql
        new file:   src/database/hr/triggers/update_job_history.sql
        new file:   src/database/hr/views/emp_details_view.sql
     
    !git commit -m "chore: base export of hr schema"
    [base-release b481c41] chore: base export of hr schema
     44 files changed, 609 insertions(+)
     create mode 100644 src/database/hr/comments/countries.sql
     ...
     create mode 100644 src/database/hr/comments/regions.sql
     create mode 100644 src/database/hr/create_users/create_user.sql
     create mode 100644 src/database/hr/indexes/dept_location_ix.sql
     ...
     create mode 100644 src/database/hr/indexes/loc_state_province_ix.sql
     create mode 100644 src/database/hr/procedures/add_job_history.sql
     create mode 100644 src/database/hr/procedures/secure_dml.sql
     create mode 100644 src/database/hr/ref_constraints/countr_reg_fk.sql
     ...
     create mode 100644 src/database/hr/ref_constraints/loc_c_id_fk.sql
     create mode 100644 src/database/hr/sequences/departments_seq.sql
     ...
     create mode 100644 src/database/hr/sequences/locations_seq.sql
     create mode 100644 src/database/hr/tables/countries.sql
     ...
     create mode 100644 src/database/hr/tables/regions.sql
     create mode 100644 src/database/hr/triggers/secure_employees.sql
     create mode 100644 src/database/hr/triggers/update_job_history.sql
     create mode 100644 src/database/hr/views/emp_details_view.sql
  4. project stageを使用してベース・リリースのインストールのための変更ログを作成します。

    project stageコマンドを実行してbase-releaseブランチをメイン・ブランチと比較し、ベース・リリースのインストールのための変更ログを生成します。

    SQL> project stage
    Stage successfully created, please review and commit your changes to repository.
    SQL> !git status
    On branch base-release
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        dist/releases/
    SQL> !find dist/releases/next
    dist/releases/next
    dist/releases/next/changes
    dist/releases/next/changes/base-release
    dist/releases/next/changes/base-release/code
    dist/releases/next/changes/base-release/code/_custom
    dist/releases/next/changes/base-release/stage.changelog.xml
    dist/releases/next/changes/base-release/hr
    dist/releases/next/changes/base-release/hr/ref_constraint
    dist/releases/next/changes/base-release/hr/ref_constraint/dept_loc_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/emp_job_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/jhist_job_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/jhist_dept_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/loc_c_id_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/countr_reg_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/emp_dept_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/jhist_emp_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/dept_mgr_fk.sql
    dist/releases/next/changes/base-release/hr/ref_constraint/emp_manager_fk.sql
    dist/releases/next/changes/base-release/hr/table
    dist/releases/next/changes/base-release/hr/table/jobs.sql
    dist/releases/next/changes/base-release/hr/table/departments.sql
    dist/releases/next/changes/base-release/hr/table/regions.sql
    dist/releases/next/changes/base-release/hr/table/countries.sql
    dist/releases/next/changes/base-release/hr/table/employees.sql
    dist/releases/next/changes/base-release/hr/table/job_history.sql
    dist/releases/next/changes/base-release/hr/table/locations.sql
    dist/releases/next/changes/base-release/hr/index
    dist/releases/next/changes/base-release/hr/index/emp_name_ix.sql
    dist/releases/next/changes/base-release/hr/index/jhist_department_ix.sql
    dist/releases/next/changes/base-release/hr/index/emp_manager_ix.sql
    dist/releases/next/changes/base-release/hr/index/emp_department_ix.sql
    dist/releases/next/changes/base-release/hr/index/loc_country_ix.sql
    dist/releases/next/changes/base-release/hr/index/jhist_employee_ix.sql
    dist/releases/next/changes/base-release/hr/index/jhist_job_ix.sql
    dist/releases/next/changes/base-release/hr/index/loc_city_ix.sql
    dist/releases/next/changes/base-release/hr/index/dept_location_ix.sql
    dist/releases/next/changes/base-release/hr/index/emp_job_ix.sql
    dist/releases/next/changes/base-release/hr/index/loc_state_province_ix.sql
    dist/releases/next/changes/base-release/hr/sequence
    dist/releases/next/changes/base-release/hr/sequence/departments_seq.sql
    dist/releases/next/changes/base-release/hr/sequence/locations_seq.sql
    dist/releases/next/changes/base-release/hr/sequence/employees_seq.sql
    dist/releases/next/release.changelog.xml
    dist/releases/next/code
    dist/releases/next/code/code.changelog.xml
    dist/releases/next/code/hr
    dist/releases/next/code/hr/trigger
    dist/releases/next/code/hr/trigger/update_job_history.sql
    dist/releases/next/code/hr/trigger/secure_employees.sql
    dist/releases/next/code/hr/comment
    dist/releases/next/code/hr/comment/jobs.sql
    dist/releases/next/code/hr/comment/departments.sql
    dist/releases/next/code/hr/comment/regions.sql
    dist/releases/next/code/hr/comment/countries.sql
    dist/releases/next/code/hr/comment/employees.sql
    dist/releases/next/code/hr/comment/job_history.sql
    dist/releases/next/code/hr/comment/locations.sql
    dist/releases/next/code/hr/procedure
    dist/releases/next/code/hr/procedure/secure_dml.sql
    dist/releases/next/code/hr/procedure/add_job_history.sql
    dist/releases/next/code/hr/view
    dist/releases/next/code/hr/view/emp_details_view.sql
  5. project releaseを実行してそのリリースを完成させます。

    project releaseコマンドを実行してその開発コードを1.0というバージョニングされたリリースに移行します。

    SQL> project release -version 1.0 -verbose
    Creating a release version 1.0 for the current body of work
     
    Updated change:dist/releases/main.changelog.xml
    Moved folder "dist/releases/next" to "dist/releases/1.0"
    Created file:  dist/releases/next
    Created change:dist/releases/next/release.changelog.xml
    Created change:dist/releases/next/release.changelog.xml
    Process completed successfully

    これにより、nextフォルダ内のすべての変更内容が、releasesの下の1.0フォルダに移動されます。

    –-Cropped Tree Structure
    SQL> !tree
    .
    ├── demo
    │   ├── README.md
    │   ├── dist
    │   │   ├── install.sql
    │   │   └── releases
    │   │       ├── 1.0
    │   │       │   ├── code
    │   │       │   ├── release.changelog.xml
    │   │       │   └── changes
    │   │       │       └── base-release
    │   │       │           ├── code
    │   │       │                  ...
    │   │       │           ├── hr
    │   │       │                  ...
    │   │       │           └── stage.changelog.xml
    │   │       ├── main.changelog.xml
    │   │       ├── next
    │   │       │   └── release.changelog.xml
    │   │       └── util
    │   │           ├── prechecks.sql
    │   │           └── recompile.sql
    │   └── src
    │       ├── README.md
    │       └── database
    │           ├── README.md
    │           └── hr
    │                 ...
  6. project deployを実行してその成果物をデータベースにインストールします。

    本番スキーマに接続し、project deployコマンドを使用してその成果物をデプロイします。

    connect -name production-connection
    SQL> project deploy -file artifact/demo-1.0.zip -verbose
    Check database connection...
    Extract the file name: demo-1.0
    Artifact decompression in progress...
    Artifact decompressed: /var/folders/35/v7k4b96d1d9b61mm93bgjjnr0000gn/T/e6b3d0f0-92d5-4fde-b82c-37ea9ec419c58326209255710673404
    Starting the installation...
  7. インストールされたスキーマを調べて、インストールされたオブジェクトを確認します。
    SQL> connect hr/<password>
    Connected.
    SQL> tables
     
    TABLES                     
    ___________________________
    COUNTRIES
    DATABASECHANGELOG_ACTIONS
    DATABASECHANGELOG
    DATABASECHANGELOGLOCK
    DEPARTMENTS
    DOC
    EMPLOYEES
    JOB_HISTORY
    JOBS
    LOCATIONS
    REGIONS
    

    移行された表が、Liquibaseの管理表とともにリストされます。

4.4.2 管理者がHRを本番スキーマにエクスポート

この例では、デプロイ(ステップ7)が管理者として実行される点を除き、ステップは「単一スキーマ」と同じです。作成されるすべてのオブジェクトには、先頭にスキーマ名を付ける必要があります。これは、次の構成項目を設定することで、エクスポート時に追加できます:

project config set -name export.setTransform.emitSchema -value true -type BOOLEAN

project deployコマンドを実行します。

SQL> connect adminuser/oracle@database
SQL> drop user hr cascade;
SQL> grant connect,resource, dba to hr identified by oracle;
SQL> project deploy -file artifact/demo-1.0.zip -verbose
Check database connection...
Extract the file name: demo-1.0
Artifact decompression in progress...
Artifact decompressed: /var/folders/35/v7k4b96d1d9b61mm93bgjjnr0000gn/T/e6b3d0f0-92d5-4fde-b82c-37ea9ec419c58326209255710673404
Starting the installation...

インストール後の、オブジェクトの主な違いは、Liquibase表が存在する場所です。

SQL> show user
USER is "ABC"
SQL> tables
 
TABLES                      
____________________________
DATABASECHANGELOG_ACTIONS   
DATABASECHANGELOG           
DATABASECHANGELOGLOCK       
 
SQL> connect hr/oracle
Connected.
SQL> tables
 
TABLES                     
___________________________
COUNTRIES                  
DEPARTMENTS                
DOC                        
EMPLOYEES                  
JOB_HISTORY                
JOBS                       
LOCATIONS                  
REGIONS