4Dと4D SQLエンジン統合の原則

4D - Documentation   Fran溝is   English   German   日本語   4D SQL Reference目次   4D SQL Referenceインデックス   Back   Previous   Next

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値のみをとるフィールドブール
BooleanTRUEまたはFALSE値のみをとるフィールドブール
Blob2 GBまで; 画像、他のアプリケーション、ドキュメントなどのバイナリオブジェクトBlob
Bit varying2 GBまで; 画像、他のアプリケーション、ドキュメントなどのバイナリオブジェクトBlob
Clob2 GB文字までのテキスト。このカラム (フィールド) にインデックスは付けられません。これはレコード自身には保存されません。テキスト
Text2 GB文字までのテキスト。このカラム (フィールド) にインデックスは付けられません。これはレコード自身には保存されません。テキスト
Timestamp日付と時間。Day Month Year Hours:Minutes:Seconds:Millisecondsフォーマット個別に処理される日付と時間 (自動変換)
Duration時間。Day:Hours:Minutes:Seconds:Millisecondsフォーマット時間
Interval時間。Day:Hours:Minutes:Seconds:Millisecondsフォーマット時間
Picture2 GBまでのPICTピクチャピクチャ

数値タイプ間の自動変換が実装されています。

数値を表す文字列は対応する数値に変換されません。特別なCAST関数を使用して、タイプ間の変換を行うことができます。

以下のSQLデータタイプは実装されていません:

・NCHAR

・NCHAR VARYING.

4DにおけるNULL値

NULL値は4D SQLランゲージおよび4Dデータベースエンジンに実装されています。しかし4Dランゲージではサポートされていません。

Note: しかしながら、Is field value NullSET 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コマンドを使用します。そして、GRANTREVOKEコマンドを使用してスキーマへのアクセスタイプを設定します。

・スキーマでテーブルを割り当てるには、CREATE TABLEまたはALTER TABLEコマンドを呼び出します。また4Dのストラクチャエディタにあるインスペクタの"スキーマ" ポップアップメニューを使用することもできます。このメニューは、データベースで定義されているすべてのスキーマが表示します。

・スキーマを削除するには、DROP SCHEMAコマンドを使用します。

Note: スキーマによるアクセスコントロールは、外部からの接続のみに適用します。Begin SQL/End SQL タグ、SQL EXECUTEQUERY 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_NAMEVARCHARテーブル名
TEMPORARYBOOLEANテーブルが一時的の場合True、そうでなければFalse
TABLE_IDINT64テーブル番号
SCHEMA_IDINT32スキーマ番号

_USER_COLUMNSデータベースのユーザテーブルのカラムを記述します
TABLE_NAMEVARCHARテーブル名
COLUMN_NAMEVARCHARカラム名
DATA_TYPEINT32カラムタイプ
DATA_LENGTHINT32カラム長
NULLABLEBOOLEANカラムがNULLを受け入れる場合True、そうでなければFalse
TABLE_IDINT64テーブル番号
COLUMN_IDINT64カラム番号

_USER_INDEXESデータベースのユーザインデックスを記述します
INDEX_IDVARCHARインデックス番号
INDEX_NAMEVARCHARインデックス名
INDEX_TYPEINT32インデックスタイプ
TABLE_NAMEVARCHARインデックスがはられたテーブル名
UNIQUENESSBOOLEANインデックスが重複不可の制約を課す場合True、そうでなければFalse
TABLE_IDINT64インデックスがはられたテーブル番号

_USER_IND_COLUMNSデータベースのユーザインデックスのカラムを記述します
INDEX_IDVARCHARインデックス番号
INDEX_NAMEVARCHARインデックス名
TABLE_NAMEVARCHARインデックスがはられたテーブル名
COLUMN_NAMEVARCHARインデックスがはられたフィールド名
COLUMN_POSITIONINT32インデックス中のカラムポジション
TABLE_IDINT64インデックスがはられたテーブル番号
COLUMN_IDINT64カラム番号

_USER_CONSTRAINTSデータベースのユーザ制約を定義します
CONSTRAINT_IDVARCHAR制約番号
CONSTRAINT_NAMEVARCHAR制約名
CONSTRAINT_TYPEVARCHAR制約タイプ
TABLE_NAMEVARCHAR制約付きのテーブル名
TABLE_IDINT64制約付きのテーブル番号
DELETE_RULEVARCHARルール削除 ? CASCADE または RESTRICT
RELATED_TABLE_NAMEVARCHARリレートしたテーブル
RELATED_TABLE_IDINT64リレートしたテーブルの番号

_USER_CONS_COLUMNSデータベースのユーザ制約のカラムを記述します
CONSTRAINT_IDVARCHAR制約番号
CONSTRAINT_NAMEVARCHAR制約名
TABLE_NAMEVARCHAR制約のあるテーブル名
TABLE_IDINT64制約のあるテーブル番号
COLUMN_NAMEVARCHAR制約のあるカラム名
COLUMN_IDINT64制約のあるカラム番号
COLUMN_POSITIONINT32制約のあるカラムのポジション
RELATED_COLUMN_NAMEVARCHAR制約中関連するカラムの名前
RELATED_COLUMN_IDINT32制約中関連するカラムの番号

_USER_SCHEMAS データベースのスキーマを記述します

SCHEMA_ID INT32 スキーマ番号

SCHEMA_NAME VARCHAR スキーマ名

READ_GROUP_ID INT32 読み込み専用でアクセスするグループ番号

READ_GROUP_NAME VARCHAR 読み込み専用でアクセスするグループ名

READ_WRITE_GROUP_ID INT32 読み込み/ 書き込みでアクセスするグループ番号

READ_WRITE_GROUP_NAMEVARCHAR読み込み/ 書き込みでアクセスするグループ名
ALL_GROUP_IDINT32完全にアクセスするグループ番号
ALL_GROUP_NAMEVARCHAR完全にアクセスするグループ名

Note: システムテーブルには、SYSTEM_SCHEMAという名前の特定なスキーマが割り当てられます。このスキーマを修正したり、変更したりすることはできません。そして、このスキーマは、テーブルインスペクタパレットに表示されているスキーマのリストには含まれていません。すべてのユーザは、読み込み専用でこのスキーマにアクセスできます。

SQLソースへの接続

4D SQLサーバのレベルでは、マルチデータベースのアーキテクチャが実装されています。4Dでは以下のことが可能です:

SQL LOGINコマンドを使用して、既存のデータベースにログインする。

・あるデータベースから他のデータベースに、SQL LOGINSQL LOGOUT コマンドを使用してスイッチする。


4D - Documentation   Fran溝is   English   German   日本語   4D SQL Reference目次   4D SQL Referenceインデックス   Back   Previous   Next