[Oracle Cloud] Autonomous DatabaseからGithub操作してみた(2022/04/23)

# はじめに
Autonomous DatabaseのDBMS_CLOUD_REPOパッケージを使用して、Githubに接続し、リポジトリの作成、表定義DDL文をリポジトリのファイルとして出力、さらにリポジトリ上のスクリプトファイルを直接Autonomous Databaseで実行してみた。

# 作業ステップ

1. リポジトリ(Github)のアクセストークンを生成
1. Autonomous Databaseでクレデンシャルの生成
1. 表定義をエクスポート
1. コードリポジトリのスクリプトをAutonomous Databaseで実行

# リポジトリ(Github)のアクセストークンを生成
Githubにログインしアクセストークンを生成
[https://github.com/settings/tokens](https://github.com/settings/tokens) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/ad2f6455-deae-cec6-148a-baa204e380fb.png)

生成されたトークンをコピー



# Autonomous Databaseでクレデンシャルの生成
「データベース・アクション」などでAutonomous Databaseに接続し、クレデンシャルを作成

```
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL (
    'GITHUB_CRED',
    '<GitHub Email Address>',
    '<GitHub Personal Access Token>');
END;
/

PL/SQL procedure successfully completed.
```



# 表定義をエクスポート

事前準備として表定義出力対象となる表の作成

```
CREATE TABLE persons(
    person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
    first_name VARCHAR2(50) NOT NULL,
    last_name VARCHAR2(50) NOT NULL
);

Table PERSONS created.
```

## DBMS_CLOUD_REPO パッケージを使用して、新しい Git Repo を作成、表定義DDLをファイルに出力
必要なRepoハンドルの JSON オブジェクトを初期化し、それを使って “BlogRepo” という名前の新しいリポジトリを作成し、 “Persons”表のメタデータをエクスポート

```
DECLARE
     repoHandle clob;
     repoName   clob := 'BlogRepo';
BEGIN
    repoHandle := DBMS_CLOUD_REPO.INIT_GITHUB_REPO(
                    credential_name => 'GITHUB_CRED',
                    repo_name       => repoName,
                    owner           => '<GitHub Repo Owner>'
            );
    DBMS_OUTPUT.PUT_LINE(repoHandle);
    DBMS_CLOUD_REPO.CREATE_REPOSITORY(
         repo        => repoHandle,
         description => 'Blog example repo',
         private => TRUE
    );
    DBMS_CLOUD_REPO.EXPORT_OBJECT(
         repo => repoHandle,
         object_type => 'TABLE', --Object types supported by DBMS_METADATA
         object_name => 'persons',
         file_path   => 'BlogScript.sql'
    );
END;
/

PL/SQL procedure successfully completed.
Elapsed: 00:00:10.623
```

## Github でリポジトリ、ファイルが作成されていることの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/cfc3d762-1556-29e4-9d04-f0899f586dfb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/11fba526-34c3-7537-cd3d-f58ba5fbbe04.png)



# コードリポジトリのスクリプトをAutonomous Databaseで実行

事前準備として作成対象の表を削除

```
DROP TABLE persons purge;

Table PERSONS dropped.
```

## DBMS_CLOUD_REPOの "INSTALL_FILE" プロシージャを実行
DBMS_CLOUD_REPOパッケージの "INSTALL_FILE" プロシージャを実行して、リポジトリから任意のスクリプト（ここでは先ほど作成した BlogScript.sql を使用）を取得し、Autonomous Database上で実行

```
DECLARE
     repoHandle clob;
     repoName     clob := 'BlogRepo';
BEGIN
    repoHandle := DBMS_CLOUD_REPO.INIT_GITHUB_REPO(
                    credential_name => 'GITHUB_CRED',
                    repo_name       => 'BlogRepo',
                    owner           => '<GitHub Repo Owner>'
            );
    DBMS_OUTPUT.PUT_LINE(repoHandle);
    DBMS_CLOUD_REPO.INSTALL_FILE(
        repo => repoHandle,
        file_path     => 'BlogScript.sql',
        stop_on_error => FALSE
  );
END;
/

PL/SQL procedure successfully completed.


desc persons

Name       Null?    Type         
---------- -------- ------------ 
PERSON_ID  NOT NULL NUMBER       
FIRST_NAME NOT NULL VARCHAR2(50) 
LAST_NAME  NOT NULL VARCHAR2(50) 

```



# おわりに
Autonomous Databaseから直接コードリポジトリを操作できることがわかりました。

## 参考情報

- [Learn to manage cloud code repositories (GitHub, Azure Repos, AWS CodeCommit) with Autonomous Database](https://blogs.oracle.com/datawarehousing/post/cloud-code-repositories-in-autonomous-database)
- [DBMS_CLOUD_REPO Package](https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/dbms-cloud-repo-package.html#GUID-F8F0037B-6451-4742-9144-9FCE44459F64)