OCW2024 Keynote impression

こんにちは!YTです。
9/9-12 に開催された Oracle Cloud World 2024 に参加してきました!

昨年度から日本人の参加者はさらに増え、どうやらアメリカ人に次いで参加人数が2位となったようです!会場でも日本語がたまに聞こえたり聞こえなかったり……。

そんな今年の OCW ですが、目玉となるトピックは2つあったように思います。
いずれもラリーがKeynoteで触れていましたが、「AWSのパートナーシップ締結」と「AIのセキュリティ利用」です。

■AWSとのパートナーシップ締結

一つは、OCW開催直前にプレスリリースされ、大きな話題となった AWS との戦略的パートナシップの締結です。

近年、複数のクラウドが提供するサービスを使い道に合わせて併用/組み合わせるユーザが増えています。これまでも、AWSも Oracle Cloud も両方使うことで、いいとこどりをしたいというような要望が多くありました。しかし2つのクラウドサービスを併用するのは簡単ではなく、実現させても速度上の課題が発生していました。

この問題に対し、Oracle Cloud を構成する様々なハードウェア/ソフトウェアをAWS側のデータセンターにそのまま組み込むことで、様々なメリットをユーザが享受できるようにしたというのが今回発表された「Oracle Database@AWS」になります。

既存のAWSユーザは、使い慣れたAWSのコンソールから OCI の Exadata や Oracle Database を操作できるようになり、同じデータセンター内にある資材を利用できることからレイテンシも極限まで小さくできます。

リリースは 2024年 12月 を予定しており、ヴァージニアのAZからどんどん広げていく予定とのことです。

これにより、Oracle は自前のクラウドサービスだけでなく AWS / Microsoft Azure / Google Cloud という主流クラウドサービスにて自身のクラウドサービスを提供できるようになります。

どのクラウドを利用しているユーザも、OCI と各クラウド固有のサービスを組み合わせた仕組みを構築することができるため、Oracle Cloud技術の利用が加速されていきそうです。

Tips:
前述の通り、Oracle Cloud の強みは「プライベートクラウド」と「AI学習プラットフォーム」となります。
では Oracle Cloud をメインクラウドに選ぶ理由はあるのか?という話になりますが、Oracle Cloud の強みはプライベートクラウドを作れるということにあります。
その顧客だけが使える専用の Oracle Cloud Infrastructure をデータセンターに設置する…ということができるため、強固なセキュリティを実現できます。

また大手クラウドプロバイダーの中で唯一、最大 131,072 個もの NVIDIA GPU を載せた AI学習向けのベアメタルインスタンスを提供しています。 AIサービスが発展していく中で、AI学習に必要な性能はどんどん上昇しており、 その中で業界内でもAI学習に適した高性能インスタンスを提供しているというのは Oracle Cloudの強みの一つになります。

■AIの利活用

もう一つは、セキュリティ強化のために多種多様なAIを活用していくというものです。
ハッカーはヒューマンエラーを利用して攻撃を成功させることが多いため、
様々な局面でヒューマンエラーを防ぐことがセキュリティ強化につながります。

しかし人間が働く以上、ヒューマンエラーは発生します。そこで、AIを活用し、
セキュリティ強化を狙うアプローチをとろうとしています。

Oracleは、以下4つの柱でAIを活用したセキュリティ強化を狙っていくそうです。

  • データセキュリティ
    データベースを完全に自律型のシステムにすることができれば、人為的な設定ミスや
    運用中のミスによる問題/セキュリティ上の脆弱性は発生しえない。脆弱性のパッチも自動で適用されていく。AIを使用して自律システムを構築する。
    No Human Labour = No Human Error。
  • アプリケーションセキュリティ
    コーディング時のロジック不備に起因するアプリの脆弱性を発生させない。
    コーディングをAIに行わせることで、完全なステートレス性を持ったセキュリティ
    脆弱性がないアプリケーションを作らせる。Oracle APEX の 24.1 では、既にAIによるコードジェネレート機能を実装している。
  • ユーザ認証
    複雑なパスワードは、「どこかにメモをさせる」「使いまわしされる」という流出の要因につながる。そのためパスワードではなくAIを用いた生体認証をベースとすることで、不正なアクセスを防ぐ。
  • ネットワークセキュリティ
    ルーティングの設定ミスや見落としに起因して、意図しないネットワークにパケットが流れていく場合がある。
    既存の構成を変更しようとした際にも配慮すべきことが多く、少しの見落としでパブリックネットワーク上に機密情報の含まれたパケットが流れてしまう可能性がある。
    これを Zero trust Packet Routing (ZPR) という自動ルーティング機能で防ぐ。
    ZPR は全てのパケットを監視し、明示的な許可がされていないすべてのパケットを遮断する。この設定の反映にコード生成 AI を使い、英語で指示をするだけで、構成が変更されようとも常に適切な設定が行われるようになる。

AI を使ったセキュリティ利用がどこまで狙い通りにいくのか?はまだ未知数ですが、とても面白い概念だと思いました。
AIもロジックエラーを出すことはあるような気もするので、人間とAIを組み合わせる形で盤石なシステムを迅速に作れるようになるといいなと思っています。

また、私としては想像以上に APEX の利用を推し進めていると感じました。
Oracle APEX はコーソルカナダでも利用しており、利便性の高いシステムだと思っていますが、ここまで力を入れているというのは少し想定外でした。まだまだ研究しがいがありますね。

Keynote以外にも多数のセッションが開催されていましたが、全体を通してみると AI に関連する内容が多かったように思います。

AIが本格的に発展を続けるこの時代、我々インフラエンジニアに求められるのはAIを理解しうまく活用することでお客様のビジネスをよりしっかりとサポートしていくことと感じています。
これからも新しい技術を沢山勉強しつつ、皆様のお役に立てるエンジニアとして努力していきたいですね!

なお、OCW2024 の参加体験記は後日「コーソル人事ブログ」にも掲載いたしますので、そちらもご覧ください!

Oracle 23ai 新機能 – エラーの改善

AIです。(Artificial Intelligence ではありません)

最近は朝晩は冷え込み、秋が少しずつ近づいているのを感じます。雑貨屋さんに行けばハロウィングッズも見かけるようになり…ってちょっと早いような気もしますが笑

さて、今回は 23ai のエラーの変更について見ていきます!

■エラーの出力

Oracle Database 23ai の SQL*Plus から、エラーメッセージが親切になることを皆さまご存知でしょうか。実際に 19c と 23ai で SQL*Plus から ORA-1017 のメッセージを発生させて見比べてみましょう。

$ sqlplus AI/AI ★19c にログイン

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 4 06:45:15 2024
Version 19.7.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

ERROR:
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。


Enter user-name:
$ sqlplus AI/AI ★23ai にログイン

SQL*Plus: Release 23.0.0.0.0 - Production on 火 9月 3 17:46:19 2024
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

ERROR:
ORA-01017: 資格証明が無効であるか、権限がありません。ログオンは拒否されました ヘルプ:
https://docs.oracle.com/error-help/db/ora-01017/★


ユーザー名を入力してください:

はい。23ai では URL が表示されていますね。

この URL を開き、該当のリリースを選択するとそのエラーの原因や取るべきアクションを確認することができます。

エラーの出力内容については、SET ERRORDETAILS で制御可能です。このパラメータを VERBOSE に設定するとエラーの原因、とるべきアクションが表示されるようになります。※デフォルトは ON です。

SET ERRORDETAILS { OFF | ON | VERBOSE }
SQL> conn AI/AI
ERROR:
ORA-01017: 資格証明が無効であるか、権限がありません。ログオンは拒否されました ヘルプ:
https://docs.oracle.com/error-help/db/ora-01017/


警告: Oracleにはもう接続されていません。

SQL> set errordetails VERBOSE
SQL> conn AI/AI
ERROR:
ORA-01017: 資格証明が無効であるか、権限がありません。ログオンは拒否されました ヘルプ:
https://docs.oracle.com/error-help/db/ora-01017/
Cause:  An invalid credential was provided when accessing the Oracle
        Database or you were not authorized to access this database.
Action: Depending on your authentication method, ensure that the correct
        credential is provided when logging in to Oracle Database.
        Retry your credential after checking it. If your credential is
        correct, you may not be authorized to access the database.
        You will need to contact your database administrator or
        identity management administrator to confirm that you are
        authorized to access the database.


警告: Oracleにはもう接続されていません。

■OERR コマンド

詳細なエラーの説明は SQL*Plus の OERR コマンドでいつでも確認することができるようになりました。こちらにも URL が載っていますね。

実際にエラーが発生していない状態でも、原因ととるべきアクションがわかるので調査に便利そう。

SQL> OERR ORA-1017
Message: "invalid credential or not authorized; logon denied"
ヘルプ: https://docs.oracle.com/error-help/db/ora-01017/
Cause:  An invalid credential was provided when accessing the Oracle
        Database or you were not authorized to access this database.
Action: Depending on your authentication method, ensure that the correct
        credential is provided when logging in to Oracle Database.
        Retry your credential after checking it. If your credential is
        correct, you may not be authorized to access the database.
        You will need to contact your database administrator or
        identity management administrator to confirm that you are
        authorized to access the database.

ちなみに OS 側から oerr コマンドを実行することもできます。実はこちらの機能は、10.2.0.5 からあったのだとか。(AIは初めて知りました…)書いてある内容はそう変わりませんが、URL はこちらでは出力されませんね。

$ oerr ORA 1017
01017, 00000, "invalid credential or not authorized; logon denied"
// *Cause:  An invalid credential was provided when accessing the Oracle
//          Database or you were not authorized to access this database.
// *Action: Depending on your authentication method, ensure that the correct
//          credential is provided when logging in to Oracle Database.
//          Retry your credential after checking it. If your credential is
//          correct, you may not be authorized to access the database.
//          You will need to contact your database administrator or
//          identity management administrator to confirm that you are
//          authorized to access the database.

■まとめ

いかがでしたでしょうか。今までは Oracle のエラーに遭遇したら、Database エラー・メッセージのマニュアルを開いて、該当するエラー番号のページを探して、エラーを検索して…といった作業をしていました。地味に工程が多い…。

23ai からは、OERR コマンドやエラーの URL から即座にエラーの概要を確認できるようになり、とても便利になる予感がしております!

Oracle 23ai 新機能 – ブール・データ型, ブール式

AIです。(Artificial Intelligence ではありません)

最近スーパーでマイナーなお肉が売られているのを発見し、ちょっと興味がわいているこの頃です。カンガルー肉…エルク肉…どんなお味なんでしょうか…

さて、今回は 23ai から新たに追加された ブール・データ型やブール式について、見ていきます!

■ブール・データ型(BOOLEAN データ型)とは

表内に TRUE / FALSE で値を格納するデータ型です。このデータ型を使うと SQL 文でブール式を使った条件を指定することができるようになります。

また、TRUE / FALSE に変換可能な文字をブール・データ型の列に格納した場合、自動で TRUE / FALSE に変換されて格納されます。

■文字の自動変換

以下の文字列リテラルをブール・データ型の列に格納した場合、それぞれ以下のように TRUE/FALSE に変換されます。

TRUE                   FALSE
--------------         --------------
'true'                 'false'
'yes'                  'no'
'on'                   'off'
0以外の数値            '0'
't'                    'f'
'y'                    'n'

では、実際に表に値を格納してみましょう。

SQL> CREATE TABLE Woodcutter.bool_test (id number(6),value varchar2(100),bool_value boolean);

表が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(1,'TRUE','TRUE'); ★value(VARCHAR2データ型) と bool_value(BOOLEANデータ型)に同じ値を格納

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(2,'FALSE','FALSE');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(3,'ON','ON');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(4,'OFF','OFF');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(5,'1',1);

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(6,'0',0);

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(7,'YES','YES');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(8,'NO','NO');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(9,'T','T');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(10,'F','F');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(11,'Y','Y');

1行が作成されました。

SQL> INSERT INTO Woodcutter.bool_test VALUES(12,'N','N');

1行が作成されました。


SQL> SELECT * FROM Woodcutter.bool_test;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         1 TRUE       TRUE
         2 FALSE      FALSE
         3 ON         TRUE  ★それぞれの値に応じて TRUE / FALSE として格納されています。
         4 OFF        FALSE
         5 1          TRUE
         6 0          FALSE
         7 YES        TRUE
         8 NO         FALSE
         9 T          TRUE
        10 F          FALSE
        11 Y          TRUE
        12 N          FALSE

12行が選択されました。

表に記載の通りに ブール・データ型の列は、TRUE / FALSE に変換されました!

■ブール式を使用した SELECT

ブール・データ型の実装と併せて、SQL 内でブール式を使用することができるようになりました。
例えば、先ほど作成した表から BOOL_VALUE が TRUE の値のレコードのみ SELECT したい場合
以下の様に IS TRUE を使って条件を指定することができます。

SQL> SELECT * FROM Woodcutter.bool_test WHERE bool_value IS TRUE;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         1 TRUE       TRUE
         3 ON         TRUE
         5 1          TRUE
         7 YES        TRUE
         9 T          TRUE
        11 Y          TRUE

6行が選択されました。

IS NOT TRUE を使うこともできます。

SQL> SELECT * FROM Woodcutter.bool_test WHERE bool_value IS NOT TRUE;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         2 FALSE      FALSE
         4 OFF        FALSE
         6 0          FALSE
         8 NO         FALSE
        10 F          FALSE
        12 N          FALSE

6行が選択されました。

もちろん IS FALSE や IS NOT FALSE も利用可能です。

また、IS をつけなくてもブール・データ型は列名のみを条件として指定することが可能です。この場合、TRUE でないものを選択したい場合、NOT <ブール・データ型の列名>と指定します。

SQL> SELECT * FROM Woodcutter.bool_test WHERE bool_value; ★列名だけの指定

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         1 TRUE       TRUE
         3 ON         TRUE
         5 1          TRUE
         7 YES        TRUE
         9 T          TRUE
        11 Y          TRUE

6行が選択されました。

SQL> SELECT * FROM Woodcutter.bool_test WHERE NOT bool_value;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         2 FALSE      FALSE
         4 OFF        FALSE
         6 0          FALSE
         8 NO         FALSE
        10 F          FALSE
        12 N          FALSE

6行が選択されました。

■ブール・データ型ではない列に対してブール式を使用

更に、ブール・データ型ではない列に対してもブール式で問合せをすることが可能です。その場合「■文字の自動変換」で記載した文字列に従って TRUE/FALSE が判断されます。

SQL> SELECT * FROM Woodcutter.bool_test WHERE value IS FALSE;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         2 FALSE      FALSE
         4 OFF        FALSE
         6 0          FALSE
         8 NO         FALSE
        10 F          FALSE
        12 N          FALSE

6行が選択されました。

SQL> SELECT * FROM Woodcutter.bool_test WHERE value;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         1 TRUE       TRUE
         3 ON         TRUE
         5 1          TRUE
         7 YES        TRUE
         9 T          TRUE
        11 Y          TRUE

6行が選択されました。

これはつまり、dba_users などの静的ディクショナリビューで Y/N や YES/NO で
データが格納されている列に対してもブール式で問合せができるということですね…!

SQL> desc dba_users
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(128)
 :
 COMMON                                             VARCHAR2(3)★


SQL> SELECT username,common FROM dba_users WHERE common;

USERNAME                  COM
------------------------- ---
SYS                       YES
SYSTEM                    YES
SYSRAC                    YES
:(一部割愛)
SYSKM                     YES
SYS$UMF                   YES
SYSDG                     YES

33行が選択されました。

■ブール・データ型に変換できないデータの場合

さて、ブール・データ型やブール式の特徴について見てきましたが、次はブール・データ型に変換できないデータが入っていた場合の挙動を確認します。

・ブール・データ型の列に変換できないデータを挿入した場合

SQL> INSERT INTO Woodcutter.bool_test VALUES(13,'AI','I');
INSERT INTO Woodcutter.bool_test VALUES(13,'AI','I')
                                                *
行1でエラーが発生しました。:
ORA-61800: 無効なブール・リテラル: I ヘルプ:
https://docs.oracle.com/error-help/db/ora-61800/

・ブール式で条件指定した列にブール・データ型に変換できないデータが入っていた場合

SQL> SELECT * FROM Woodcutter.bool_test;

        ID VALUE      BOOL_VALUE
---------- ---------- -----------
         1 TRUE       TRUE
         2 FALSE      FALSE
         3 ON         TRUE
         4 OFF        FALSE
         5 1          TRUE
         6 0          FALSE
         7 YES        TRUE
         8 NO         FALSE
         9 T          TRUE
        10 F          FALSE
        11 Y          TRUE
        12 N          FALSE
        13 AI         TRUE

13行が選択されました。

SQL> SELECT * FROM Woodcutter.bool_test WHERE value;
ERROR:
ORA-61800: 無効なブール・リテラル: AI ヘルプ:
https://docs.oracle.com/error-help/db/ora-61800/

レコードが選択されませんでした。

いずれも ORA-61800 が返されました。

■AND / OR 条件

ブール式での条件を二つ以上組み合わせて AND/OR 条件で絞ることもできます。

SQL> SELECT * FROM Woodcutter.bool_test2;

        ID BOOL_VALUE1 BOOL_VALUE2
---------- ----------- -----------
         1 TRUE        TRUE
         2 TRUE        FALSE
         3 FALSE       TRUE
         4 FALSE       FALSE


SQL> SELECT * FROM Woodcutter.bool_test2 WHERE bool_value1 AND bool_value2;

        ID BOOL_VALUE1 BOOL_VALUE2
---------- ----------- -----------
         1 TRUE        TRUE

SQL> SELECT * FROM Woodcutter.bool_test2 WHERE bool_value1 OR bool_value2;

        ID BOOL_VALUE1 BOOL_VALUE2
---------- ----------- -----------
         1 TRUE        TRUE
         2 TRUE        FALSE
         3 FALSE       TRUE

■TO_BOOLEAN 関数

また、ブール・データ型に変換可能なデータであれば、TO_BOOLEAN 関数を使ってブール・データ型として表示させることも可能です。

SQL> SELECT TO_BOOLEAN(1),TO_BOOLEAN('ON'),TO_BOOLEAN('F');

TO_BOOLEAN( TO_BOOLEAN( TO_BOOLEAN(
----------- ----------- -----------
TRUE        TRUE        FALSE


SQL> SELECT TO_BOOLEAN(1),TO_BOOLEAN('ON'),TO_BOOLEAN('F'),TO_BOOLEAN('I');
SELECT TO_BOOLEAN(1),TO_BOOLEAN('ON'),TO_BOOLEAN('F'),TO_BOOLEAN('I')
                                                      *
行1でエラーが発生しました。:
ORA-61800: 無効なブール・リテラル: I ヘルプ:
https://docs.oracle.com/error-help/db/ora-61800/

仮想列で TO_BOOLEAN 関数を使えば既存のデータを BOOLEAN データ型で表示させることも簡単にできます。

SQL> ALTER TABLE Woodcutter.bool_test ADD (fuction_value AS (TO_BOOLEAN(value)));

表が変更されました。

SQL> SELECT * FROM Woodcutter.bool_test;

        ID VALUE     BOOL_VALUE  FUCTION_VAL
---------- --------- ----------- -----------
         1 TRUE      TRUE        TRUE
         2 FALSE     FALSE       FALSE
         3 ON        TRUE        TRUE
         4 OFF       FALSE       FALSE
         5 1         TRUE        TRUE
         6 0         FALSE       FALSE
         7 YES       TRUE        TRUE
         8 NO        FALSE       FALSE
         9 T         TRUE        TRUE
        10 F         FALSE       FALSE
        11 Y         TRUE        TRUE
        12 N         FALSE       FALSE

12行が選択されました。

■おわりに

さて、ブール・データ型およびブール式について色々と検証してきましたがいかがでしょうか。

AI的には、ブール・データ型が実装されたことにより、今まで静的ディクショナリビューでTRUE/FALSE で表現できそうなデータに変更が出るのか気になっていましたが、特定の文字列であれば特に意識することなくブール型で条件を指定できることが驚きでした!

今後、調査で静的ディクショナリビューや v$ ビューを見るときの SQL の作り方にも影響しそうですね。