4D v13.4

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

ホーム

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

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


 

 

原則として、4D SQLエンジンはSQL-92互換です。つまり使用するコマンドや関数、演算子、シンタックスの詳細な説明が必要な場合、SQL-92リファレンスを参照できます。これらは例えばインターネットで見つけることができます。

しかし、4D SQLエンジンはSQL-92の機能を100%サポートしているわけではありません。また特定の追加の機能をサポートしています。

この節では、4D SQLエンジンの主たる実装と制限について説明しています。

4DのSQLエンジンは4Dデータベースの深い部分に統合されているため、テーブルやカラム (フィールド) 、レコードの最大数や、テーブルやカラムの命名規則に関する制限は、標準の内部的な4Dエンジン (DB4D) と同じです。以下にこれらをリストします。

  • テーブルの最大数: 理論的には20億ですが、4Dとの互換性のため32767となっています。
  • 1テーブルの カラム (フィールド) の最大数: 理論的には20億ですが、4Dとの互換性のため32767となっています。
  • 1テーブルの ロー (レコード) の最大数: 10億
  • インデックスキーの最大数: 10億 x 64
  • 主 キーにNULL値は許されずまたユニークでなければなりません。主キーカラム (フィールド) にインデックスを付ける必要はありません。
  • テー ブルやフィールドの最大文字数: 31文字 (4Dの制限)

異なるユーザにより作成されたとしても、同じテーブル名は許可されません。標準の4Dコントロールが適用されます。

以下の表では、4D SQLでサポートされるデータタイプと、それに対応する4Dのタイプを説明しています:

4D SQL説明4D
Varchar 文字テキストテキストまたは文字
Real範囲+/-1.7E308の浮動小数点数実数
Numeric 範囲+/- 2E64の数値64 bit整数
Float浮動小数点数 (事実上無限)Float
Smallint 範囲-32,768から32,767の数値整数
Int 範囲-2,147,483,648から2,147,483,647の数値倍長整数
Int64 範囲 +/- 2E64の数値64 bit整数
UUID16バイトの数値 (128 bit) で32個の16進文字を含むUUID 文字フォーマット
Bit TRUE/FALSEまたは1/0値のみをとるフィールドブール
Boolean TRUE/FALSEまたは1/0値のみをとるフィールドブール
Blob2GBまで: 画像、アプリケーション、ドキュメントなどのバイナリオブジェクトBlob
Bit varying2GBまで: 画像、アプリケーション、ドキュメントなどのバイナリオブジェクトBlob
Clob2GB文字までのテキスト。この カラム (フィールド) にインデックスは付けられません。これはレコード自身には保存されません。テキスト
Text2GB 文字までのテキスト。このカラム (フィールド) にインデックスは付けられません。これはレコード自身には保存されません。テキスト
Timestamp 日付と時間。日付は'YYYY/MM/DD'フォーマットで時間は'HH:MM:SS:ZZ'フォーマット個別に処理される日付と時間 (自動変換)
Duration'HH:MM:SS:ZZ'フォーマットの時間時間
Interval 'HH:MM:SS:ZZ'フォーマットの時間時間
Picture2GBまでのPICTピクチャピク チャ

数値タイプ間の自動変換が実装されています。
数値を表す文字列は対応する数値に変換されません。特別なCAST関数を使用して、タイプ間の変換を行うことができます。
以下のSQLデータタイプは 実装されていません:

  • NCHAR
  • NCHAR VARYING.

NULL値は4D SQLランゲージおよび4Dデータベースエンジンに実装されています。しかし4Dランゲージではサポートされていません。にもかかわらず、Is field value NullSET FIELD VALUE NULLコマンドを使用して、4DフィールドのNULL値を読み書きできます。

4Dでの互換性のため、4Dデータベーステーブルに格納されたNULL値は、4Dランゲージを使用して操作する際、自動でデフォルト値に変換されます。例えば以下の文において:

 myAlphavar:=[mytable]MyAlphafield

MyAlphafieldフィールドにNULL値が含まれる場合、myAlphavar変数には"" (空の文字列) が代入されます。

デフォルト値はデータ型により異なります:

  • 文字およびテキストデータ型: ""
  • 実数、整数、および倍長整数型: 0
  • 日付データ型: “00/00/00”
  • 時間データ型: “00:00:00”
  • ブールデータ型: False
  • ピクチャデータ型: 空のピクチャ
  • Blobデータ型: 空のBlob

他方、このメカニズムは原則として、クエリのような4Dデータベースエンジンレベルでは適用されません。実際、空の値の検索 (例えばmyvalue=0) はNULL値が格納されたレコードを見つけませんし、逆の場合も同様です。両方のタイプの値 (デフォルト値とNULL) がレコードの同じフィールドに存在する場合、処理が変更されたり、あるいは追加のコードが必要となることがあります。
この不便さを避けるために、4Dランゲージで、すべての処理を標準化するために使用できるNULL値を空値にマップオプションがあります。ストラクチャエディタのフィールドインスペクタにあるこのオプションを使用すると、デフォルト値を使用する原則をすべての処理に拡張できます。NULL値を含むフィールドは、機械的にデフォルト値を含むものとして扱われます。このオプションはデフォルトでチェックされています。

NULL値を空値にマッププロパティはデータベースエンジンの低レベルで考慮されます。特にIs field value Nullコマンドに影響します。

NULL値の入力を拒否フィールドプロパティは、NULL値が格納されることを防ぐ目的で使用されます:


フィールドのこの属性にチェックが入れられていると、そのフィールドにNULL値を格納できなくなります。この低レベルのプロパティはSQLのNOT NULL属性に対応します。
一般的に、4DデータベースでNULL値を使用したい場合、4DのSQLランゲージのみをデータベースで使用することをお勧めします。

Note: 4Dでは、フィールドに"必須入力"属性を設定することもできます。2つの設定のコンセプトは似ていますが、スコープが異なります。"必須入力"属性はデータ入力コントロールであり、“NULL値の入力を拒否”属性はデータベースエンジンレベルで動作します。
この設定がされたフィールドがNULL値を受け取ると、エラーが生成されます。

4Dプロジェクトメソッドにセキュリティ関連のプロパティ、SQL利用可が追加されました:

このオプションがチェックされていると、このプロジェクトメソッドを4D SQLエンジンから実行できます。デフォルトではチェックされておらず、4Dプロジェクトメソッドは保護されていて、4D SQLエンジンから呼び出すことはできません。メソッドを4D SQLエンジンから実行可能にするには、このオプションにチェックしてそれを認可しなければなりません。

このプロパティはODBC Driver経由、あるいはBegin SQL/End SQLタグの間に挿入されたSQLコード、またはQUERY BY SQLコマンドによる実行など、内部外部問わずすべてのSQLクエリに適用されま す。

Notes:

  • メソッドに"SQL利用可"属性が設定されていても、実行の際には環境設定レベルおよびメソッドプロパティレベルで設定されたアクセス権 が考慮されます。
  • ODBC SQLProcedure関数は、"SQL利用可"属性が設定されたプロジェクトメソッドのみを返します。

  • 自動コミットトランザクション: このオプションを使用してSQLエンジンの自動コミットメカニズムを有効にできます。自動コミットモードの目的は、データの参照整合性を保つことにあります。このオプションがチェックされていると、トランザクションの中で実行されていないすべてのSELECTINSERTUPDATE、そしてDELETE (SIUD) クエリは、自動でアドホックなトランザクションに含められます。これによりクエリが完全に実行されるか、エラーが発生した場合にはキャンセルされることが 保障されます。
  • すでにトランザクションの中にある (参照整合性がカスタムに管理されている) クエリは、このオプションの影響を受けません。
    こ のオプションにチェックがされていないと、(SELECT... FOR UPDATE クエリを除き) 自動トランザクションは生成されません (SELECTコマンド参照)。デフォルトでこ のオプションはチェックされていません。
    SET DATABASE PARAMETERコ マンドを使用して、プログラムでこのオプションを管理することもできます。
    Note
    : 4D SQLエンジンによりクエリされるローカルデータベースのみがこのパラメタの影響を受けます。外部データベースの場合、自動コミットメカニズムはリモート のSQLエンジンが処理します。
  • 大文字小文字を区別した文字列比較: このオプションを使用してSQLクエリ時の文字列比較を変更することができます。このオプションはデフォルトでチェックされていて、SQLエンジンは文字 列比較 (ソートやクエリ) の際に大文字小文字を区別します。 例えば“ABC”=“ABC” ですが “ABC” # “Abc” となります。
    SQL エンジンと4Dエンジンの動作を揃えたいなど特定のケースでは、文字列比較で大文字小文字を区別したくない (“ABC”=“Abc”) 場合があります。そのようにするには、このオプションの選択を外します。
    SET DATABASE PARAMETERコマンドを使用して、プログラムでこのオ プションを管理することもできます。

4Dはスキーマのコンセプトを実装しています。スキーマはデータベースのテーブルを含む仮想的なオブジェクトです。SQLにおいてスキーマの目的は、異なるデータベースオブジェクトのセットに特定のアクセス権を割り当てることです。スキーマはデータベースを、そのデータベース全体を形成する個々の独立するエンティティに分割します。つまりあるテーブルはいつもただ1つのスキーマに属します。

  • スキーマを作成するには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カラム番号
AUTOGENERATEBOOLEANカラム値が自動的に生成されたのならTrue、そうでなければFalse
AUTOINCREMENTBOOLEANカラム値が自動的に増加したのならTrue、そうでなければFalse

_USER_INDEXESデータベースのユーザインデックスを記述します
INDEX_IDVARCHARインデックス番号
INDEX_NAMEVARCHARインデックス名
INDEX_TYPEINT32インデックスタイプ (1=Bツリー / 複合, 3=クラスタ / キーワード, 7=自動)
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制約定義のタイプ (P=主キー、R=参照整合性 - 外部キー、4DR=4Dリレーション)
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_IDINT32スキーマ番号
SCHEMA_NAMEVARCHARスキーマ名
READ_GROUP_IDINT32読み込みのみアクセスをもつグループ番号
READ_GROUP_NAMEVARCHAR読み込みのみアクセスをもつグループ名
READ_WRITE_GROUP_IDINT32読み書きアクセスをもつグループ番号
READ_WRITE_GROUP_NAMEVARCHAR読み書きアクセスをもつグループ名
ALL_GROUP_IDINT32フルアクセスをもつグループ番号
ALL_GROUP_NAMEVARCHARフルアクセスをもつグループ名

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

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

  • SQL LOGINコマンドを使用して、既存のデータベースにログインする。
  • あるデータベースから他のデータベースに、SQL LOGINSQL LOGOUTコマンドを使用してスイッチする。
  • USE DATABASEコマンドを使用して、カレントデータベースに代わり、別の4Dデータベースを開いて使用する。

SQLランゲージでは主キーを使用して、テーブル中のレコード (ロー) を指定するカラム (フィールド) 決定します。主キーの設定は特に4Dテーブルのレコード複製機能において必要となります (SQLを使用した複製参照)。

4Dでは2つの方法を使用してテーブルの主キーを管理できます:

  • SQLランゲージを使用する
  • 4Dのストラクチャエディタを使用する

テーブルを作成するとき (CREATE TABLEコマンドを使用) またはカラムを追加や変更するとき (ALTER TABLEコマンドを使用)、主キーを設定できます。主キーはPRIMARY KEY句とそれに続くカラム名またはカラムリストで指定されます。 詳細はを参照してください。

4Dではストラクチャエディタのコンテキストメニューを使用して直接主キーを作成したり削除したりできます。

主キーを作成するには:

  1. テーブルの主キーを構成するフィールドを選択します。
  2. 右クリックしてコンテキストメニューから主キーを作成コマンドを選択します:

主キーに含められたフィールドにはエディタ中で下線が引かれ、SQL定義にはPRIMARY KEYキーワードが表示されます。 

主キーに属するフィールドには重複する値が含まれてはいけません。既にテーブルレコードに重複する値が存在する場合、このことを知らせる警告ダイアログが表示されます。

Note: 主キーに属するカラムはNULL値を受け入れません。

テーブルから主キーを取り除くには:

  1. 主キーを含むテーブル上で右クリックし、コンテキストメニューから主キーを取り除くコマンドを選択します:

    確認ダイアログボックスが表示されます。OKをクリックすると即座に主キーが取り除かれます。

 
プロパティ 

プロダクト: 4D
テーマ: 4DでSQLを使用する

 
参照 

sql_data_type_name