

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用具有限制實作的 Babelfish 功能
<a name="babelfish-compatibility.tsql.limited-implementation"></a>

Babelfish 的每個新版本都會增加對功能的支援，這些功能與 T-SQL 功能和行為更為一致。儘管如此，目前的實作中仍存在一些不受支援的功能和差異。您可以在以下內容找到有關 Babelfish 和 T-SQL 之間功能差異的資訊，以及一些解決方法或使用說明。

從 Babelfish 1.2.0 版起，以下功能目前具有限制的實作：
+ **SQL 伺服器目錄 (系統檢視)** — 目錄 `sys.sysconfigures`、`sys.syscurconfigs` 以及 `sys.configurations` 僅支持單一唯讀組態。目前不支援 `sp_configure`。如需 Babelfish 實作的其他 SQL Server 檢視的詳細資訊，請參閱 [從 Babelfish 系統目錄取得資訊](babelfish-query-database.md)。
+ **GRANT 許可** — 支持 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` 從預設值 (嚴格) 變更為 `ignore`。ROWVERSION 和 TIMESTAMP 資料類型的 Babelfish 實作在語義上與 SQL Server 大多相同，但有以下例外：
  + 內建 @@DBTS 函數的行為與 SQL Server 類似，但有些微差異。Babelfish 不會傳回 `SELECT @@DBTS` 其上次使用的值，而是產生新的時間戳記，這是因為基礎 PostgreSQL 資料庫引擎及其多版本並行控制 (MVCC) 實作之故。
  + 在 SQL Server 中，每個插入或更新的行都會獲得唯一的 ROWVERSION/TIMESTAMP 值。在 Babelfish 中，由同一陳述式更新的每個插入行都會被指派相同的 ROWVERSION/TIMESTAMP 值。

    例如，當 UPDATE 陳述式或 INSERT-SELECT 陳述式影響多行時，在 SQL Server 中，受影響的行在其 ROWVERSION/TIMESTAMP 列中都具有不同的值。在 Babelfish (PostgreSQL) 中，行具有相同的值。
  + 在 SQL Server 中，當您使用 SELECT-INTO 建立新資料表時，可以將明確值 (如 NULL) 轉換為要建立的 ROWVERSION/TIMESTAMP 列。當您在 Babelfish 中做同樣的事情時，Babelfish 會將一個實際的 ROWVERSION/TIMESTAMP 值指派給新資料表中的每一行。

  ROWVERSION/TIMESTAMP 資料類型中的這些小差異不會對在 Babelfish 上執行的應用程式產生負面影響。
+ **TOP N PERCENT 子句** – Babelfish 支援具有某些限制的 TOP N PERCENT 子句。不支援具有 TOP N PERCENT 的 UPDATE、DELETE 和 INSERT 操作時，支援 SELECT 操作。也不支援 TOP 子句中的 WITH TIES 選項和子查詢。當表達式值超過 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/zh_tw/AmazonRDS/latest/AuroraUserGuide/babelfish-compatibility.tsql.limited-implementation.html)
+ **CREATE OR ALTER VIEW / ALTER VIEW 語法**：Babelfish 中對這些語法的支援有下列限制：
  + 無法在已連接 INSTEAD-OF 觸發條件的檢視上使用這些陳述式。
  + 若某些檢視具有其他檢視 (以此檢視為基礎)，則無法在那些檢視上使用這些陳述式。