다음을 통해 공유


트랜잭션 게시에 대해 업데이트 구독 설정

적용 대상: SQL Server

이 주제에서는 SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server에서 트랜잭션 게시에 대해 업데이트 구독을 사용하도록 설정하는 방법을 설명합니다.

참고 항목

SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.

시작하기 전에

보안

가능한 경우 런타임 시 사용자에게 보안 자격 증명을 입력하라는 메시지가 표시됩니다. 스크립트 파일에 자격 증명을 저장하는 경우에는 무단으로 액세스하지 못하도록 파일에 보안을 설정해야 합니다.

SQL Server Management Studio 사용

새 게시 마법사의 게시 유형 페이지에서 트랜잭션 게시에 대해 업데이트 구독을 사용할 수 있도록 설정합니다.

구독 업데이트를 사용하려면 새 구독 마법사에서도 옵션을 구성해야 합니다.

구독 업데이트를 설정하려면

  1. 새 게시 마법사의 게시 유형 페이지에서 업데이트할 수 있는 구독이 있는 트랜잭션 게시를 선택합니다.

  2. 에이전트 보안 페이지에서 스냅샷 에이전트, 로그 판독기 에이전트 및 큐 판독기 에이전트에 대한 보안 설정을 지정합니다. 큐 판독기 에이전트가 실행되는 계정에 필요한 권한에 대한 자세한 내용은 복제 에이전트 보안 모델을 참조하세요.

    참고 항목

    즉시 업데이트 구독만 사용하는 경우에도 큐 판독기 에이전트가 구성됩니다.

Transact-SQL 사용

복제 저장 프로시저를 사용하여 프로그래밍 방식으로 트랜잭션 게시를 만들 때 즉시 또는 지연 업데이트 구독을 사용하도록 설정할 수 있습니다.

즉시 업데이트 구독을 지원하는 게시를 만들려면

  1. 필요한 경우 게시 데이터베이스에 대한 로그 판독기 에이전트 작업을 만듭니다.

    • 게시 데이터베이스에 로그 판독기 에이전트 작업이 이미 있는 경우 2단계로 진행합니다.

    • 게시된 데이터베이스에 로그 판독기 에이전트 작업이 존재하는지 확실하지 않으면 게시 데이터베이스의 게시자에서 sp_helplogreader_agent(Transact-SQL)를 실행합니다. 결과 집합이 비어 있으면 로그 판독기 에이전트 작업을 만들어야 합니다.

    • 게시자에서 sp_addlogreader_agent(Transact-SQL)를 실행합니다. @job_name@password에 에이전트가 실행되는 Microsoft Windows 자격 증명을 지정합니다. 게시자에 연결할 때 에이전트가 SQL Server 인증을 사용하면 @publisher_security_mode에 값 0을 지정하고 @publisher_login@publisher_password에 Microsoft SQL Server 로그인 정보도 지정해야 합니다.

  2. sp_addpublication(Transact-SQL)을 실행하여 true 값을 @allow_sync_tran 매개 변수에 지정합니다.

  3. 게시자에서 sp_addpublication_snapshot(Transact-SQL)을 실행합니다. @publication 에 2단계에서 사용된 게시 이름, @job_name@password에 스냅샷 에이전트가 실행되는 Windows 자격 증명을 지정합니다. 게시자에 연결할 때 에이전트가 SQL Server 인증을 사용하면 @publisher_security_mode에 값 0을 지정하고 @publisher_login@publisher_password에 SQL Server 로그인 정보도 지정해야 합니다. 이렇게 하면 게시에 대해 스냅샷 에이전트 작업이 만들어집니다.

  4. 게시에 아티클을 추가합니다. 자세한 내용은 아티클 정의를 참조하세요.

  5. 구독자에서 이 게시에 대한 업데이트 구독을 만듭니다.

지연 업데이트 구독을 지원하는 게시를 만들려면

  1. 필요한 경우 게시 데이터베이스에 대한 로그 판독기 에이전트 작업을 만듭니다.

    • 게시 데이터베이스에 로그 판독기 에이전트 작업이 이미 있는 경우 2단계로 진행합니다.

    • 게시된 데이터베이스에 로그 판독기 에이전트 작업이 존재하는지 확실하지 않으면 게시 데이터베이스의 게시자에서 sp_helplogreader_agent(Transact-SQL)를 실행합니다. 결과 집합이 비어 있으면 로그 판독기 에이전트 작업을 만들어야 합니다.

    • 게시자에서 sp_addlogreader_agent(Transact-SQL)를 실행합니다. @job_name@password에 에이전트가 실행되는 Windows 자격 증명을 지정합니다. 게시자에 연결할 때 에이전트가 SQL Server 인증을 사용하면 @publisher_security_mode에 값 0을 지정하고 @publisher_login@publisher_password에 SQL Server 로그인 정보도 지정해야 합니다.

  2. 필요한 경우 배포자에 대해 큐 판독기 에이전트를 만듭니다.

    • 배포 데이터베이스에 큐 판독기 에이전트 작업이 이미 있는 경우 3단계로 진행합니다.

    • 게시된 데이터베이스에 큐 판독기 에이전트 작업이 존재하는지 확실하지 않으면 배포 데이터베이스의 배포자에서 sp_helpqreader_agent(Transact-SQL)를 실행합니다. 결과 집합이 비어 있으면 큐 판독기 에이전트 작업을 만들어야 합니다.

    • 배포자에서 sp_addqreader_agent(Transact-SQL)를 실행합니다. @job_name@password에 에이전트가 실행되는 Windows 자격 증명을 지정합니다. 이러한 자격 증명은 큐 판독기 에이전트가 게시자 및 구독자에 연결할 때 사용됩니다. 자세한 내용은 Replication Agent Security Model을 참조하세요.

  3. sp_addpublication(Transact-SQL)을 실행하여 true 값을 매개 변수 @allow_queued_tran에 지정하고 pub wins, sub reinit 또는 sub wins 값을 @conflict_policy에 지정합니다.

  4. 게시자에서 sp_addpublication_snapshot(Transact-SQL)을 실행합니다. @publication 에 3단계에서 사용된 게시 이름, @snapshot_job_name@password에 스냅샷 에이전트가 실행되는 Windows 자격 증명을 지정합니다. 게시자에 연결할 때 에이전트가 SQL Server 인증을 사용하면 @publisher_security_mode에 값 0을 지정하고 @publisher_login@publisher_password에 SQL Server 로그인 정보도 지정해야 합니다. 이렇게 하면 게시에 대해 스냅샷 에이전트 작업이 만들어집니다.

  5. 게시에 아티클을 추가합니다. 자세한 내용은 아티클 정의를 참조하세요.

  6. 구독자에서 이 게시에 대한 업데이트 구독을 만듭니다.

지연 업데이트 구독을 허용하는 게시에 대한 충돌 정책을 변경하려면

  1. 게시 데이터베이스의 게시자에서 sp_changepublication(Transact-SQL)을 실행합니다. @propertyconflict_policy 값을 지정하고 @value에 원하는 충돌 정책 모드(pub wins, sub reinit 또는 sub wins)를 지정합니다.

예(Transact-SQL)

이 예제에서는 즉시 및 지연 업데이트 끌어오기 구독을 모두 지원하는 게시를 만듭니다.

-- To avoid storing the login and password in the script file, the values 
-- are passed into SQLCMD as scripting variables. For information about 
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".

--Declarations for adding a transactional publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022'; 
SET @publication = N'AdvWorksProductTran'; 
SET @login = $(Login); 
SET @password = $(Password); 

USE [AdventureWorks2022]
-- Enable transactional replication on the publication database.
EXEC sp_replicationdboption 
    @dbname=@publicationDB, 
    @optname=N'publish',
    @value = N'true';

-- Execute sp_addlogreader_agent to create the agent job. 
EXEC sp_addlogreader_agent 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;

-- Create a transactional publication that supports immediate updating, 
-- queued updating, and pull subscriptions. 
EXEC sp_addpublication 
    @publication = @publication, 
    @status = N'active',
    @allow_sync_tran = N'true', 
    @allow_queued_tran = N'true',
    @allow_pull = N'true',
    @independent_agent = N'true',
  -- Explicitly declare the related default properties 
    @conflict_policy = N'pub wins';

-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot 
    @publication = @publication, 
    @job_login = @login, 
    @job_password = @password,
    -- Explicitly specify the use of Windows Integrated Authentication (default) 
    -- when connecting to the Publisher.
    @publisher_security_mode = 1;
GO

--Declarations for adding an article.
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product'; 
SET @owner = N'Production'; 

-- Add a horizontally and vertically filtered article for the Product table.
USE [AdventureWorks2022]
EXEC sp_addarticle 
    @publication = @publication, 
    @article = @article, 
    @source_table = @article, 
    @vertical_partition = N'false', 
    @type = N'logbased',
    @source_owner = @owner, 
    @destination_owner = @owner;
GO