sp_invoke_external_rest_endpoint(Transact-SQL)

적용 대상: Azure SQL Database

저장 프로시저는 sp_invoke_external_rest_endpoint 프로시저에 대한 입력 인수로 제공된 HTTPS REST 엔드포인트를 호출합니다.

구문

Transact-SQL 구문 표기 규칙

EXEC @returnValue = sp_invoke_external_rest_endpoint
  [ @url = ] N'url'
  [ , [ @payload = ] N'request_payload' ]
  [ , [ @headers = ] N'http_headers_as_json_array' ]
  [ , [ @method = ] 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' ]
  [ , [ @timeout = ] seconds ]
  [ , [ @credential = ] credential ]
  [ , @response OUTPUT ]

인수

[ @url = ] N'url'

호출할 HTTPS REST 엔드포인트의 URL입니다. @url 기본값이 없는 nvarchar(4000)입니다.

[ @payload = ] N'request_payload'

HTTPS REST 엔드포인트로 보낼 페이로드가 포함된 JSON, XML 또는 TEXT 형식의 유니코드 문자열입니다. 페이로드는 유효한 JSON 문서, 올바른 형식의 XML 문서 또는 텍스트여야 합니다. @payload 기본값이 없는 nvarchar(max)입니다.

[ @headers = ] N'headers'

요청의 일부로 HTTPS REST 엔드포인트로 보내야 하는 헤더입니다. 플랫 JSON(중첩 구조가 없는 JSON 문서) 형식을 사용하여 머리글을 지정해야 합니다. 사용할 수 없는 헤더 이름 목록에 정의된 헤더는 @headers 매개 변수에 명시적으로 전달되더라도 무시됩니다. HTTPS 요청을 시작할 때 해당 값은 삭제되거나 시스템 제공 값으로 바뀝니다.

@headers 매개 변수는 기본값이 없는 nvarchar(4000)입니다.

[ @method = ] N'method'

URL을 호출하는 HTTP 메서드입니다. 다음 값 GETHEADPOSTPUTPATCHDELETE중 하나여야 합니다. @method 기본값으로 nvarchar(6) POST 입니다.

[ @timeout = ]

HTTPS 호출을 실행할 수 있는 시간(초)입니다. 정의된 시간 제한(초) 내에 전체 HTTP 요청 및 응답을 보내고 받을 수 없는 경우 저장 프로시저 실행이 중지되고 예외가 발생합니다. 응답이 수신되었을 때 HTTP 연결이 시작되고 종료되고 포함된 페이로드가 수신되면 시간 제한이 시작됩니다. @timeout 기본값이 30인 양수 smallint입니다. 허용되는 값: 1~230

[ @credential = ] 자격 증명

HTTPS 요청에 인증 정보를 삽입하는 데 사용되는 DATABASE SCOPED CREDENTIAL 개체를 나타냅니다. @credential 기본값이 없는 sysname입니다.

@response 출력

호출된 엔드포인트에서 받은 응답을 지정된 변수에 전달하도록 허용합니다. @response nvarchar(max)입니다.

반환 값

HTTPS 호출이 완료되고 수신된 HTTP 상태 코드가 2xx 상태 코드(Success)인 경우 실행이 반환 0 됩니다. 수신된 HTTP 상태 코드가 2xx 범위에 없는 경우 반환 값은 수신된 HTTP 상태 코드가 됩니다. HTTPS 호출을 전혀 수행할 수 없는 경우 예외가 throw됩니다.

사용 권한

EXECUTE ANY EXTERNAL ENDPOINT 데이터베이스 권한이 필요합니다.

예시:

GRANT EXECUTE ANY EXTERNAL ENDPOINT TO [<PRINCIPAL>];

응답 형식

HTTP 호출 및 호출된 엔드포인트에서 다시 보낸 결과 데이터의 응답은 @response 출력 매개 변수를 통해 사용할 수 있습니다. @response 다음 스키마가 있는 JSON 문서를 포함할 수 있습니다.

{
  "response": {
    "status": {
      "http": {
        "code": "",
        "description": ""
      }
    },
    "headers": {}
  },
  "result": {}
}

특별한 사항

  • 응답: HTTP 결과 및 기타 응답 메타데이터를 포함하는 JSON 개체입니다.
  • 결과: HTTP 호출에서 반환된 JSON 페이로드입니다. 수신된 HTTP 결과가 204(No Content)이면 생략됩니다.

또는 @response 다음 스키마가 있는 XML 문서를 포함할 수 있습니다.

<output>
    <response>
        <status>
            <http code="" description=" " />
        </status>
        <headers>
            <header key="" value="" />
            <header key="" value="" />
        </headers>
    </response>
    <result>
    </result>
</output>

특별한 사항

  • 응답: HTTP 결과 및 기타 응답 메타데이터를 포함하는 XML 개체입니다.
  • 결과: HTTP 호출에서 반환된 XML 페이로드입니다. 수신된 HTTP 결과가 204(No Content)이면 생략됩니다.

response 섹션에서는 HTTP 상태 코드 및 설명을 제외하고 수신된 응답 헤더의 전체 집합이 개체에 headers 제공됩니다. 다음 예제에서는 JSON의 섹션(텍스트 응답의 구조)을 보여 response 줍니다.

"response": {
  "status": {
    "http": {
      "code": 200,
      "description": "OK"
    }
  },
  "headers": {
    "Date": "Thu, 08 Sep 2022 21:51:22 GMT",
    "Content-Length": "1345",
    "Content-Type": "application\/json; charset=utf-8",
    "Server": "Kestrel",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains"
    }
  }

다음 예제에서는 XML의 섹션을 response 보여줍니다.

<response>
    <status>
        <http code="200" description="OK" />
    </status>
    <headers>
        <header key="Date" value="Tue, 01 Apr 1976 21:12:04 GMT" />
        <header key="Content-Length" value="2112" />
        <header key="Content-Type" value="application/xml" />
        <header key="Server" value="Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0" />
        <header key="x-ms-request-id" value="31536000-64bi-64bi-64bi-31536000" />
        <header key="x-ms-version" value="2021-10-04" />
        <header key="x-ms-creation-time" value="Wed, 19 Apr 2023 22:17:33 GMT" />
        <header key="x-ms-server-encrypted" value="true" />
    </headers>
</response>

허용되는 엔드포인트

다음 서비스의 엔드포인트에 대한 호출만 허용됩니다.

Azure 서비스 도메인
Azure 기능 *.azurewebsites.net
Azure 앱 서비스 *.azurewebsites.net
Azure App Service Environment *.appserviceenvironment.net
Azure Static Web Apps *.azurestaticapps.net
Azure Logic Apps *.logic.azure.com
Azure Event Hubs *.servicebus.windows.net
Azure Event Grid *.eventgrid.azure.net
Azure Cognitive Services *.cognitiveservices.azure.com
Azure OpenAI *.openai.azure.com
PowerApps / Dataverse *.api.crm.dynamics.com
Microsoft Dynamics *.dynamics.com
Azure Container Instances *.azurecontainer.io
Azure Container Apps *.azurecontainerapps.io
Power BI api.powerbi.com
Microsoft Graph graph.microsoft.com
Analysis Services *.asazure.windows.net
IoT Central *.azureiotcentral.com
API Management *.azure-api.net
Azure Blob Storage *.blob.core.windows.net
Azure 파일 *.file.core.windows.net
Azure Queue Storage *.queue.core.windows.net
Azure Table Storage *.table.core.windows.net
Azure Communication Services *.communications.azure.com
Bing 검색 api.bing.microsoft.com
Azure Key Vault *.vault.azure.net
Azure AI 검색 *.search.windows.net

아웃바운드 방화벽 규칙 제어 메커니즘을 사용하여 외부 엔드포인트에 대한 아웃바운드 액세스를 추가로 제한할 수 있습니다.

참고 항목

허용된 목록에 없는 REST 서비스를 호출하려는 경우 API Management를 사용하여 원하는 서비스를 안전하게 노출하고 사용할 수 있도록 할 수 있습니다 sp_invoke_external_rest_endpoint.

제한

페이로드 크기

수신 시와 전송 시 모두 페이로드는 유선으로 전송될 때 UTF-8로 인코딩됩니다. 해당 형식의 크기는 100MB로 제한됩니다.

URL 길이

최대 URL 길이(@url 매개 변수를 사용하고 지정된 자격 증명을 쿼리 문자열에 추가한 후 생성됨)는 8KB이고 최대 쿼리 문자열 길이(쿼리 문자열 + 자격 증명 쿼리 문자열)는 4KB입니다.

헤더 크기

최대 요청 및 응답 헤더 크기(모든 헤더 필드: @headers 매개 변수를 통해 전달된 헤더 + 자격 증명 헤더 + 시스템 제공 헤더)는 8KB입니다.

제한

외부 엔드포인트 sp_invoke_external_rest_endpoint 에 대한 동시 연결 수는 작업자 스레드의 10%로 제한되며 최대 150명의 작업자가 있습니다. 단일 데이터베이스에서 제한은 데이터베이스 수준에서 적용되고 탄력적 풀 제한은 데이터베이스 수준과 풀 수준에서 모두 적용됩니다.

데이터베이스가 유지할 수 있는 동시 연결 수를 확인하려면 다음 쿼리를 실행합니다.

SELECT
  [database_name],
  DATABASEPROPERTYEX(DB_NAME(), 'ServiceObjective') AS service_level_objective,
  [slo_name] as service_level_objective_long,
  [primary_group_max_outbound_connection_workers] AS max_database_outbound_connection,
  [primary_pool_max_outbound_connection_workers] AS max_pool_outbound_connection
FROM
  sys.dm_user_db_resource_governance
WHERE
  database_id = DB_ID();

최대 동시 연결에 이미 도달했을 때 외부 엔드포인트에 대한 새 연결을 시도하는 sp_invoke_external_rest_endpoint 경우 오류 10928(또는 탄력적 풀 제한에 도달한 경우 10936)이 발생합니다. 예시:

Msg 10928, Level 16, State 4, Procedure sys.sp_invoke_external_rest_endpoint_internal, Line 1 [Batch Start Line 0]
Resource ID : 1. The outbound connections limit for the database is 20 and has been reached.
See 'https://docs.microsoft.com/azure/azure-sql/database/resource-limits-logical-server' for assistance.

자격 증명

일부 REST 엔드포인트는 제대로 호출되기 위해 인증이 필요합니다. 일반적으로 쿼리 문자열 또는 요청으로 설정된 HTTP 헤더에서 특정 키-값 쌍을 전달하여 인증을 수행할 수 있습니다.

DATABASE SCOPED 자격 증명을 사용하여 보호된 엔드포인트를 호출하는 데 사용할 sp_invoke_external_rest_endpoint 인증 데이터(예: 전달자 토큰)를 안전하게 저장할 수 있습니다. DATABASE SCOPED CREDENTIAL을 만들 때 IDENTITY 매개 변수를 사용하여 호출된 엔드포인트에 전달될 인증 데이터 및 방법을 지정합니다. IDENTITY는 다음 세 가지 옵션을 지원합니다.

  • HTTPEndpointHeaders: 요청 헤더를 사용하여 지정된 인증 데이터 보내기
  • HTTPEndpointQueryString: 쿼리 문자열을 사용하여 지정된 인증 데이터 보내기
  • Managed Identity: 요청 헤더를 사용하여 시스템 할당 관리 ID 보내기
  • Shared Access Signatures (SAS): 서명된 URL을 통해 리소스에 대한 제한된 위임된 액세스 제공

만든 DATABASE SCOPED CREDENTIAL은 @credential 매개 변수를 통해 사용할 수 있습니다.

EXEC sp_invoke_external_rest_endpoint
  @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
  @credential = [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]

이 IDENTITY 값을 사용하면 DATABASE SCOPED CREDENTIAL이 요청 헤더에 추가됩니다. 인증 정보를 포함하는 키-값 쌍은 플랫 JSON 형식을 사용하여 SECRET 매개 변수를 통해 제공해야 합니다. 예시:

CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';

자격 증명 이름 규칙

만든 DATABASE SCOPED CREDENTIAL은 함께 사용 sp_invoke_external_rest_endpoint하려면 특정 규칙을 준수해야 합니다. 규칙은 다음과 같습니다.

  • 반드시 유효한 URI여야 합니다.
  • URL 도메인은 허용 목록에 포함된 도메인 중 하나여야 합니다.
  • URL에 쿼리 문자열이 포함되어서는 안됩니다.
  • 호출된 URL의 프로토콜 + FQDN(정규화된 도메인 이름)은 자격 증명 이름의 프로토콜 + FQDN과 일치해야 합니다.
  • 호출된 URL 경로의 각 부분은 자격 증명 이름에 있는 URL 경로의 각 부분과 완전히 일치해야 합니다.
  • 자격 증명은 요청 URL보다 더 일반적인 경로를 가리킵니다. 예를 들어 경로 https://northwind.azurewebsite.net/customers 에 대해 만든 자격 증명은 URL에 사용할 수 없습니다. https://northwind.azurewebsite.net

데이터 정렬 및 자격 증명 이름 규칙

RFC 3986 섹션 6.2.2.1 은 "URI가 제네릭 구문의 구성 요소를 사용하는 경우 구성 요소 구문 동등 규칙이 항상 적용됩니다. 즉, 스키마와 호스트가 대/소문자를 구분하지 않는다는 것"이고 RFC 7230 섹션 2.7.3 은 "다른 모든 항목은 대/소문자를 구분하는 방식으로 비교된다"고 언급합니다.

데이터베이스 수준에서 데이터 정렬 규칙이 설정되어 있으므로 다음 논리가 적용되어 위에서 언급한 데이터베이스 데이터 정렬 규칙 및 RFC와 일관성을 유지합니다. (예를 들어 데이터베이스가 대/소문자를 구분하는 데이터 정렬을 사용하도록 설정된 경우 설명된 규칙은 RFC 규칙보다 더 제한적일 수 있습니다.)

  1. RFC를 사용하여 URL 및 자격 증명이 일치하는지 확인합니다. 즉, 다음을 의미합니다.
    • 대/소문자를 구분하지 않는 데이터 정렬을 사용하여 구성표 및 호스트 확인(Latin1_General_100_CI_AS_KS_WS_SC)
    • URL의 다른 모든 세그먼트가 대/소문자를 구분하는 데이터 정렬에서 비교되는지 확인합니다(Latin1_General_100_BIN2).
  2. URL 및 자격 증명이 데이터베이스 데이터 정렬 규칙을 사용하여 일치하는지 확인합니다(URL 인코딩을 수행하지 않고).

자격 증명을 사용할 수 있는 권한 부여

DATABASE SCOPED CREDENTIAL에 액세스하는 데이터베이스 사용자에게는 해당 자격 증명을 사용할 수 있는 권한이 있어야 합니다.

자격 증명을 사용하려면 데이터베이스 사용자에게 특정 자격 증명에 대한 권한이 있어야 합니다 REFERENCES .

GRANT REFERENCES ON DATABASE SCOPED CREDENTIAL::[<CREDENTIAL_NAME>] TO [<PRINCIPAL>];

설명

대기 유형

호출된 서비스에 대한 호출이 완료되기를 기다리는 경우 sp_invoke_external_rest_endpoint HTTP_EXTERNAL_CONNECTION 대기 유형을 보고합니다.

HTTPS 및 TLS

TLS 1.2 암호화 프로토콜 이상이 있는 HTTPS를 사용하도록 구성된 엔드포인트만 지원됩니다.

HTTP 리디렉션

sp_invoke_external_rest_endpoint 는 호출된 엔드포인트에서 응답으로 수신된 HTTP 리디렉션을 자동으로 따르지 않습니다.

HTTP 헤더

sp_invoke_external_rest_endpoint 는 HTTP 요청에 다음 헤더를 자동으로 삽입합니다.

  • content-type: 다음으로 설정 application/json; charset=utf-8
  • accept: set to application/json
  • user-agent: 예를 들면 다음과 <EDITION>/<PRODUCT VERSION> 같습니다. SQL Azure/12.0.2000.8

사용자 에이전트는 항상 저장 프로시저에서 덮어쓰지만 콘텐츠 형식수락 헤더 값은 @headers 매개 변수를 통해 사용자가 정의할 수 있습니다. 콘텐츠 형식에서 미디어 형식 지시문만 지정할 수 있으며 문자 집합 또는 경계 지시문을 지정할 수 없습니다.

요청 및 응답 페이로드 지원 미디어 유형

헤더 콘텐츠 형식허용되는 값은 다음과 같습니다.

  • application/json
  • application/vnd.microsoft.*.json
  • application/xml
  • application/vnd.microsoft.*.xml
  • application/vnd.microsoft.*+xml
  • application/x-www-form-urlencoded
  • 문자 메시지/*

accept 헤더의 경우 허용되는 값은 다음과 같습니다.

  • application/json
  • application/xml
  • 문자 메시지/*

텍스트 머리글 형식에 대한 자세한 내용은 IANA텍스트 형식 레지스트리를 참조하세요.

참고 항목

cURL 또는 Insomnia와 같은 최신 REST 클라이언트와 같은 다른 도구를 사용하여 REST 엔드포인트 호출을 테스트하는 경우 동일한 동작과 결과를 갖도록 자동으로 삽입되는 sp_invoke_external_rest_endpoint 동일한 헤더를 포함해야 합니다.

모범 사례

일괄 처리 기술 사용

행 집합을 REST 엔드포인트(예: Azure Function 또는 이벤트 허브)로 보내야 하는 경우 전송된 각 행에 대한 HTTPS 호출 오버헤드를 방지하기 위해 행을 단일 JSON 문서로 일괄 처리하는 것이 좋습니다. 이 작업은 문을 사용하여 FOR JSON 수행할 수 있습니다. 예를 들면 다음과 같습니다.

-- create the payload
DECLARE @payload AS NVARCHAR(MAX);

SET @payload = (
        SELECT [object_id], [name], [column_id]
        FROM sys.columns
        FOR JSON AUTO
        );

-- invoke the REST endpoint
DECLARE @retcode INT,
    @response AS NVARCHAR(MAX);

EXEC @retcode = sp_invoke_external_rest_endpoint @url = '<REST_endpoint>',
    @payload = @payload,
    @response = @response OUTPUT;

-- return the result
SELECT @retcode, @response;

예제

여기서는 Azure Functions 또는 Azure Event Hubs와 같은 일반적인 Azure 서비스와 통합하는 데 사용하는 sp_invoke_external_rest_endpoint 방법에 대한 몇 가지 예제를 찾을 수 있습니다. 다른 서비스와 통합하기 위한 추가 샘플은 GitHub에서 찾을 수 있습니다.

A. 인증 없이 HTTP 트리거 바인딩을 사용하여 Azure Function 호출

다음 예제에서는 익명 액세스를 허용하는 HTTP 트리거 바인딩을 사용하여 Azure Function을 호출합니다.

DECLARE @ret INT, @response NVARCHAR(MAX);

EXEC @ret = sp_invoke_external_rest_endpoint
  @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
  @headers = N'{"header1":"value_a", "header2":"value2", "header1":"value_b"}',
  @payload = N'{"some":{"data":"here"}}',
  @response = @response OUTPUT;

SELECT @ret AS ReturnCode, @response AS Response;

B. 권한 부여 키와 함께 HTTP 트리거 바인딩을 사용하여 Azure Function 호출

다음 예제에서는 권한 부여 키를 요구하도록 구성된 HTTP 트리거 바인딩을 사용하여 Azure Function을 호출합니다. 권한 부여 키는 Azure Functions에서 x-function-key 요구하는 대로 헤더에 전달됩니다. 자세한 내용은 Azure Functions - API 키 권한 부여를 참조 하세요.

CREATE DATABASE SCOPED CREDENTIAL [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>]
WITH IDENTITY = 'HTTPEndpointHeaders', SECRET = '{"x-functions-key":"<your-function-key-here>"}';

DECLARE @ret INT, @response NVARCHAR(MAX);

EXEC @ret = sp_invoke_external_rest_endpoint
  @url = N'https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>?key1=value1',
  @headers = N'{"header1":"value_a", "header2":"value2", "header1":"value_b"}',
  @credential = [https://<APP_NAME>.azurewebsites.net/api/<FUNCTION_NAME>],
  @payload = N'{"some":{"data":"here"}}',
  @response = @response OUTPUT;

SELECT @ret AS ReturnCode, @response AS Response;

C. SAS 토큰을 사용하여 Azure Blob Storage에서 파일의 내용을 읽습니다.

이 예제에서는 인증을 위해 SAS 토큰을 사용하여 Azure Blob Storage에서 파일을 읽습니다. 결과가 XML로 반환되므로 헤더 "Accept":"application/xml" 를 사용해야 합니다.

DECLARE @ret INT, @response NVARCHAR(MAX);

EXEC @ret = sp_invoke_external_rest_endpoint
  @url = N'https://blobby.blob.core.windows.net/datafiles/my_favorite_blobs.txt?sp=r&st=2023-07-28T19:56:07Z&se=2023-07-29T03:56:07Z&spr=https&sv=2022-11-02&sr=b&sig=XXXXXX1234XXXXXX6789XXXXX',
  @headers = N'{"Accept":"application/xml"}',
  @method = 'GET',
  @response = @response OUTPUT;

SELECT @ret AS ReturnCode, @response AS Response;

D. Azure SQL Database 관리 ID를 사용하여 이벤트 허브에 메시지 보내기

이 샘플에서는 Azure SQL 관리 ID를 사용하여 Event Hubs에 메시지를 보내는 방법을 보여 줍니다. 데이터베이스를 호스팅하는 Azure SQL Database 논리 서버에 대한 시스템 관리 ID 를 구성했는지 확인합니다. 예를 들면 다음과 같습니다.

az sql server update -g <resource-group> -n <azure-sql-server> --identity-type SystemAssigned

그런 다음, Azure SQL Server의 관리 ID가 원하는 이벤트 허브에 메시지("Azure Event Hubs 데이터 보낸 사람" 역할)를 보낼 수 있도록 Event Hubs를 구성합니다. 자세한 내용은 관리 ID와 함께 Event Hubs 사용을 참조 하세요.

이 작업이 완료되면 사용할 데이터베이스 범위 자격 증명을 정의할 때 ID 이름을 사용할 Managed Identity 수 있습니다 sp_invoke_external_rest_endpoint. Event Hubs 리소스에 액세스하기 위해 Microsoft Entra ID를 사용하여 애플리케이션 인증에 설명된 대로 Microsoft Entra 인증을 사용할 때 사용할 리소스 이름(또는 ID)은 다음과 같습니다https://eventhubs.azure.net.

CREATE DATABASE SCOPED CREDENTIAL [https://<EVENT-HUBS-NAME>.servicebus.windows.net]
    WITH IDENTITY = 'Managed Identity',
        SECRET = '{"resourceid": "https://eventhubs.azure.net"}';
GO

DECLARE @Id UNIQUEIDENTIFIER = NEWID();
DECLARE @payload NVARCHAR(MAX) = (
        SELECT *
        FROM (
            VALUES (@Id, 'John', 'Doe')
            ) AS UserTable(UserId, FirstName, LastName)
        FOR JSON AUTO,
            WITHOUT_ARRAY_WRAPPER
        )
DECLARE @url NVARCHAR(4000) = 'https://<EVENT-HUBS-NAME>.servicebus.windows.net/from-sql/messages';
DECLARE @headers NVARCHAR(4000) = N'{"BrokerProperties": "' + STRING_ESCAPE('{"PartitionKey": "' + CAST(@Id AS NVARCHAR(36)) + '"}', 'json') + '"}'
DECLARE @ret INT, @response NVARCHAR(MAX);

EXEC @ret = sp_invoke_external_rest_endpoint @url = @url,
    @headers = @headers,
    @credential = [https://<EVENT-HUBS-NAME>.servicebus.windows.net],
    @payload = @payload,
    @response = @response OUTPUT;

SELECT @ret AS ReturnCode, @response AS Response;

E. Azure SQL Database 범위 자격 증명을 사용하여 Azure File Storage에 파일 읽기 및 쓰기

다음은 인증을 위해 Azure SQL Database 범위 자격 증명을 사용하여 Azure File Storage에 파일을 쓴 다음 내용을 반환하는 예제입니다. 결과가 XML로 반환되므로 헤더 "Accept":"application/xml" 를 사용해야 합니다.

먼저 Azure SQL Database에 대한 마스터 키를 만듭니다.

create master key encryption by password = '2112templesmlm2BTS21.qwqw!@0dvd'
go

그런 다음 Azure Blob Storage 계정에서 제공하는 SAS 토큰을 사용하여 데이터베이스 범위 자격 증명을 만듭니다.

create database scoped credential [filestore]
with identity='SHARED ACCESS SIGNATURE',
secret='sv=2022-11-02&ss=bfqt&srt=sco&sp=seespotrun&se=2023-08-03T02:21:25Z&st=2023-08-02T18:21:25Z&spr=https&sig=WWwwWWwwWWYaKCheeseNXCCCCCCDDDDDSSSSSU%3D'
go

다음으로 파일을 만들고 다음 두 문을 사용하여 텍스트를 추가합니다.

declare @payload nvarchar(max) = (select * from (values('Hello from Azure SQL!', sysdatetime())) payload([message], [timestamp])for json auto, without_array_wrapper)
declare @response nvarchar(max), @url nvarchar(max), @headers nvarchar(1000);
declare @len int = len(@payload)

-- Create the File
set @url = 'https://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
set @headers = json_object(
        'x-ms-type': 'file',
        'x-ms-content-length': cast(@len as varchar(9)),
        'Accept': 'application/xml')
exec sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @credential = [filestore],
    @response = @response output
select cast(@response as xml);

-- Add text to the File
set @headers = json_object(
        'x-ms-range': 'bytes=0-' + cast(@len-1 as varchar(9)),
        'x-ms-write': 'update',
        'Accept': 'application/xml');
set @url = 'https://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
set @url += '?comp=range'
exec sp_invoke_external_rest_endpoint
    @url = @url,
    @method = 'PUT',
    @headers = @headers,
    @payload = @payload,
    @credential = [filestore],
    @response = @response output
select cast(@response as xml)
go

마지막으로 다음 문을 사용하여 파일을 읽습니다.

declare @response nvarchar(max);
declare @url nvarchar(max) = 'https://myfiles.file.core.windows.net/myfiles/test-me-from-azure-sql.json'
exec sp_invoke_external_rest_endpoint
    @url = @url,
    @headers = '{"Accept":"application/xml"}',
    @credential = [filestore],
    @method = 'GET',
    @response = @response output
select cast(@response as xml)
go