

# 実装が制限されている機能
<a name="babelfish-compatibility.tsql.limited-implementation"></a>

Babelfish の新しいバージョンでは、T-SQL の機能や動作にさらに適した機能が追加されています。ただし、現在の実装ではサポートされていない機能や違いがいくつかあります。以下に、Babelfish と T-SQL の機能の違いに関する情報と、回避策や使用上の注意事項を示します。

Babelfish のバージョン 1.2.0 時点では、以下の機能で実装が制限されています。
+ **SQL Server カタログ (システムビュー)** — カタログ `sys.sysconfigures`、`sys.syscurconfigs`、`sys.configurations` では、単一の読み取り専用設定のみをサポートします。現在、`sp_configure` はサポートされていません。Babelfish によって実装される SQL Server の他のビューの詳細については、「[Babelfish システムカタログからの情報の入手](babelfish-query-database.md)」を参照してください。
+ **許可の付与**— GRANT…TO PUBLIC はサポートされていますが、GRANT..TO PUBLIC WITH GRANT OPTION は現在サポートされていません。
+ **SQL Server *所有権チェーン*と許可メカニズムの制限** — Babelfish では、SQL Server の所有権チェーンはビューに対して機能しますが、ストアドプロシージャでは機能しません。つまり、プロシージャには、呼び出しプロシージャと同じ所有者が所有する他のオブジェクトへの明示的なアクセスを付与する必要があります。SQL Server では、プロシージャに対する呼び出し元の EXECUTE 許可を付与すれば、同じ所有者が所有する他のオブジェクトを呼び出すのに十分です。Babelfish では、呼び出し元にプロシージャによってアクセスされるオブジェクトに対する許可も付与する必要があります。
+ **非修飾 (スキーマ名なし) オブジェクト参照の解決** — SQL オブジェクト (プロシージャ、ビュー、関数、トリガー) が、スキーマ名で修飾せずにオブジェクトを参照する場合、SQL Server は、参照が発生する SQL オブジェクトのスキーマ名を使用してオブジェクトのスキーマ名を解決します。現在、Babelfish は、プロシージャを実行するデータベースユーザーのデフォルトスキーマを使用して、これを異なる方法で解決しています。
+ **デフォルトのスキーマの変更、セッション、および接続** — ユーザーがデフォルトのスキーマを `ALTER USER...WITH DEFAULT SCHEMA` で変更した場合、その変更はそのセッションですぐに有効になります。ただし、同じユーザーに属する現在接続されている他のセッションでは、次のようにタイミングが異なります。
  + SQL Server の場合: 変更は、このユーザーの他のすべての接続ですぐに有効になります。
  + Babelfish の場合: この変更は、新しい接続に対してのみ有効になります。
+ **ROWVERSION および TIMESTAMP データ型の実装とエスケープハッチ設定** — Babelfish で ROWVERSION と TIMESTAMP データ型がサポートされるようになりました。Babelfish で ROWVERSION または TIMESTAMP を使用するには、エスケープハッチ `babelfishpg_tsql.escape_hatch_rowversion` の設定をデフォルト (strict) から `ignore` に変更する必要があります。ROWVERSION および TIMESTAMP データ型の Babelfish の実装は、意味的に SQL Server とほぼ同じですが、次の例外があります。
  + 組み込みの @@DBTS 関数は、SQL Server と同様に動作しますが、わずかに違います。BabelBabelfish は、`SELECT @@DBTS` の最後に使用された値を返すのではなく、基礎となる PostgreSQL データベースエンジンとそのマルチバージョン同時実行制御 (MVCC) の実装により、新しいタイムスタンプを生成します。
  + SQL Server では、挿入または更新されたすべての行に一意の ROWVERSION/TIMESTAMP 値が付与されます。Babelfish では、同じステートメントによって更新される挿入されたすべての行に、同じ ROWVERSION/TIMESTAMP 値が割り当てられます。

    例えば、UPDATE ステートメントまたは INSERT-SELECT ステートメントが複数の行に影響する場合、SQL Server では、影響を受けるすべての行の ROWVERSION/TIMESTAMP 列の値が異なります。Babelfish (PostgreSQL) では、行の値は同じです。
  + SQL Server では、SELECT-INTO を使用して新しいテーブルを作成するときに、作成される ROWVERSION/TIMESTAMP 列に明示的な値 (NULL など) をキャストできます。Babelfish で同じことをすると、Babelfish によって、実際の ROWVERSION/TIMESTAMP 値が新しいテーブルの各行に割り当てられます。

  ROWVERSION/TIMESTAMP のデータ型のこれらのわずかな違いは、Babelfish で実行されているアプリケーションに悪影響を及ぼさないはずです。
+ **TOP N PERCENT 句** – Babelfish では、いくつかの制限付きで TOP N PERCENT 句がサポートされています。SELECT オペレーションはサポートされていますが、TOP N PERCENT を使用した UPDATE、DELETE、INSERT オペレーションはサポートされていません。WITH TIES オプションと TOP 句内のサブクエリもサポートされていません。式の値が 100 を超えると、動作が異なります。
  + SQL Server の場合 – エラーをスローします。
  + Babelfish の場合 – 値を有効として扱い、結果を返します。
+ **スキーマの作成、所有権、およびアクセス許可** — 非 DBO ユーザーによって所有されるスキーマ内のオブジェクトを (`CREATE SCHEMA schema name AUTHORIZATION user name` を使用して) 作成およびアクセスするためのアクセス許可は、次の表に示すように、SQL Server および Babelfish の非 DBO ユーザーでは異なります。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/babelfish-compatibility.tsql.limited-implementation.html)
+ **CREATE OR ALTER VIEW / ALTER VIEW 構文** – Babelfish でのこれらの構文のサポートには、次の制限があります。
  + これらのステートメントは、INSTEAD-OF トリガーがアタッチされたビューでは使用できません。
  + これらのステートメントは、このビューに基づく別のビューを持つビューでは使用できません。