在 適用於 PostgreSQL 的 Azure 資料庫 中使用 azure_storage 擴充功能匯入和匯出數據 - 彈性伺服器
適用於: 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器
azure_storage延伸模組可讓您直接在 Azure 儲存體 帳戶與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的實例之間匯入或導出多個檔案格式的數據。
您可以使用此延伸模組來匯出和匯入數據的範例, 請參閱本文的<範例 >一節。
若要在 azure_storage
適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例上使用擴充功能,您必須將擴充功能新增至 shared_preload_libraries
,並將它新增至azure.extensions
伺服器參數,如如何使用 PostgreSQL 擴充功能中所述。
因為 shared_preload_library
是靜態伺服器參數,所以需要重新啟動伺服器,變更才會生效。
伺服器重新啟動后,請使用喜好設定的用戶端連線到 PostgreSQL 實例(例如 psql、pgAdmin 等)。 確認SHOW azure.extensions;
、 和 SHOW shared_preload_libraries;
都包含 每個語句所SHOW
傳回之逗號分隔值清單中的值azure_storage
。
您只能藉由連線到目標資料庫並執行 CREATE EXTENSION 語句來安裝擴充功能。 您必須針對要讓擴充功能可供使用的每個資料庫個別重複命令。
CREATE EXTENSION azure_storage;
程式概觀
- 識別您想要擴充功能使用者
azure_storage
與其互動的 Azure 儲存體 帳戶。 - 決定您要針對每個 Azure 儲存體 帳戶之 Blob 服務提出的要求使用的授權類型。
azure_storage
擴充功能支援 使用共用密鑰進行授權,以及 具有 Microsoft Entra 識別碼的授權。 在這兩種類型的授權中,Microsoft Entra ID 提供優於共用密鑰的安全性和易於使用,而且是建議的一種Microsoft。 若要符合每個案例所需的必要條件,請遵循對應章節中的指示:- 具有Microsoft項目標識符的授權,或
- 使用共用金鑰進行授權。
- 包含在
azure_storage
中shared_preload_libraries
:
- 包含在
azure_storage
中azure.extensions
:
- 使用您喜好設定的用戶端(例如 psql、pgAdmin 等),聯機到您實例 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中的任何資料庫。 若要建立所有 SQL 物件(數據表、類型、函式、檢視等),您可以使用
azure_storage
擴充功能來與 Azure 儲存體 帳戶的實例互動,請執行下列語句:CREATE EXTENSION azure_storage;
- 使用函
azure_storage.account_*
式,將參考新增至您想要讓 PostgreSQL 使用者或角色使用azure_storage
延伸模組存取的 Azure 儲存體 帳戶。 這些參考包括所參考 Azure 儲存體 帳戶的名稱,以及與 Azure 儲存體 帳戶互動時要使用的驗證類型。 視選取的驗證類型而定,您可能也需要提供一些其他參數,例如 Azure 儲存體 帳戶存取密鑰或 SAS 令牌。
重要
針對您必須提供 Azure 儲存體 帳戶存取金鑰的驗證類型,請注意,您的 Azure 儲存體 存取密鑰類似於記憶體帳戶的根密碼。 請務必小心保護它們。 使用 Azure Key Vault,以安全的方式管理及輪替金鑰。 azure_storage
擴充功能會將這些索引鍵儲存在可由角色成員讀取的數據表 azure_storage.accounts
中 pg_read_all_data
。
獲 azure_storage_admin
授與角色的使用者可以使用下列函式與 azure_storage.accounts
數據表互動:
- azure_storage.account_add
- azure_storage.account_list
- azure_storage.account_remove
- azure_storage.account_user_add
- azure_storage.account_user_remove
根據預設,角色 azure_storage_admin
會授與角色 azure_pg_admin
。
若要搭配 Microsoft Entra 識別碼使用授權
- 在啟用系統指派的受控識別之後,重新啟動 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的實例。
- 在 Azure 儲存體 帳戶上,將角色型訪問控制 (RBAC) 許可權指派給 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的實例系統指派受控識別,以存取 Blob 數據。
若要搭配共用金鑰使用授權
- 您的 Azure 儲存體 帳戶必須啟用 [允許記憶體帳戶密鑰存取] (也就是說,它不能將其 AllowSharedKeyAccess 屬性設定為 false)。
- 若要將它傳遞至 azure_storage.account_add 函式,請擷取 Azure 儲存體 帳戶的兩個存取密鑰之一。
函式
azure_storage.account_add
允許將記憶體帳戶及其相關聯的存取金鑰新增至擴充功能可以存取的記憶體帳戶 azure_storage
清單的函式。
如果先前叫用此函式已新增此記憶體帳戶的參考,則不會新增專案,而是更新現有專案的存取密鑰。
注意
此函式不會驗證參考帳戶名稱是否存在,或是否可使用提供的存取密鑰來存取。 不過,它會根據對 Azure 記憶體帳戶所強加的命名驗證規則,驗證記憶體帳戶的名稱是否有效。
azure_storage.account_add(account_name_p text, account_key_p text);
此函式有多載版本,可接受account_config
封裝所參考 Azure 儲存體 帳戶名稱的參數,以及驗證類型、帳戶類型或記憶體認證等所有必要的設定。
azure_storage.account_add(account_config jsonb);
權限
必須是的成員 azure_storage_admin
。
引數
account_name_p
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
account_key_p
text
儲存體帳戶的其中一個存取金鑰值。 您的 Azure Blob 記憶體存取金鑰類似於記憶體帳戶的根密碼。 請務必小心保護您的存取金鑰。 使用 Azure Key Vault,以安全的方式管理及輪替金鑰。 帳戶金鑰會儲存在只能由超級使用者存取的數據表中。 獲 azure_storage_admin
授與角色的用戶可透過函式與此數據表互動。 若要查看新增的記憶體帳戶,請使用 函式 azure_storage.account_list。
account_config
jsonb
Azure 儲存體 帳戶的名稱,以及驗證類型、帳戶類型或記憶體認證等所有必要的設定。 建議您使用公用程式函 式 azure_storage.account_options_managed_identity、 azure_storage.account_options_credentials 或 azure_storage.account_options 來建立任何必須傳遞為這個自變數的有效值。
傳回類型
VOID
azure_storage.account_options_managed_identity
做為公用程式函式的函式,可在 azure_storage.account_add 內呼叫為參數,而且在使用系統指派的受控識別來與 Azure 儲存體 帳戶互動時,產生自變數的有效值account_config
很有用。
azure_storage.account_options_managed_identity(name text, type azure_storage.storage_type);
權限
任何使用者或角色都可以叫用此函式。
引數
name
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
type
azure_storage.storage_type
支援的其中一種記憶體類型值。 只有支援的值是 blob
。
傳回類型
jsonb
azure_storage.account_options_credentials
做為公用程式函式的函式,可在 azure_storage.account_add 內呼叫為參數,而且在使用 Azure 儲存體 存取密鑰與 Azure 儲存體 帳戶互動時,對自變數產生有效值account_config
很有用。
azure_storage.account_options_credentials(name text, credentials text, type azure_storage.storage_type);
權限
任何使用者或角色都可以叫用此函式。
引數
name
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
credentials
text
儲存體帳戶的其中一個存取金鑰值。 您的 Azure Blob 記憶體存取金鑰類似於記憶體帳戶的根密碼。 請務必小心保護您的存取金鑰。 使用 Azure Key Vault,以安全的方式管理及輪替金鑰。 帳戶金鑰會儲存在只能由超級使用者存取的數據表中。 獲 azure_storage_admin
授與角色的用戶可透過函式與此數據表互動。 若要查看新增的記憶體帳戶,請使用 函式 azure_storage.account_list。
type
azure_storage.storage_type
支援的其中一種記憶體類型值。 只有支援的值是 blob
。
傳回類型
jsonb
azure_storage.account_options
做為公用程式函式的函式,可在 azure_storage.account_add 內呼叫為參數,而且在使用 Azure 儲存體 存取密鑰或系統指派的受控識別來與 Azure 儲存體 帳戶互動時,對自變數產生有效的值account_config
很有用。
azure_storage.account_options(name text, auth_type azure_storage.auth_type, storage_type azure_storage.storage_type, credentials text DEFAULT NULL);
權限
任何使用者或角色都可以叫用此函式。
引數
name
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
auth_type
azure_storage.auth_type
支援的其中一種記憶體類型值。 只有支援的值是 access-key
、 與 managed-identity
。
storage_type
azure_storage.storage_type
支援的其中一種記憶體類型值。 只有支援的值是 blob
。
credentials
text
儲存體帳戶的其中一個存取金鑰值。 您的 Azure Blob 記憶體存取金鑰類似於記憶體帳戶的根密碼。 請務必小心保護您的存取金鑰。 使用 Azure Key Vault,以安全的方式管理及輪替金鑰。 帳戶金鑰會儲存在只能由超級使用者存取的數據表中。 獲 azure_storage_admin
授與角色的用戶可透過函式與此數據表互動。 若要查看新增的記憶體帳戶,請使用 函式 azure_storage.account_list。
傳回類型
jsonb
azure_storage.account_remove
函式,允許從擴充功能可存取的記憶體帳戶清單中移除記憶體帳戶 azure_storage
及其相關聯的存取密鑰。
azure_storage.account_remove(account_name_p text);
權限
必須是的成員 azure_storage_admin
。
引數
account_name_p
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
傳回類型
VOID
azure_storage.account_user_add
允許透過延伸模組所提供的函式,授與PostgreSQL使用者或角色存取記憶體帳戶的 azure_storage
函式。
注意
只有在記憶體帳戶的名稱作為第一個自變數傳遞時,才成功執行此函式,它已使用 azure_storage.account_add 建立,而且如果使用者或角色的名稱傳遞為第二個自變數,則已經存在。
azure_storage.account_add(account_name_p text, user_p regrole);
權限
必須是的成員 azure_storage_admin
。
引數
account_name_p
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
user_p
regrole
伺服器上可用的PostgreSQL使用者或角色名稱。
傳回類型
VOID
azure_storage.account_user_remove
允許透過擴充功能所提供的函式,撤銷PostgreSQL使用者或角色存取記憶體帳戶的 azure_storage
函式。
注意
只有在使用 azure_storage.account_add 建立名稱為第一個自變數的記憶體帳戶,而且名稱傳遞為第二個自變數的使用者或角色仍然存在時,此函式的執行才會成功。
當使用者或角色從伺服器卸除時,藉由執行 DROP USER | ROLE
,系統也會自動排除任何 Azure 儲存體 帳戶參考上授與的許可權。
azure_storage.account_user_remove(account_name_p text, user_p regrole);
權限
必須是的成員 azure_storage_admin
。
引數
account_name_p
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
user_p
regrole
伺服器上可用的PostgreSQL使用者或角色名稱。
傳回類型
VOID
azure_storage.account_list
函式會列出透過 azure_storage.account_add 函式所設定的記憶體帳戶名稱,以及授與許可權的 PostgreSQL 使用者或角色,透過擴充功能所提供的 azure_storage
函式與該記憶體帳戶互動。
azure_storage.account_list();
權限
必須是的成員 azure_storage_admin
。
引數
此函式不會接受任何自變數。
傳回類型
TABLE(account_name text, auth_type azure_storage.auth_type, azure_storage_type azure_storage.storage_type, allowed_users regrole[])
已新增 Azure 儲存體 帳戶清單的四欄數據表、用來與每個帳戶互動的驗證類型、記憶體類型,以及獲授與其存取權的PostgreSQL使用者或角色清單。
azure_storage.blob_list
此函式會列出儲存在所參考記憶體帳戶指定容器中 Blob 的名稱和其他屬性(size、lastModified、eTag、contentType、contentEncoding 和 contentHash)。
azure_storage.blob_list(account_name text, container_name text, prefix text DEFAULT ''::text);
權限
叫用此函式的使用者或角色必須藉由執行 azure_storage.account_user_add,新增至所參考的允許清單account_name
。 azure_storage_admin
的成員會自動允許參考使用 azure_storage.account_add 新增其參考的所有 Azure 儲存體 帳戶。
引數
account_name
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
container_name
text
容器的名稱。 容器會組織一組 Blob,類似於檔案系統中的目錄。 儲存體帳戶可以包含無限數量的容器,而一個容器則可儲存無限數量的 Blob。
容器名稱必須是有效的域名系統(DNS)名稱,因為它會形成用來尋址容器或其 Blob 的唯一 URI 的一部分。
命名容器時,請務必遵循 這些規則。
容器的 URI 類似於: https://myaccount.blob.core.windows.net/mycontainer
prefix
text
指定時,函式會傳回名稱開頭為此參數中提供值的 Blob。 預設為空字串。
傳回類型
TABLE(path text, bytes bigint, last_modified timestamp with time zone, etag text, content_type text, content_encoding text, content_hash text)
每個 Blob 傳回一筆記錄的數據表,包括 Blob 的完整名稱,以及一些其他屬性。
path
text
Blob 的完整名稱。
bytes
bigint
以位元組為單位的 Blob 大小。
last_modified
timestamp with time zone
上次修改 Blob 的日期和時間。 修改 Blob 的任何作業 (包括 Blob 更新的中繼資料或屬性),都會變更 Blob 上次修改的時間。
etag
text
ETag 屬性用於更新期間的開放式並行存取。 它不是時間戳,因為有另一個稱為 Timestamp 的屬性會儲存上次更新記錄的時間。 例如,如果您載入實體並想要更新它,ETag 必須符合目前儲存的內容。 設定適當的 ETag 很重要,因為如果您有多個使用者編輯相同的專案,則不希望他們覆寫彼此的變更。
content_type
text
為 Blob 指定的內容類型。 預設內容型態為 application/octet-stream
。
content_encoding
text
Azure 儲存體 Blob 的 Content-Encoding 屬性可讓您定義。 針對壓縮的內容,您可以將 屬性設定為 Gzip。 當瀏覽器存取內容時,它會自動解壓縮內容。
content_hash
text
用來驗證傳輸期間 Blob 完整性的哈希。 指定此標頭時,記憶體服務會使用從內容計算的哈希來檢查提供的哈希。 如果兩個哈希不相符,作業會失敗,錯誤碼為 400 (不正確的要求)。
azure_storage.blob_get
允許匯入數據的函式。 它會從 Azure 儲存體 帳戶中的 Blob 容器下載一或多個檔案。 然後,它會將內容轉譯成數據列,這些數據列可以使用SQL語言建構來取用和處理。 此函式新增了在匯入 Blob 容器之前篩選及操作從 Blob 容器擷取的數據的支援。
注意
在嘗試存取所參考記憶體帳戶的容器之前,此函式會根據 Azure 記憶體帳戶所強加的命名驗證規則,檢查作為自變數傳遞的記憶體帳戶和容器名稱是否有效。 如果其中一個無效,就會引發錯誤。
azure_storage.blob_get(account_name text, container_name text, path text, decoder text DEFAULT 'auto'::text, compression text DEFAULT 'auto'::text, options jsonb DEFAULT NULL::jsonb);
此函式的多載版本可接受 rec
參數,可讓您方便定義輸出格式記錄。
azure_storage.blob_get(account_name text, container_name text, path text, rec anyelement, decoder text DEFAULT 'auto'::text, compression text DEFAULT 'auto'::text, options jsonb DEFAULT NULL::jsonb);
權限
叫用此函式的使用者或角色必須藉由執行 azure_storage.account_user_add,新增至所參考的允許清單account_name
。 azure_storage_admin
的成員會自動允許參考使用 azure_storage.account_add 新增其參考的所有 Azure 儲存體 帳戶。
引數
account_name
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
container_name
text
容器的名稱。 容器會組織一組 Blob,類似於檔案系統中的目錄。 儲存體帳戶可以包含無限數量的容器,而一個容器則可儲存無限數量的 Blob。
容器名稱必須是有效的域名系統(DNS)名稱,因為它會形成用來尋址容器或其 Blob 的唯一 URI 的一部分。
命名容器時,請務必遵循 這些規則。
容器的 URI 類似於: https://myaccount.blob.core.windows.net/mycontainer
path
text
Blob 的完整名稱。
娛樂
anyelement
記錄輸出結構的定義。
解碼器
text
Blob 格式的規格。 可以設為下列任何值:
格式 | Default | 說明 |
---|---|---|
auto |
true |
根據指派給 Blob 名稱的最後一系列字元來推斷值。 如果 Blob 名稱結尾為 .csv 或 .csv.gz ,則會假設 csv 為 。 如果結尾為 .tsv 或 .tsv.gz ,則會假設 tsv 。 如果結尾為 .json 、.json.gz 、、、.txt .xml.gz .xml 、 或 .txt.gz , 則會假設text 為 。 |
csv |
PostgreSQL COPY 所使用的逗號分隔值格式。 | |
tsv |
Tab 分隔值,預設 PostgreSQL COPY 格式。 | |
binary |
二進位 PostgreSQL COPY 格式。 | |
text | xml | json |
包含單一文字值的檔案。 |
壓縮
text
壓縮類型的規格。 可以設為下列任何值:
格式 | Default | 說明 |
---|---|---|
auto |
true |
根據指派給 Blob 名稱的最後一系列字元來推斷值。 如果 Blob 名稱以 結尾 .gz ,則會假設 gzip 。 否則,它會假設 none 。 |
gzip |
強制使用 gzip 譯碼器來解壓縮 Blob。 | |
none |
強制將 Blob 視為不需要解壓縮的 Blob。 |
延伸模組不支援任何其他壓縮類型。
電子商務選項中
jsonb
定義處理自訂標頭、自訂分隔符、逸出字元等的設定。 options
影響此函式的行為的方式,類似於您可以傳遞至 COPY
PostgreSQL 中命令的選項如何影響其行為。
傳回類型
SETOF record
SETOF anyelement
azure_storage.blob_put
允許匯出數據的函式,方法是將檔案上傳至 Azure 儲存體 帳戶中的 Blob 容器。 檔案的內容是從 PostgreSQL 中的數據列產生。
注意
在嘗試存取所參考記憶體帳戶的容器之前,此函式會根據 Azure 記憶體帳戶所強加的命名驗證規則,檢查作為自變數傳遞的記憶體帳戶和容器名稱是否有效。 如果其中一個無效,就會引發錯誤。
azure_storage.blob_put(account_name text, container_name text, path text, tuple record)
RETURNS VOID;
函式有多載版本,其中包含 encoder
參數,可讓您指定編碼器在無法從參數的 path
延伸模組推斷時使用,或當您想要覆寫推斷的編碼器時使用。
azure_storage.blob_put(account_name text, container_name text, path text, tuple record, encoder text)
RETURNS VOID;
函式的多載版本也包含 compression
參數,可讓您指定要在無法從參數延伸 path
模組推斷壓縮時使用,或當您想要覆寫推斷的壓縮時使用。
azure_storage.blob_put(account_name text, container_name text, path text, tuple record, encoder text, compression text)
RETURNS VOID;
函式的多載版本也包含 options
用來處理自定義標頭、自定義分隔符、逸出字元等的參數, options
其運作方式與可在 PostgreSQL 中傳遞至 COPY
命令的選項類似。
azure_storage.blob_put(account_name text, container_name text, path text, tuple record, encoder text, compression text, options jsonb)
RETURNS VOID;
權限
叫用此函式的使用者或角色必須藉由執行 azure_storage.account_user_add,新增至所參考的允許清單account_name
。 azure_storage_admin
的成員會自動允許參考使用 azure_storage.account_add 新增其參考的所有 Azure 儲存體 帳戶。
引數
account_name
text
包含所有物件的 Azure Blob 記憶體帳戶名稱:Blob、檔案、佇列和數據表。 記憶體帳戶提供可從世界各地透過 HTTPS 存取的唯一命名空間。
container_name
text
容器的名稱。 容器會組織一組 Blob,類似於檔案系統中的目錄。 儲存體帳戶可以包含無限數量的容器,而一個容器則可儲存無限數量的 Blob。
容器名稱必須是有效的域名系統(DNS)名稱,因為它會形成用來尋址容器或其 Blob 的唯一 URI 的一部分。
命名容器時,請務必遵循 這些規則。
容器的 URI 類似於: https://myaccount.blob.core.windows.net/mycontainer
path
text
Blob 的完整名稱。
tuple
record
記錄輸出結構的定義。
編碼器
text
Blob 格式的規格。 可以設為下列任何值:
格式 | Default | 說明 |
---|---|---|
auto |
true |
根據指派給 Blob 名稱的最後一系列字元來推斷值。 如果 Blob 名稱結尾為 .csv 或 .csv.gz ,則會假設 csv 為 。 如果結尾為 .tsv 或 .tsv.gz ,則會假設 tsv 。 如果結尾為 .json 、.json.gz 、、、.txt .xml.gz .xml 、 或 .txt.gz , 則會假設text 為 。 |
csv |
PostgreSQL COPY 所使用的逗號分隔值格式。 | |
tsv |
Tab 分隔值,預設 PostgreSQL COPY 格式。 | |
binary |
二進位 PostgreSQL COPY 格式。 | |
text | xml | json |
包含單一文字值的檔案。 |
壓縮
text
壓縮類型的規格。 可以設為下列任何值:
格式 | Default | 說明 |
---|---|---|
auto |
true |
根據指派給 Blob 名稱的最後一系列字元來推斷值。 如果 Blob 名稱以 結尾 .gz ,則會假設 gzip 。 否則,它會假設 none 。 |
gzip |
強制使用 gzip 譯碼器來解壓縮 Blob。 | |
none |
強制將 Blob 視為不需要解壓縮的 Blob。 |
延伸模組不支援任何其他壓縮類型。
電子商務選項中
jsonb
定義處理自訂標頭、自訂分隔符、逸出字元等的設定。 options
影響此函式的行為的方式,類似於您可以傳遞至 COPY
PostgreSQL 中命令的選項如何影響其行為。
傳回類型
VOID
azure_storage.options_csv_get
做為公用程式函式的函式,可在 內 blob_get
呼叫做為參數,而且有助於譯碼 csv 檔案的內容。
azure_storage.options_csv_get(delimiter text DEFAULT NULL::text, null_string text DEFAULT NULL::text, header boolean DEFAULT NULL::boolean, quote text DEFAULT NULL::text, escape text DEFAULT NULL::text, force_not_null text[] DEFAULT NULL::text[], force_null text[] DEFAULT NULL::text[], content_encoding text DEFAULT NULL::text);
權限
任何使用者或角色都可以叫用此函式。
引數
delimiter
text
分隔檔案中每個數據列(行)內之數據行的字元。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY delimiter must be a single one-byte character
。
null_string
text
表示 Null 值的字串。 預設值為文字格式的 \N (反斜杠-N),並以 CSV 格式加上未標記的空字串。 即使您不想區分 Null 與空字串的情況,您仍可能偏好使用文字格式的空字串。
標頭
boolean
旗標,指出檔案是否包含標題行,其中包含檔案中每個數據行的名稱。 在輸出中,初始行包含數據表中的數據行名稱。
引用
text
引用數據值時所要使用的引號字元。 預設值為雙引號。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY quote must be a single one-byte character
。
escape
text
應該出現在符合 QUOTE 值之數據字元之前的字元。 默認值與 QUOTE 值相同(因此,如果引號字元出現在數據中,則會加倍)。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY escape must be a single one-byte character
。
force_not_null
text[]
不符合指定的數據行值與 Null 字串。 在 Null 字串是空的預設值中,這表示空值會讀取為零長度字串,而不是 Null,即使未加上引號也一樣。
force_null
text[]
比對指定的數據行值與 Null 字串相符,即使加上引號,如果找到相符專案,請將值設定為 NULL。 在 Null 字串是空的預設值中,它會將引號空字串轉換成 NULL。
content_encoding
text
編碼所使用之檔案的名稱。 如果省略選項,則會使用目前的用戶端編碼。
傳回類型
jsonb
azure_storage.options_copy
做為公用程式函式的函式,它可以在 內 blob_get
呼叫為參數。 它可作為options_csv_get、options_tsv和options_binary的協助程式函式。
azure_storage.options_copy(delimiter text DEFAULT NULL::text, null_string text DEFAULT NULL::text, header boolean DEFAULT NULL::boolean, quote text DEFAULT NULL::text, escape text DEFAULT NULL::text, force_quote text[] DEFAULT NULL::text[], force_not_null text[] DEFAULT NULL::text[], force_null text[] DEFAULT NULL::text[], content_encoding text DEFAULT NULL::text);
權限
任何使用者或角色都可以叫用此函式。
引數
delimiter
text
分隔檔案中每個數據列(行)內之數據行的字元。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY delimiter must be a single one-byte character
。
null_string
text
表示 Null 值的字串。 預設值為文字格式的 \N (反斜杠-N),並以 CSV 格式加上未標記的空字串。 即使您不想區分 Null 與空字串的情況,您仍可能偏好使用文字格式的空字串。
標頭
boolean
旗標,指出檔案是否包含標題行,其中包含檔案中每個數據行的名稱。 在輸出中,初始行包含數據表中的數據行名稱。
引用
text
引用數據值時所要使用的引號字元。 預設值為雙引號。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY quote must be a single one-byte character
。
escape
text
應該出現在符合 QUOTE 值之數據字元之前的字元。 默認值與 QUOTE 值相同(因此,如果引號字元出現在數據中,則會加倍)。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY escape must be a single one-byte character
。
force_quote
text[]
會強制用於每個指定數據行中所有非 NULL 值的引號。 NULL 輸出絕不會加上引號。 如果指定 * ,則所有資料行都會加上非 NULL 值引號。
force_not_null
text[]
不符合指定的數據行值與 Null 字串。 在 Null 字串是空的預設值中,這表示空值會讀取為零長度字串,而不是 Null,即使未加上引號也一樣。
force_null
text[]
比對指定的數據行值與 Null 字串相符,即使加上引號,如果找到相符專案,請將值設定為 NULL。 在 Null 字串是空的預設值中,它會將引號空字串轉換成 NULL。
content_encoding
text
編碼所使用之檔案的名稱。 如果省略選項,則會使用目前的用戶端編碼。
傳回類型
jsonb
azure_storage.options_tsv
做為公用程式函式的函式,可在 內 blob_get
呼叫做為參數,而且適用於譯碼 tsv 檔案的內容。
azure_storage.options_tsv(delimiter text DEFAULT NULL::text, null_string text DEFAULT NULL::text, content_encoding text DEFAULT NULL::text);
權限
任何使用者或角色都可以叫用此函式。
引數
delimiter
text
分隔檔案中每個數據列(行)內之數據行的字元。 它必須是單一 1 位元組字元。 雖然此函式支援任意數目字元的分隔符,但如果您嘗試使用多個 1 位元組字元,PostgreSQL 會回報錯誤 COPY delimiter must be a single one-byte character
。
null_string
text
表示 Null 值的字串。 預設值為文字格式的 \N (反斜杠-N),並以 CSV 格式加上未標記的空字串。 即使您不想區分 Null 與空字串的情況,您仍可能偏好使用文字格式的空字串。
content_encoding
text
編碼所使用之檔案的名稱。 如果省略選項,則會使用目前的用戶端編碼。
傳回類型
jsonb
azure_storage.options_binary
做為公用程式函式的函式,可在 內 blob_get
呼叫做為參數,而且對於譯碼二進位檔的內容很有用。
azure_storage.options_binary(content_encoding text DEFAULT NULL::text);
權限
任何使用者或角色都可以叫用此函式。
引數
content_encoding
text
編碼所使用之檔案的名稱。 如果省略選項,則會使用目前的用戶端編碼。
傳回類型
jsonb
可能的錯誤
錯誤:azure_storage:許可權不足以執行要求的作業
執行任何與 Azure 儲存體 (或azure_storage.blob_put
) 互動的函式,azure_storage.blob_list
azure_storage.blob_get
且系統指派的受控識別未獲授與適當的數據平面角色或許可權(通常是 azure_storage.blob_put 的記憶體 Blob 數據參與者下限,以及其他兩個函式的記憶體 Blob 數據讀取器下限)。
您可能已經授與最低必要許可權,但它們尚未生效。 在傳播這些許可權之前,可能需要幾分鐘的時間。
錯誤:azure_storage:遺漏記憶體認證
執行任何與 Azure 儲存體 (azure_storage.blob_list
或 azure_storage.blob_get
azure_storage.blob_put
) 互動的函式,以及您想要擴充功能向記憶體帳戶進行驗證的認證時,不會使用 azure_storage.account_add
註冊。
錯誤:azure_storage:連線時發生內部錯誤
當彈性伺服器實例中未啟用系統指派的受控識別時。
錯誤:azure_storage:記憶體認證格式無效
在彈性伺服器的實例上啟用系統指派的受控識別時,但在啟用之後,伺服器尚未重新啟動。
錯誤:azure_storage:不允許目前的使用者 <user_or_role> 使用記憶體帳戶 <storage_account>
執行與 Azure 儲存體 (azure_storage.blob_list
或azure_storage.blob_put
) 互動的任何函式時,azure_storage.blob_get
使用者或角色不是 azure_storage_admin
成員,且未使用 來授與許可權,以使用 azure_storage.account_user_add
參考的記憶體帳戶。
範例
您必須先符合下列必要條件,才能執行下列範例:
- 建立 Azure 儲存體帳戶。
若要建立 Azure 儲存體 帳戶,如果您還沒有帳戶,請自定義 、
<location>
、<storage_account>
和<blob_container>
的值<resource_group>
,然後執行下列 Azure CLI 命令:resource_group=<resource_group> location=<location> storage_account=<storage_account> blob_container=<blob_container> az group create --name $resource_group --location $location az storage account create --resource-group $resource_group --name $storage_account --location $location --sku Standard_LRS --kind BlobStorage --public-network-access enabled --access-tier hot
- 建立 Blob 容器。
若要建立 Blob 容器,請執行下列 Azure CLI:
az storage container create --account-name $storage_account --name $blob_container -o tsv
- 擷取指派給記憶體帳戶的兩個存取密鑰之一。 請務必複製access_key的值,因為您需要將它當做自變數傳遞至 後續步驟中的 azure_storage.account_add 。
若要擷取兩個存取金鑰中的第一個,請執行下列 Azure CLI 命令:
access_key=$(az storage account keys list --resource-group $resource_group --account-name $storage_account --query [0].value) echo "Following is the value of your access key:" echo $access_key
- 使用範例期間使用的數據集下載檔案,並將它上傳至您的 Blob 容器。
若要使用資料集下載檔案,請執行下列 Azure CLI 命令:
mkdir --parents azure_storage_examples cd azure_storage_examples curl -O https://examples.citusdata.com/tutorial/events.csv gzip -k events.csv cp events.csv events_blob_without_extension cp events.csv events_pipe.csv cp events.csv.gz events_compressed sed -i 's/,/|/g' events_pipe.csv az storage blob upload-batch --account-name $storage_account --destination $blob_container --source . --pattern "events*" --account-key $access_key --overwrite --output none --only-show-errors
注意
您可以使用 azure_storage.account_user_add,列出儲存在其中的容器或 Blob,但只有當 PostgreSQL 使用者或角色在參考該記憶體帳戶的許可權時,才會列出儲存在其中的 Blob。 角色的成員azure_storage_admin
會針對已使用 azure_storage.account_add 新增的所有 Azure 儲存體 帳戶授與此許可權。 根據預設,只有的成員 azure_pg_admin
會被授與 azure_storage_admin
角色。
建立載入數據的數據表
讓我們建立數據表,我們將上傳至記憶體帳戶的 CSV 檔案內容匯入其中。 若要這樣做,請使用 PgAdmin
、 psql
或您喜好設定的用戶端,連線到您 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的實例,然後執行下列語句:
CREATE TABLE IF NOT EXISTS events
(
event_id bigint
,event_type text
,event_public boolean
,repo_id bigint
,payload jsonb
,repo jsonb
,user_id bigint
,org jsonb
,created_at timestamp without time zone
);
新增記憶體帳戶的存取金鑰
此範例說明如何新增儲存體帳戶的參考,以及該儲存體帳戶的存取密鑰,這些金鑰是透過您實例中擴充功能在 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器中提供的azure_storage
擴充功能存取其內容所需的金鑰。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
同樣地, <access_key>
必須設定為您從記憶體帳戶擷取的值。
SELECT azure_storage.account_add('<storage_account>', '<access_key>');
提示
如果您想要從 Azure 入口網站 擷取記憶體帳戶名稱和其中一個存取密鑰,請在資源功能表中選取 [存取金鑰],複製 [記憶體帳戶名稱],然後從 key1 區段複製 [金鑰] 區段(您必須先選取 [顯示金鑰] 旁的 [顯示]。
拿掉記憶體帳戶的參考
此範例說明如何移除記憶體帳戶的任何參考,讓目前資料庫中沒有任何使用者可以使用 azure_storage
擴充功能來存取該儲存器帳戶。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
SELECT azure_storage.account_remove('<storage_account>');
在 Azure Blob 記憶體參考上授與使用者或角色的存取權
此範例說明如何授與名為 <regular_user>
之使用者或角色的存取權,讓這類 PostgreSQL 使用者可以使用 azure_storage
擴充功能來存取所參考 Azure 儲存器帳戶所裝載之容器中儲存的 Blob。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<regular_user>
必須設定為現有使用者或角色的名稱。
SELECT * FROM azure_storage.account_user_add('<storage_account>', '<regular_user>');
列出 Azure 記憶體帳戶的所有參考
此範例說明如何找出擴充功能可以參考的 Azure 記憶體帳戶 azure_storage
,以及用來存取每個記憶體帳戶的驗證類型,以及哪些使用者或角色是透過 azure_storage.account_user_add 函式授與許可權,透過擴充功能存取該 Azure 記憶體帳戶。
SELECT * FROM azure_storage.account_list();
撤銷 Azure Blob 記憶體參考上使用者或角色的存取權
此範例說明如何撤銷名為 <regular_user>
的使用者或角色的存取權,讓這類 PostgreSQL 用戶無法使用 azure_storage
擴充功能來存取存放在所參考 Azure 儲存體帳戶所裝載容器中的 Blob。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<regular_user>
必須設定為現有使用者或角色的名稱。
SELECT * FROM azure_storage.account_user_remove('<storage_account>', '<regular_user>');
列出容器中的所有 Blob
此範例說明如何在記憶體帳戶 <storage_account>
容器<container_name>
內列出所有現有的 Blob。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT * FROM azure_storage.blob_list('<storage_account>','<blob_container>');
列出具有特定 Blob 名稱前置詞的物件
此範例說明如何列出記憶體帳戶<storage_account>
容器<blob_container>
內的所有現有 Blob,其 Blob 名稱開頭為 <blob_name_prefix>
。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
<blob_name_prefix>
應該設定為您想要列舉 Blob 在其名稱中包含的任何前置詞。 如果您想要傳回所有 Blob,您可以將此參數設定為空字串,或甚至不指定此參數的值,在此情況下,值會預設為空字串。
SELECT * FROM azure_storage.blob_list('<storage_account>','<blob_container>','<blob_name_prefix>');
或者,您可以使用下列語法:
SELECT * FROM azure_storage.blob_list('<storage_account>','<blob_container>') WHERE path LIKE '<blob_name_prefix>%';
從容器中的 Blob 讀取內容
函blob_get
式會擷取記憶體參考容器<blob_container>
中一個特定 Blob 的內容(events.csv
在此案例中為 <storage_account>
)。 為了 blob_get
知道如何剖析數據,您可以在窗體 NULL::table_name
中傳遞值,其中 table_name
是指架構符合所讀取 Blob 的數據表。 在此範例中,它會參考我們在一開始建立的 events
數據表。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
<blob_name_prefix>
應該設定為您想要列舉 Blob 在其名稱中包含的任何前置詞。 如果您想要傳回所有 Blob,您可以將此參數設定為空字串,或甚至不指定此參數的值,在此情況下,值會預設為空字串。
SELECT * FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events.csv'
, NULL::events)
LIMIT 5;
或者,您可以在 blob_get 函式之後,使用 AS
子句明確定義結果的架構。
SELECT * FROM azure_storage.blob_get('<storage_account>','<blob_container>','events.csv.gz')
AS res (
event_id BIGINT
,event_type TEXT
,event_public BOOLEAN
,repo_id BIGINT
,payload JSONB
,repo JSONB
,user_id BIGINT
,org JSONB
,created_at TIMESTAMP WITHOUT TIME ZONE)
LIMIT 5;
使用譯碼器選項
此範例說明 選項的使用 decoder
。 通常格式是從檔案的擴展名推斷,但是當檔案內容沒有相符的擴展名時,您可以傳遞譯碼器自變數。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT * FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events_blob_without_extension'
, NULL::events
, decoder := 'csv')
LIMIT 5;
搭配譯碼器選項使用壓縮
此範例示範如何在名稱不是以.gz延伸模組結尾的 gzip 壓縮 Blob 上強制執行 gzip 壓縮。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT * FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events_compressed'
, NULL::events
, decoder := 'csv'
, compression := 'gzip')
LIMIT 5;
從 csv 格式物件載入之前,先匯入篩選的內容和修改
此範例說明在載入 SQL 資料表之前,篩選和修改從 Blob 匯入的內容的可能性。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT concat('P-',event_id::text) FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events.csv'
, NULL::events)
WHERE event_type='PushEvent'
LIMIT 5;
使用標頭、自定義分隔符、逸出字元從檔案查詢內容
此範例說明如何將options_copy的結果傳遞至 options
自變數,以使用自定義分隔符和逸出字元。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT * FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events_pipe.csv'
,NULL::events
,options := azure_storage.options_csv_get(delimiter := '|' , header := 'true')
);
Blob 內容的匯總查詢
此範例說明如何針對儲存在 Blob 容器中的資訊執行匯總作業,而不需要將 Blob 的內容匯入 PostgreSQL 數據表。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT event_type, COUNT(*) FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events.csv'
, NULL::events)
GROUP BY event_type
ORDER BY 2 DESC
LIMIT 5;
使用 COPY 語句匯入數據
下列範例示範透過 COPY
命令,從位於 events.csv
Azure 儲存體 帳戶<storage_account>
中 Blob 容器的 Blob 匯<blob_container>
入資料:
建立符合來源檔案架構的數據表:
CREATE TABLE IF NOT EXISTS events ( event_id bigint ,event_type text ,event_public boolean ,repo_id bigint ,payload jsonb ,repo jsonb ,user_id bigint ,org jsonb ,created_at timestamp without time zone );
使用
COPY
陳述式將資料複製到目標資料表。 指定第一個數據列包含數據行標頭。COPY events FROM 'https://<storage_account>.blob.core.windows.net/<blob_container>/events.csv' WITH (FORMAT 'csv', header);
將內容寫入容器中的 Blob
函blob_put
式會撰寫一個特定 Blob 的內容(eventscopy.csv
在此案例中),並將它上傳至記憶體的<storage_account>
參考容器<blob_container>
。 此範例會使用 blob_get
建構一組五個數據列,然後傳遞至 blob_put
聚合函數,以名為 eventscopy.csv
的 Blob 上傳它們。
<storage_account>
必須設定為記憶體帳戶的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 storage_account 環境變數的任何值。
<blob_container>
必須設定為 Blob 容器的名稱。 如果您使用先前的腳本,此值應該符合您在這些腳本中設定為 blob_container 環境變數的任何值。
SELECT azure_storage.blob_put
('<storage_account>'
,'<blob_container>'
,'eventscopy.csv'
, top_5_events)
FROM (SELECT * FROM azure_storage.blob_get
('<storage_account>'
,'<blob_container>'
,'events.csv'
, NULL::events) LIMIT 5) AS top_5_events;
使用 COPY 語句匯出數據
下列範例示範透過 命令,將數據從名為events
的數據表匯出至events_exported.csv
位於 Azure 儲存體 帳戶<storage_account>
COPY
中 Blob 容器<blob_container>
中的 Blob:
建立符合來源檔案架構的數據表:
CREATE TABLE IF NOT EXISTS events ( event_id bigint ,event_type text ,event_public boolean ,repo_id bigint ,payload jsonb ,repo jsonb ,user_id bigint ,org jsonb ,created_at timestamp without time zone );
將數據載入數據表。 執行 INSERT 語句來填入數個綜合數據列,或使用 COPY 語句 範例匯入數據,以範例數據集的內容填入數據。
使用
COPY
陳述式將資料複製到目標資料表。 指定第一個數據列包含數據行標頭。COPY events TO 'https://<storage_account>.blob.core.windows.net/<blob_container>/events_exported.csv' WITH (FORMAT 'csv', header);
與 適用於 PostgreSQL 的 Azure 資料庫 產品小組分享您的建議和 Bug。
相關內容
- 在 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中使用 Azure 儲存體 匯入和匯出數據。
- 在 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中管理 PostgreSQL 擴充功能。