version 11.3 (Modified)
原則として、4D SQLエンジンはSQL-92互換です。つまり使用するコマンドや関数、演算子、シンタックスの詳細な説明が必要な場合、SQL-92リファレンスを参照できます。これらは例えばインターネットで見つけることができます。
しかし、4D SQLエンジンはSQL-92の機能を100%サポートしているわけではありません。また特定の追加の機能をサポートしています。
この節では、4D SQLエンジンの主たる実装と制限について説明しています。
一般的な制限
4DのSQLエンジンは4Dデータベースの深い部分に統合されているため、テーブルやカラム (フィールド) 、レコードの最大数や、テーブルやカラムの命名規則に関する制限は、標準の内部的な4Dエンジン (DB4D) と同じです。以下にこれらをリストします。
・テーブルの最大数: 理論的には20億ですが、4D v11との互換性のため32767となっています。
・1テーブルのカラム (フィールド) の最大数: 理論的には20億ですが、4D v11との互換性のため32767となっています。
4D v11の“Standard edition”では、最大数は511です。
・1テーブルのロー (レコード) の最大数: 10億
・インデックスキーの最大数: 10億 x 64
・主キーにNULL値は許されずまたユニークでなければなりません。主キーカラム (フィールド) にインデックスを付ける必要はありません。
・テーブルやフィールドの最大文字数: 31文字 (4Dの制限)
異なるユーザにより作成されたとしても、同じテーブル名は許可されません。標準の4Dコントロールが適用されます。
データタイプ
以下の表では、4D SQLでサポートされるデータタイプと、それに対応する4Dのタイプを説明しています:
4D SQL | 説明 | 4D v11 |
Varchar | 文字テキスト | テキスト |
Real | 範囲+/-3,4E38の浮動小数点数 | 実数 |
Numeric | 範囲+/- 2E64の数値 | Integer 64 bits |
Float | 浮動小数点数 (事実上無限) | 実数 |
Smallint | 範囲-32,768から32,767の数値 | 整数 |
Int | 範囲-2,147,483,648から2,147,483,647の数値 | 倍長整数 |
Bit | TRUEまたはFALSE値のみをとるフィールド | ブール |
Boolean | TRUEまたはFALSE値のみをとるフィールド | ブール |
Blob | 2 GBまで; 画像、他のアプリケーション、ドキュメントなどのバイナリオブジェクト | Blob |
Bit varying | 2 GBまで; 画像、他のアプリケーション、ドキュメントなどのバイナリオブジェクト | Blob |
Clob | 2 GB文字までのテキスト。このカラム (フィールド) にインデックスは付けられません。これはレコード自身には保存されません。 | テキスト |
Text | 2 GB文字までのテキスト。このカラム (フィールド) にインデックスは付けられません。これはレコード自身には保存されません。 | テキスト |
Timestamp | 日付と時間。Day Month Year Hours:Minutes:Seconds:Millisecondsフォーマット | 個別に処理される日付と時間 (自動変換) |
Duration | 時間。Day:Hours:Minutes:Seconds:Millisecondsフォーマット | 時間 |
Interval | 時間。Day:Hours:Minutes:Seconds:Millisecondsフォーマット | 時間 |
Picture | 2 GBまでのPICTピクチャ | ピクチャ |
数値タイプ間の自動変換が実装されています。
数値を表す文字列は対応する数値に変換されません。特別なCAST関数を使用して、タイプ間の変換を行うことができます。
以下のSQLデータタイプは実装されていません:
・NCHAR
・NCHAR VARYING.
4DにおけるNULL値
NULL値は4D SQLランゲージおよび4Dデータベースエンジンに実装されています。しかし4Dランゲージではサポートされていません。
Note: しかしながら、Is field value NullやSET FIELD VALUE NULLコマンドを使用して、4DフィールドのNULL値を読み書きできます。
NULL値を空の値にマップする互換性オプション
互換性のため、4D v11で4Dランゲージを使用して操作する際、4Dデータベースに格納されたNULL値は自動でデフォルト値に変換されます。例えば以下の文において:
myAlphavar:=[mytable]MyAlphafield
MyAlphafieldフィールドにNULL値が含まれる場合、myAlphavar変数には“” (空の文字列) が割り当てられます。
デフォルト値はデータタイプにより異なります:
・文字およびテキストタイプ: “”
・実数、整数、および倍長整数タイプ: 0
・日付タイプ: “00/00/00”
・時間タイプ: “00:00:00”
・ブールタイプ: False
・ピクチャタイプ: 空のピクチャ
・Blobタイプ: 空のblob
他方、このメカニズムは原則として、クエリのような4Dデータベースエンジンレベルでは適用されません。実際、空の値の検索 (例えばmyvalue=0) はNULL値が格納されたレコードを見つけませんし、逆の場合も同様です。両方のタイプの値 (デフォルト値とNULL) がレコードの同じフィールドに存在する場合、処理が変更されたり、あるいは追加のコードが必要となることがあります。
この不便さを避けるために、4D v11ランゲージで、すべての処理を標準化するために使用できるオプション、NULL値を空値にマップがあります。ストラクチャエディタで表示されるフィールドインスペクタのこのオプションを使用すると、すべての処理におけるデフォルト値の扱いの原則を拡張することができます。NULL値を含むフィールドは、機械的にデフォルト値を含むものとして扱われます。このオプションはデフォルトでチェックされています。
NULL値を空値にマップはデータベースエンジンの低レベルで考慮されます。特にIs field value Nullコマンドに影響します。
NULL値の入力を拒否属性
NULL値の入力を拒否フィールドプロパティは、NULL値が格納されることを防ぐ目的で使用されます:
この属性にチェックが入れられていると、そのフィールドにNULL値を格納できなくなります。この低レベルのプロパティはSQLのNOT NULL属性に対応します。
一般的に、4DデータベースでNULL値を使用したい場合、SQLランゲージのみを4Dデータベースで使用することをお勧めします。
Note: 4Dでは、フィールドに“必須入力”属性を設定することもできます。二つの設定のコンセプトは似ていますが、スコープが異なります。“必須入力”属性はデータ入力コントロールであり、“NULL値の入力を拒否”属性はデータベースエンジンレベルで動作します。
この設定がされたフィールドがNULL値を受け取ると、エラーが生成されます。
“SQL利用可”オプション
4Dプロジェクトメソッドにセキュリティ関連のプロパティ、SQL利用可が追加されました。
これにチェックされていると、このプロジェクトメソッドを4D SQLエンジンから実行できます。デフォルトではチェックされておらず、4Dプロジェクトメソッドは保護されています。このメソッドを4D SQLエンジンから実行可能にするには、このオプションにチェックしなければなりません。
このプロパティはODBC Driver経由、あるいはBegin SQL/End SQLの間に挿入されたSQLコード、またはQUERY BY SQLコマンドによる実行など、内部外部問わずすべてのSQLクエリに適用されます。
Notes:
・メソッドに“SQL利用可”属性が設定されていても、実行の際には環境設定レベルおよびメソッドプロパティレベルで設定されたアクセス権が考慮されます。
・ODBC SQLProcedure関数は、“SQL利用可”属性が設定されたプロジェクトメソッドのみを返します。
自動コミット
4D環境設定のSQL/設定ページに、4D SQLエンジンで自動コミットを有効にする設定があります:
自動コミットモードの目的は、関連データの整合性を保つことにあります。このオプションがチェックされていると、トランザクションの中で実行されていないすべてのSELECT、INSERT、UPDATEそしてDELETE (SIUD) クエリは、自動でアドホックなトランザクションに含められます。これにより、クエリが完全に実行されるか、エラーが発生した場合にはキャンセルされることが保障されます。
すでにトランザクションの中にある (参照整合性がカスタムに管理されている) クエリは、このオプションの影響を受けません。
このオプションにチェックがされていないと、SELECT... FOR UPDATE クエリを除き、自動トランザクションは生成されません (SELECTコマンド参照)。デフォルトでこのオプションはチェックされていません。
SET DATABASE PARAMETERコマンドを使用して、プログラムでこのオプションをコントロールすることもできます。(4DランゲージリファレンスマニュアルのSET DATABASE PARAMETERコマンドを参照してください。)
Note: 4D SQLエンジンによるローカルデータベースのクエリの場合にのみ、このパラメタは影響を受けます。外部データベースの場合、自動コミットメカニズムはリモートのSQLエンジンが処理します。
スキーマ
4D v11 SQLはスキーマのコンセプトを実装します。スキーマは、データベースのテーブルを含む仮想的なオブジェクトです。SQLのスキーマの目的は、異なるデータベースオブジェクトのセットに特定のアクセス権を割り当てることです。スキーマは、データベースをそのデータベース全体を形成する個々の独立する単位へと分割します。つまり一つのテーブルはいつもただ一つのスキーマに属します。
・スキーマを作成するには、CREATE SCHEMAコマンドを使用します。そして、GRANT とREVOKEコマンドを使用してスキーマへのアクセスタイプを設定します。
・スキーマでテーブルを割り当てるには、CREATE TABLEまたはALTER TABLEコマンドを呼び出します。また4Dのストラクチャエディタにあるインスペクタの"スキーマ" ポップアップメニューを使用することもできます。このメニューは、データベースで定義されているすべてのスキーマが表示します。
・スキーマを削除するには、DROP SCHEMAコマンドを使用します。
Note: スキーマによるアクセスコントロールは、外部からの接続のみに適用します。Begin SQL/End SQL タグ、SQL EXECUTE、QUERY BY SQL等によって4D内で実行されるSQLコードは、いつもフルアクセスされます。
システムテーブル
4DのSQLカタログには、7個のシステムテーブルが含まれていて、読み込み権限を持つSQLユーザがアクセス可能です。システムテーブルには以下があります: _USER_TABLES、_USER_COLUMNS、_USER_INDEXES、_USER_CONSTRAINTS、_USER_IND_COLUMNS、_USER _CONS_ COLUMNS、そして _USER_SCHEMAS。
SQLの習慣に従い、システムテーブルはデータベースストラクチャを記述します。以下はシステムテーブルに関する説明とフィールドです:
_USER_TABLES | データベースのユーザテーブルを記述します | |
TABLE_NAME | VARCHAR | テーブル名 |
TEMPORARY | BOOLEAN | テーブルが一時的の場合True、そうでなければFalse |
TABLE_ID | INT64 | テーブル番号 |
SCHEMA_ID | INT32 | スキーマ番号 |
_USER_COLUMNS | データベースのユーザテーブルのカラムを記述します | |
TABLE_NAME | VARCHAR | テーブル名 |
COLUMN_NAME | VARCHAR | カラム名 |
DATA_TYPE | INT32 | カラムタイプ |
DATA_LENGTH | INT32 | カラム長 |
NULLABLE | BOOLEAN | カラムがNULLを受け入れる場合True、そうでなければFalse |
TABLE_ID | INT64 | テーブル番号 |
COLUMN_ID | INT64 | カラム番号 |
_USER_INDEXES | データベースのユーザインデックスを記述します | |
INDEX_ID | VARCHAR | インデックス番号 |
INDEX_NAME | VARCHAR | インデックス名 |
INDEX_TYPE | INT32 | インデックスタイプ |
TABLE_NAME | VARCHAR | インデックスがはられたテーブル名 |
UNIQUENESS | BOOLEAN | インデックスが重複不可の制約を課す場合True、そうでなければFalse |
TABLE_ID | INT64 | インデックスがはられたテーブル番号 |
_USER_IND_COLUMNS | データベースのユーザインデックスのカラムを記述します | |
INDEX_ID | VARCHAR | インデックス番号 |
INDEX_NAME | VARCHAR | インデックス名 |
TABLE_NAME | VARCHAR | インデックスがはられたテーブル名 |
COLUMN_NAME | VARCHAR | インデックスがはられたフィールド名 |
COLUMN_POSITION | INT32 | インデックス中のカラムポジション |
TABLE_ID | INT64 | インデックスがはられたテーブル番号 |
COLUMN_ID | INT64 | カラム番号 |
_USER_CONSTRAINTS | データベースのユーザ制約を定義します | |
CONSTRAINT_ID | VARCHAR | 制約番号 |
CONSTRAINT_NAME | VARCHAR | 制約名 |
CONSTRAINT_TYPE | VARCHAR | 制約タイプ |
TABLE_NAME | VARCHAR | 制約付きのテーブル名 |
TABLE_ID | INT64 | 制約付きのテーブル番号 |
DELETE_RULE | VARCHAR | ルール削除 ? CASCADE または RESTRICT |
RELATED_TABLE_NAME | VARCHAR | リレートしたテーブル |
RELATED_TABLE_ID | INT64 | リレートしたテーブルの番号 |
_USER_CONS_COLUMNS | データベースのユーザ制約のカラムを記述します | |
CONSTRAINT_ID | VARCHAR | 制約番号 |
CONSTRAINT_NAME | VARCHAR | 制約名 |
TABLE_NAME | VARCHAR | 制約のあるテーブル名 |
TABLE_ID | INT64 | 制約のあるテーブル番号 |
COLUMN_NAME | VARCHAR | 制約のあるカラム名 |
COLUMN_ID | INT64 | 制約のあるカラム番号 |
COLUMN_POSITION | INT32 | 制約のあるカラムのポジション |
RELATED_COLUMN_NAME | VARCHAR | 制約中関連するカラムの名前 |
RELATED_COLUMN_ID | INT32 | 制約中関連するカラムの番号 |
_USER_SCHEMAS データベースのスキーマを記述します
SCHEMA_ID INT32 スキーマ番号
SCHEMA_NAME VARCHAR スキーマ名
READ_GROUP_ID INT32 読み込み専用でアクセスするグループ番号
READ_GROUP_NAME VARCHAR 読み込み専用でアクセスするグループ名
READ_WRITE_GROUP_ID INT32 読み込み/ 書き込みでアクセスするグループ番号
READ_WRITE_GROUP_NAME | VARCHAR | 読み込み/ 書き込みでアクセスするグループ名 |
ALL_GROUP_ID | INT32 | 完全にアクセスするグループ番号 |
ALL_GROUP_NAME | VARCHAR | 完全にアクセスするグループ名 |
Note: システムテーブルには、SYSTEM_SCHEMAという名前の特定なスキーマが割り当てられます。このスキーマを修正したり、変更したりすることはできません。そして、このスキーマは、テーブルインスペクタパレットに表示されているスキーマのリストには含まれていません。すべてのユーザは、読み込み専用でこのスキーマにアクセスできます。
SQLソースへの接続
4D SQLサーバのレベルでは、マルチデータベースのアーキテクチャが実装されています。4Dでは以下のことが可能です:
・SQL LOGINコマンドを使用して、既存のデータベースにログインする。
・あるデータベースから他のデータベースに、SQL LOGINとSQL LOGOUT コマンドを使用してスイッチする。