Functions에 대한 Azure SQL 트리거

참고 항목

사용 계획 함수에서는 SQL 트리거에 대해 자동 크기 조정이 지원되지 않습니다. 자동 크기 조정 프로세스가 함수를 중지하면 이벤트의 모든 처리가 중지되고 수동으로 다시 시작해야 합니다.

SQL 트리거로 이점의 크기를 조정하려면 프리미엄 또는 전용 플랜을 사용합니다.

Azure SQL 트리거는 SQL 변경 내용 추적 기능을 사용하여 SQL 테이블에서 변경 내용을 모니터링하고 행을 만들거나 업데이트하거나 삭제할 때 함수를 트리거합니다. Azure SQL 트리거에 사용할 변경 내용 추적에 대한 구성 세부 정보는 변경 내용 추적 설정을 참조하세요. Azure Functions용 Azure SQL 확장의 설정 세부 정보에 대한 내용은 SQL 바인딩 개요를 참조하세요.

사용량 및 프리미엄 플랜에 대한 Azure SQL 트리거 크기 조정 결정은 대상 기반 크기 조정을 통해 수행됩니다. 자세한 내용은 대상 기반 크기 조정을 참조하세요.

기능 개요

Azure SQL 트리거 바인딩은 폴링 루프를 사용하여 변경 내용을 검사하고 변경 내용이 검색될 때 사용자 함수를 트리거합니다. 개괄적인 루프는 다음과 같습니다.

while (true) {
    1. Get list of changes on table - up to a maximum number controlled by the Sql_Trigger_MaxBatchSize setting
    2. Trigger function with list of changes
    3. Wait for delay controlled by Sql_Trigger_PollingIntervalMs setting
}

변경 내용은 변경된 순서대로 처리되며, 가장 오래된 변경 내용이 먼저 처리됩니다. 변경 처리에 대한 몇 가지 참고 사항:

  1. 여러 행을 한 번에 변경하는 경우 함수로 보내는 정확한 순서는 CHANGETABLE 함수에서 반환되는 순서를 기준으로 합니다.
  2. 변경 내용은 한 행에 대해 함께 "일괄 처리"됩니다. 루프의 각 반복 사이에 행이 여러 번 변경된 경우 해당 행에 대해 마지막으로 처리된 상태와 현재 상태 간의 차이를 표시하는 단일 변경 항목만 존재합니다.
  3. 행 집합을 변경한 다음 동일한 행의 절반에 또 다른 변경 집합을 적용하면 두 번째로 변경되지 않은 행의 절반이 먼저 처리됩니다. 이 처리 논리는 변경 내용이 일괄 처리되는 위의 참고 사항으로 인해 발생합니다. 트리거는 "마지막" 변경 내용만 확인하고 이를 처리하는 순서에 사용합니다.

변경 내용 추적 및 Azure SQL 트리거와 같은 애플리케이션에서 이를 사용하는 방법에 대한 자세한 내용은 변경 내용 추적 작업을 참조하세요.

예제 사용

Azure SQL 트리거에 대한 더 많은 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.

예는 ToDoItem 클래스와 해당 데이터베이스 테이블을 참조하세요.

namespace AzureSQL.ToDo
{
    public class ToDoItem
    {
        public Guid Id { get; set; }
        public int? order { get; set; }
        public string title { get; set; }
        public string url { get; set; }
        public bool? completed { get; set; }
    }
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

변경 내용 추적은 데이터베이스 및 테이블에서 사용하도록 설정됩니다.

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL 트리거는 각각 두 가지 속성이 있는 SqlChange 개체 목록인 IReadOnlyList<SqlChange<T>>에 바인딩됩니다.

  • 항목: 변경된 항목입니다. 항목의 형식은 ToDoItem 클래스에 표시된 대로 테이블 스키마를 따라야 합니다.
  • 작업:SqlChangeOperation 열거형의 값입니다. 가능한 값은 Insert, UpdateDelete입니다.

다음 예제에서는 ToDo 테이블이 변경될 때 호출되는 C# 함수를 보여 줍니다.

using System;
using System.Collections.Generic;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;


namespace AzureSQL.ToDo
{
    public static class ToDoTrigger
    {
        [Function("ToDoTrigger")]
        public static void Run(
            [SqlTrigger("[dbo].[ToDo]", "SqlConnectionString")]
            IReadOnlyList<SqlChange<ToDoItem>> changes,
            FunctionContext context)
        {
            var logger = context.GetLogger("ToDoTrigger");
            foreach (SqlChange<ToDoItem> change in changes)
            {
                ToDoItem toDoItem = change.Item;
                logger.LogInformation($"Change operation: {change.Operation}");
                logger.LogInformation($"Id: {toDoItem.Id}, Title: {toDoItem.title}, Url: {toDoItem.url}, Completed: {toDoItem.completed}");
            }
        }
    }
}

예제 사용

Azure SQL 트리거에 대한 더 많은 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.

이 예에서는 ToDoItem 클래스, SqlChangeToDoItem 클래스, SqlChangeOperation 열거형 및 해당 데이터베이스 테이블을 참조하세요.

별도의 파일 ToDoItem.java에서:

package com.function;
import java.util.UUID;

public class ToDoItem {
    public UUID Id;
    public int order;
    public String title;
    public String url;
    public boolean completed;

    public ToDoItem() {
    }

    public ToDoItem(UUID Id, int order, String title, String url, boolean completed) {
        this.Id = Id;
        this.order = order;
        this.title = title;
        this.url = url;
        this.completed = completed;
    }
}

별도의 파일 SqlChangeToDoItem.java에서:

package com.function;

public class SqlChangeToDoItem {
    public ToDoItem item;
    public SqlChangeOperation operation;

    public SqlChangeToDoItem() {
    }

    public SqlChangeToDoItem(ToDoItem Item, SqlChangeOperation Operation) {
        this.Item = Item;
        this.Operation = Operation;
    }
}

별도의 파일 SqlChangeOperation.java에서:

package com.function;

import com.google.gson.annotations.SerializedName;

public enum SqlChangeOperation {
    @SerializedName("0")
    Insert,
    @SerializedName("1")
    Update,
    @SerializedName("2")
    Delete;
}
CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

변경 내용 추적은 데이터베이스 및 테이블에서 사용하도록 설정됩니다.

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL 트리거는 각각 두 가지 속성이 있는 SqlChangeToDoItem 개체의 배열인 SqlChangeToDoItem[]에 바인딩됩니다.

  • 항목: 변경된 항목입니다. 항목의 형식은 ToDoItem 클래스에 표시된 대로 테이블 스키마를 따라야 합니다.
  • 작업:SqlChangeOperation 열거형의 값입니다. 가능한 값은 Insert, UpdateDelete입니다.

다음 예에서는 ToDo 테이블이 변경될 때 호출되는 Java 함수를 보여 줍니다.

package com.function;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.sql.annotation.SQLTrigger;
import com.function.Common.SqlChangeToDoItem;
import com.google.gson.Gson;

import java.util.logging.Level;

public class ProductsTrigger {
    @FunctionName("ToDoTrigger")
    public void run(
            @SQLTrigger(
                name = "todoItems",
                tableName = "[dbo].[ToDo]",
                connectionStringSetting = "SqlConnectionString")
                SqlChangeToDoItem[] todoItems,
            ExecutionContext context) {

        context.getLogger().log(Level.INFO, "SQL Changes: " + new Gson().toJson(changes));
    }
}

예제 사용

Azure SQL 트리거에 대한 더 많은 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.

이 예에서는 ToDoItem 데이터베이스 테이블을 참조하세요.

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

변경 내용 추적은 데이터베이스 및 테이블에서 사용하도록 설정됩니다.

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL 트리거는 각각 두 가지 속성이 있는 개체 목록인 todoChanges에 바인딩됩니다.

  • 항목: 변경된 항목입니다. 항목의 구조는 테이블 스키마를 따릅니다.
  • 작업: 가능한 값은 Insert, UpdateDelete입니다.

다음 예에서는 ToDo 테이블이 변경될 때 호출되는 PowerShell 함수를 보여 줍니다.

다음은 function.json 파일의 바인딩 데이터입니다.

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

구성 섹션에서는 이러한 속성을 설명합니다.

다음은 run.ps1 파일의 함수에 대한 샘플 PowerShell 코드입니다.

using namespace System.Net

param($todoChanges)
# The output is used to inspect the trigger binding parameter in test methods.
# Use -Compress to remove new lines and spaces for testing purposes.
$changesJson = $todoChanges | ConvertTo-Json -Compress
Write-Host "SQL Changes: $changesJson"

예제 사용

Azure SQL 트리거에 대한 더 많은 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.

이 예에서는 ToDoItem 데이터베이스 테이블을 참조하세요.

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

변경 내용 추적은 데이터베이스 및 테이블에서 사용하도록 설정됩니다.

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL 트리거는 각각 두 가지 속성을 가진 개체 배열인 todoChanges를 바인딩합니다.

  • 항목: 변경된 항목입니다. 항목의 구조는 테이블 스키마를 따릅니다.
  • 작업: 가능한 값은 Insert, UpdateDelete입니다.

다음 예에서는 ToDo 테이블이 변경될 때 호출되는 JavaScript 함수를 보여 줍니다.

다음은 function.json 파일의 바인딩 데이터입니다.

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

구성 섹션에서는 이러한 속성을 설명합니다.

다음은 index.js 파일의 함수에 대한 샘플 JavaScript 코드입니다.

module.exports = async function (context, todoChanges) {
    context.log(`SQL Changes: ${JSON.stringify(todoChanges)}`)
}

예제 사용

Azure SQL 트리거에 대한 더 많은 샘플은 GitHub 리포지토리에서 사용할 수 있습니다.

이 예에서는 ToDoItem 데이터베이스 테이블을 참조하세요.

CREATE TABLE dbo.ToDo (
    [Id] UNIQUEIDENTIFIER PRIMARY KEY,
    [order] INT NULL,
    [title] NVARCHAR(200) NOT NULL,
    [url] NVARCHAR(200) NOT NULL,
    [completed] BIT NOT NULL
);

변경 내용 추적은 데이터베이스 및 테이블에서 사용하도록 설정됩니다.

ALTER DATABASE [SampleDatabase]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

ALTER TABLE [dbo].[ToDo]
ENABLE CHANGE_TRACKING;

SQL 트리거는 각각 두 가지 속성이 있는 개체 목록인 변수 todoChanges에 바인딩됩니다.

  • 항목: 변경된 항목입니다. 항목의 구조는 테이블 스키마를 따릅니다.
  • 작업: 가능한 값은 Insert, UpdateDelete입니다.

다음 예에서는 ToDo 테이블이 변경될 때 호출되는 Python 함수를 보여 줍니다.

다음은 function.json 파일의 바인딩 데이터입니다.

{
    "name": "todoChanges",
    "type": "sqlTrigger",
    "direction": "in",
    "tableName": "dbo.ToDo",
    "connectionStringSetting": "SqlConnectionString"
}

구성 섹션에서는 이러한 속성을 설명합니다.

다음은 __init__.py 파일의 함수에 대한 샘플 Python 코드입니다.

import json
import logging

def main(changes):
    logging.info("SQL Changes: %s", json.loads(changes))

특성

C# 라이브러리SqlTrigger 특성을 사용하여 다음 속성이 있는 함수에서 SQL 트리거를 선언합니다.

특성 속성 설명
TableName 필수입니다. 트리거가 모니터링하는 테이블의 이름입니다.
ConnectionStringSetting 필수입니다. 변경 내용을 모니터링하는 테이블이 포함된 데이터베이스에 대한 연결 문자열이 포함된 앱 설정의 이름입니다. 연결 문자열 설정 이름은 Azure SQL 또는 SQL Server 인스턴스에 대한 연결 문자열이 포함된 애플리케이션 설정(로컬 개발의 경우 local.settings.json)에 해당합니다.
LeasesTableName 선택 사항. 임대를 저장하는 데 사용되는 테이블의 이름입니다. 지정하지 않으면 임대 테이블 이름은 Leases_{FunctionId}_{TableId}가 됩니다. 생성 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

주석

Java 함수 런타임 라이브러리에서 값이 Azure SQL에서 제공되는 매개 변수에 대한 @SQLTrigger 주석(com.microsoft.azure.functions.sql.annotation.SQLTrigger)을 사용합니다. 이 주석은 다음 요소를 지원합니다.

요소 설명
이름 필수입니다. 트리거가 바인딩되는 매개 변수의 이름입니다.
tableName 필수입니다. 트리거가 모니터링하는 테이블의 이름입니다.
connectionStringSetting 필수입니다. 변경 내용을 모니터링하는 테이블이 포함된 데이터베이스에 대한 연결 문자열이 포함된 앱 설정의 이름입니다. 연결 문자열 설정 이름은 Azure SQL 또는 SQL Server 인스턴스에 대한 연결 문자열이 포함된 애플리케이션 설정(로컬 개발의 경우 local.settings.json)에 해당합니다.
LeasesTableName 선택 사항. 임대를 저장하는 데 사용되는 테이블의 이름입니다. 지정하지 않으면 임대 테이블 이름은 Leases_{FunctionId}_{TableId}가 됩니다. 생성 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

구성

다음 표에서는 function.json 파일에 설정된 바인딩 구성 속성을 설명합니다.

function.json 속성 설명
이름 필수입니다. 트리거가 바인딩되는 매개 변수의 이름입니다.
type 필수입니다. sqlTrigger로 설정해야 합니다.
direction 필수입니다. in로 설정해야 합니다.
tableName 필수입니다. 트리거가 모니터링하는 테이블의 이름입니다.
connectionStringSetting 필수입니다. 변경 내용을 모니터링하는 테이블이 포함된 데이터베이스에 대한 연결 문자열이 포함된 앱 설정의 이름입니다. 연결 문자열 설정 이름은 Azure SQL 또는 SQL Server 인스턴스에 대한 연결 문자열이 포함된 애플리케이션 설정(로컬 개발의 경우 local.settings.json)에 해당합니다.
LeasesTableName 선택 사항. 임대를 저장하는 데 사용되는 테이블의 이름입니다. 지정하지 않으면 임대 테이블 이름은 Leases_{FunctionId}_{TableId}가 됩니다. 생성 방법에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

선택적 구성

SQL 트리거에 대해 다음과 같은 선택적 설정을 구성할 수 있습니다.

이 섹션에서는 버전 2.x 이상에서 이 바인딩에 사용할 수 있는 구성 설정에 대해 설명합니다. host.json 파일의 설정은 함수 앱 인스턴스의 모든 함수에 적용됩니다. 아래 예제 host.json 파일에는 이 바인딩에 대한 버전 2.x 이상 설정만 포함되어 있습니다. 버전 2.x 이상 버전의 함수 앱 구성 설정에 대한 자세한 내용은 Azure Functions용 host.json 참조를 참조하세요.

설정 설명
Sql_Trigger_BatchSize 트리거된 함수로 전송되기 전에 트리거 루프의 각 반복으로 처리된 최대 변경 수입니다. 기본값은 100입니다.
Sql_Trigger_PollingIntervalMs 각 변경 내용 일괄 처리 사이의 대기 시간(밀리초)입니다. 기본값은 1000(1초)입니다.
Sql_Trigger_MaxChangesPerWorker 애플리케이션 작업자별로 허용되는 사용자 테이블의 보류 중인 변경 수에 대한 상한입니다. 변경 횟수가 이 제한을 초과하면 규모가 확장될 수 있습니다. 이 설정은 런타임 기반 크기 조정을 사용하도록 설정된 Azure Function Apps 에만 적용됩니다. 기본값은 1000입니다.

변경 내용 추적 설정(필수)

Azure SQL 트리거에 사용할 변경 내용 추적을 설정하려면 두 단계가 필요합니다. 이러한 단계는 Visual Studio Code, Azure Data Studio 또는 SQL Server Management Studio를 포함하여 실행 중인 쿼리를 지원하는 모든 SQL 도구에서 완료할 수 있습니다.

  1. SQL 데이터베이스에서 변경 내용 추적을 사용하도록 설정하고 모니터링할 테이블이 있는 데이터베이스의 이름으로 your database name을 바꿉니다.

    ALTER DATABASE [your database name]
    SET CHANGE_TRACKING = ON
    (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
    

    CHANGE_RETENTION 옵션은 변경 내용 추적 정보(변경 내용)가 유지되는 기간을 지정합니다. SQL 데이터베이스의 변경 기록 보존은 트리거 기능에 영향을 줄 수 있습니다. 예를 들어, Azure 함수가 며칠 동안 꺼졌다가 다시 시작되면 위의 설정 예에서 지난 이틀 동안 발생한 변경 내용이 데이터베이스에 포함됩니다.

    AUTO_CLEANUP 옵션을 사용하여 오래된 변경 내용 추적 정보를 제거하는 정리 태스크를 설정하거나 해제할 수 있습니다. 트리거가 실행되지 않는 일시적인 문제가 있는 경우 자동 정리를 해제하면 문제가 해결될 때까지 보존 기간보다 오래된 정보의 제거를 일시 중지하는 데 유용할 수 있습니다.

    변경 내용 추적 옵션에 대한 자세한 내용은 SQL 설명서에서 확인할 수 있습니다.

  2. 테이블에서 변경 내용 추적을 사용하도록 설정하고 your table name을 모니터링할 테이블의 이름으로 대체합니다(해당하는 경우 스키마 변경).

    ALTER TABLE [dbo].[your table name]
    ENABLE CHANGE_TRACKING;
    

    트리거는 변경 내용 및 변경 내용 추적 시스템 테이블에 대해 모니터링되는 테이블에 대한 읽기 권한이 있어야 합니다. 각 함수 트리거에는 스키마 az_func에 연결된 변경 내용 추적 테이블과 임대 테이블이 있습니다. 이러한 테이블은 아직 존재하지 않는 경우 트리거에 의해 만들어집니다. 이러한 데이터 구조에 대한 자세한 내용은 Azure SQL 바인딩 라이브러리 설명서에서 확인할 수 있습니다.

런타임 기반 스케일링 사용

필요에 따라 함수는 사용자 테이블에서 처리될 보류 중인 변경 내용 수에 따라 자동으로 확장될 수 있습니다. SQL 트리거를 사용할 때 함수가 Premium 계획에서 제대로 확장되도록 하려면 런타임 확장 모니터링을 사용하도록 설정해야 합니다.

Azure Portal의 함수 앱에서 구성을 선택하고 함수 런타임 설정 탭에서 런타임 확장 모니터링켜기로 설정합니다.

런타임 스케일링을 사용하도록 설정하는 Azure Portal 패널의 스크린샷

다시 시도 지원

SQL 트리거 다시 시도 지원임대 테이블에 대한 자세한 내용은 GitHub 리포지토리에서 확인할 수 있습니다.

시작 다시 시도

시작 중에 예외가 발생하면 호스트 런타임은 자동으로 지수 백오프 전략을 사용하여 트리거 수신기를 다시 시작하려고 시도합니다. 이러한 다시 시도는 수신기가 성공적으로 시작되거나 시작이 취소될 때까지 계속됩니다.

끊어진 연결 다시 시도

함수가 성공적으로 시작되었지만 오류로 인해 연결이 끊어진 경우(예: 서버가 오프라인으로 전환됨) 함수는 함수가 중지되거나 연결이 성공할 때까지 연결을 계속 시도하고 다시 엽니다. 연결이 성공적으로 다시 설정되면 중단된 부분부터 처리 변경 내용이 선택됩니다.

이러한 다시 시도는 ConnectRetryCountConnectRetryInterval연결 문자열 옵션으로 구성할 수 있는 SqlClient에 기본 제공된 유휴 연결 다시 시도 논리 외부에 있습니다. 기본 제공 유휴 연결 다시 시도가 먼저 시도되고 재연결에 실패하면 트리거 바인딩이 연결 자체를 다시 설정하려고 시도합니다.

함수 예외 다시 시도

변경 내용을 처리할 때 사용자 함수에서 예외가 발생하면 현재 처리 중인 행 일괄 처리가 60초 후에 다시 시도됩니다. 이 시간 동안 다른 변경 내용은 정상적으로 처리되지만 예외를 발생시킨 일괄 처리의 행은 제한 시간이 경과할 때까지 무시됩니다.

특정 행에 대해 함수 실행이 5번 연속 실패하면 이후의 모든 변경 내용에 대해 해당 행이 완전히 무시됩니다. 일괄 처리의 행은 결정적이지 않으므로 실패한 일괄 처리의 행은 후속 호출에서 다른 일괄 처리로 끝날 수 있습니다. 즉, 실패한 일괄 처리의 모든 행이 반드시 무시되는 것은 아닙니다. 일괄 처리의 다른 행이 예외를 일으키는 행인 경우 "양수" 행은 이후 호출에서 실패하지 않는 다른 일괄 처리로 끝날 수 있습니다.

다음 단계