Ana içeriğe geç Tamamlayıcı içeriğe geç

Gerekli izinler

Microsoft SQL Server (Günlük Tabanlı) uygulamasını bir yerleştirme görevinde kaynak olarak kullanmak için, Microsoft SQL Server (Günlük Tabanlı) bağlantı özelliklerinde belirtilen kullanıcı aşağıdakilerden biri olmalıdır:

  • Hem db_owner veritabanı rolünün hem de sysAdmin sabit sunucu rolünün bir üyesi.
  • db_owner veritabanı rolünün üyesi ancak sysAdmin sabit sunucu rolünün üyesi değil. Bu ayrıca aşağıdaki Bağımsız bir ortamda sysadmin olmayan bir kullanıcı ayarlama bölümünde anlatılan prosedürleri de gerçekleştirmenizi gerektirir.

Bağımsız bir ortamda sysadmin olmayan bir kullanıcı ayarlama

Aşağıdaki bölümde, connector bağlantı ayarlarında sysadmin olmayan bir kullanıcı belirtildiğinde Microsoft SQL Server'ın nasıl kurulacağı anlatılmaktadır.

Bilgi notu

AlwaysOn ortamında sysadmin olmayan bir kullanıcı ayarlamak istiyorsanız bkz. AlwaysOn kullanılabilirlik gruplarıyla çalışırken sysadmin olmayan bir kullanıcı ayarlama.

Kurulum yordamı

Bilgi notu

16-20 adımlarının yalnızca bağlayıcı ayarları şu şekildeyse uygulanması gerekir:

  • Değişiklik işleme modu (Değişiklik okuma kaynağı), Yedekleme Günlüklerini Önceliklendir veya Yalnızca Yedekleme Günlükleri olarak ayarlanmış
  • Alternatif yedekleme klasörü ayarlanmış

Sysadmin olmayan bir kullanıcıyı desteklemek için:

  1. Microsoft SQL Server'ı çoğaltma için ayarlama bölümünde açıklandığı gibi Microsoft SQL Server'ı Çoğaltma için ayarlayın.

  2. Kaynak veritabanında MS-REPLICATION öğesini etkinleştirin. Bu işlem manuel olarak veya sysadmin kullanıcısını kullanıp görevi bir kez çalıştırarak yapılabilir.

    Bilgi notu

    MS-REPLICATION dağıtımcısı yerel olarak veya ilişkilendirilmiş bağlantılı sunucu üzerinden sysadmin olmayan kullanıcılara erişim veren bir yolla yapılabilir.

  3. Ana DB'de [attrep] şeması oluşturun.
  4. [attrep].[split_partition_list] fonksiyonunu içeren tabloyu Ana veritabanında oluşturun:

     

    USE [master]
    GO
    
    set ansi_nulls on
    go
    
    set quoted_identifier on
    go
    
    if (object_id('[attrep].[split_partition_list]','TF')) is not null
    drop  function [attrep].[split_partition_list];
    go
    
    create function [attrep].[split_partition_list] 
    ( 
    @plist varchar(8000),	--A delimited list of partitions	
    @dlm nvarchar(1)	--Delimiting character
    ) 
    returns @partitionsTable table --Table holding the BIGINT values of the string fragments
    (
    pid bigint primary key
    ) 
    as 
    begin
    declare @partition_id bigint;
    declare @dlm_pos integer;
    declare @dlm_len integer;
    
    set @dlm_len = len(@dlm);
    
    while (charindex(@dlm,@plist)>0)
    begin 
    set @dlm_pos = charindex(@dlm,@plist);
    set @partition_id = cast( ltrim(rtrim(substring(@plist,1,@dlm_pos-1))) as bigint);
    insert into @partitionsTable (pid) values (@partition_id)
    set @plist = substring(@plist,@dlm_pos+@dlm_len,len(@plist));
    end 
    set @partition_id = cast (ltrim(rtrim(@plist)) as bigint);
    insert into @partitionsTable (pid) values (  @partition_id  );
    return
    end
    GO
  5. [attrep].[rtm_dump_dblog] prosedürünü Ana veritabanında oluşturun:

    
    use [MASTER] 
    go 
    
    if (object_id('[attrep].[rtm_dump_dblog]','P')) is not null
    drop procedure [attrep].[rtm_dump_dblog]; 
    go
    
    set ansi_nulls on
    go 
    
    set quoted_identifier on 
    go
    
    create procedure [attrep].[rtm_dump_dblog]
    (
    @start_lsn        varchar(32),
    @seqno            integer,
    @filename         varchar(260),
    @partition_list        varchar(8000), -- A comma delimited list: P1,P2,... Pn
    @programmed_filtering integer,
    @minPartition     bigint,
    @maxPartition     bigint
    ) 
    as begin
    
            declare @start_lsn_cmp varchar(32); -- Stands against the GT comparator
    
            SET NOCOUNT ON  -- Disable "rows affected display"
    
            set @start_lsn_cmp = @start_lsn;
            if (@start_lsn_cmp) is null
                    set @start_lsn_cmp = '00000000:00000000:0000';
    
            if (@partition_list is null)
            begin
                    RAISERROR ('Null partition list waspassed',16,1);
                    return
                    --set @partition_list = '0,';    -- A dummy which is never matched
            end
    
            if (@start_lsn) is not null
                    set @start_lsn = '0x'+@start_lsn;
    
    if (@programmed_filtering=0)
            SELECT
                    [Current LSN],
                    [operation],
                    [Context],
                    [Transaction ID],
                    [Transaction Name],
                    [Begin Time],
                    [End Time],
                    [Flag Bits],
                    [PartitionID],
                    [Page ID],
                    [Slot ID],
                    [RowLog Contents 0],
                    [Log Record],
                    [RowLog Contents 1], -- After Image
    		 [Xact Id] -- Only needed if you are using the AR_H_XACT_ID custom header
            FROM
                    fn_dump_dblog (
                            @start_lsn, NULL, N'DISK', @seqno, @filename,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default)
            where [Current LSN] collate SQL_Latin1_General_CP1_CI_AS > @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS -- This aims for implementing FN_DBLOG based on GT comparator.
            and
            (
              (  [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
              or
              (  [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
                    and
                    ( ( [context]   in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX' and  (datalength([RowLog Contents 0]) in (0,14,28))) )   -- This one filters only TEXT_MIX of interest.\
                    and       [PartitionID] in ( select * from master.attrep.split_partition_list (@partition_list,','))
              )
              or
              ([operation] = 'LOP_HOBT_DDL')
            )
    else
            SELECT
                    [Current LSN],
                    [operation],
                    [Context],
                    [Transaction ID],
                    [Transaction Name],
                    [Begin Time],
                    [End Time],
                    [Flag Bits],
                    [PartitionID],
                    [Page ID],
                    [Slot ID],
                    [RowLog Contents 0],
                    [Log Record],
                    [RowLog Contents 1], -- After Image 
    		 [Xact Id] -- Only needed if you are using the AR_H_XACT_ID custom header
    	FROM
                    fn_dump_dblog (
                            @start_lsn, NULL, N'DISK', @seqno, @filename,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default,
                            default, default, default, default, default, default, default)
            where [Current LSN] collate SQL_Latin1_General_CP1_CI_AS > @start_lsn_cmp collate SQL_Latin1_General_CP1_CI_AS -- This aims for implementing FN_DBLOG based on GT comparator.
            and
            (
              (  [operation] in ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_ABORT_XACT') )
              or
              (  [operation] in ('LOP_INSERT_ROWS','LOP_DELETE_ROWS','LOP_MODIFY_ROW')
                    and
                    ( ( [context]   in ('LCX_HEAP','LCX_CLUSTERED','LCX_MARK_AS_GHOST') ) or ([context] = 'LCX_TEXT_MIX' and  (datalength([RowLog Contents 0]) in (0,14,28))) )   -- This one filters only TEXT_MIX of interest.\
                    and           ([PartitionID] is not null) and ([PartitionID] >= @minPartition and [PartitionID]<=@maxPartition)
              )
              or
              ([operation] = 'LOP_HOBT_DDL')
            )
            SET NOCOUNT OFF -- Re-enable "rows affected display"
    
    end
    GO
  6. Ana DB'de sertifika oluşturun:

     

    Use [master]
    Go
    CREATE CERTIFICATE [attrep_rtm_dump_dblog_cert]
    ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'
    WITH SUBJECT = N'Certificate for FN_DUMP_DBLOG Permissions';
  7. Sertifikadan oturum açma bilgileri oluşturun:

     

    Use [master]
    Go
    CREATE LOGIN attrep_rtm_dump_dblog_login FROM CERTIFICATE 
    [attrep_rtm_dump_dblog_cert];
  8. Oturum açma bilgilerini sysadmin sunucu rolüne ekleyin:

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_dump_dblog_login];
  9. Aşağıda gösterildiği gibi, [master].[attrep].[rtm_dump_dblog]:

     

    Use [master]
    GO
    ADD SIGNATURE
    TO [master].[attrep].[rtm_dump_dblog]
    BY CERTIFICATE [attrep_rtm_dump_dblog_cert]
    WITH PASSWORD = 'choose_your_own_pwd';
    Bilgi notu

    Saklı prosedür yeniden oluşturulursa, imzayı yeniden eklemeniz gerekir.

  10. [attrep].[rtm_position_1st_timestamp] prosedürünü Ana veritabanında oluşturun:

     

    use [master]
    if object_id('[attrep].[rtm_position_1st_timestamp]','P') is not null
    DROP PROCEDURE [attrep].[rtm_position_1st_timestamp];
    go
    create procedure [attrep].[rtm_position_1st_timestamp]
    (
    @dbname                sysname,      -- Database name
    @seqno                 integer,      -- Backup set sequence/position number within file
    @filename              varchar(260), -- The backup filename
    @1stTimeStamp          varchar(40)   -- The timestamp to position by
    ) 
    as begin
    
    SET NOCOUNT ON       -- Disable "rows affected display"
    
    declare @firstMatching table
    (
    cLsn varchar(32),
    bTim datetime
    )
    
    declare @sql nvarchar(4000)
    declare @nl                       char(2)
    declare @tb                       char(2)
    declare @fnameVar                 sysname = 'NULL'
    
    set @nl  = char(10); -- New line
    set @tb  = char(9)   -- Tab separator
    
    if (@filename is not null)
    set @fnameVar = ''''+@filename +''''
    
    set @sql='use ['+@dbname+'];'+@nl+
    'select top 1 [Current LSN],[Begin Time]'+@nl+
    'FROM fn_dump_dblog (NULL, NULL, NULL, '+ cast(@seqno as varchar(10))+','+ @fnameVar+','+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default,'+@nl+
    @tb+'default, default, default, default, default, default, default)'+@nl+
    'where operation=''LOP_BEGIN_XACT''' +@nl+
    'and [Begin Time]>= cast('+''''+@1stTimeStamp+''''+' as datetime)'+@nl
    
    --print @sql
    delete from  @firstMatching 
    insert into @firstMatching  exec sp_executesql @sql    -- Get them all
    
    select top 1 cLsn as [matching LSN],convert(varchar,bTim,121) as [matching Timestamp] from @firstMatching;
    
    SET NOCOUNT OFF      -- Re-enable "rows affected display"
    
    end
    GO
    
  11. Ana DB'de sertifika oluşturun:

     

    Use [master]
    Go
    CREATE CERTIFICATE [attrep_rtm_position_1st_timestamp_cert]
    ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'
    WITH SUBJECT = N'Certificate for FN_POSITION_1st_TIMESTAMP Permissions';
  12. Sertifikadan oturum açma bilgileri oluşturun:

     

    Use [master]
    Go
    CREATE LOGIN attrep_rtm_position_1st_timestamp_login FROM CERTIFICATE
    [attrep_rtm_position_1st_timestamp_cert];
  13. Oturum açma bilgilerini sysadmin sunucu rolüne ekleyin:

     

    ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_position_1st_timestamp_login];
  14. [master].[attrep].[rtm_position_1st_timestamp] öğesine sertifika imzasını ekleyin:

     

    Use [master]
    GO
    ADD SIGNATURE
    TO [master].[attrep].[rtm_position_1st_timestamp]
    BY CERTIFICATE [attrep_rtm_position_1st_timestamp_cert]
    WITH PASSWORD = 'choose_your_own_pwd';
    Bilgi notu

    Saklı prosedür yeniden oluşturulursa, imzayı yeniden eklemeniz gerekir.

  15. Ana veritabanında [attrep].[rtm_check_file_exists] işlevini oluşturun:

     

    USE [master]

    GO

     

    IF object_id('[attrep].[rtm_check_file_exists]','FN') IS NOT NULL

    DROP FUNCTION [attrep].[rtm_check_file_exists];

    GO

     

    CREATE FUNCTION [attrep].[rtm_check_file_exists]

    (

    @filename varchar(260)

    ) returns int

    as

    begin

    declare @exists int = 0;

    exec master.dbo.xp_fileexist @filename, @exists OUT;

    return @exists;

    end

    GO

  16. Ana veritabanında attrep_rtm_check_file_exists sertifikası oluşturun:

     

    CREATE CERTIFICATE [attrep_rtm_check_file_exists_cert]

    ENCRYPTION BY PASSWORD = N'choose_your_own_pwd'

    WITH SUBJECT = N'Certificate for rtm_check_file_exists Permissions';

     

  17. Sertifikadan attrep_rtm_check_file_exists_login oluşturun:

     

    CREATE LOGIN attrep_rtm_check_file_exists_login

    FROM CERTIFICATE [attrep_rtm_check_file_exists_cert];

     

  18. Oturum açma bilgilerini sysadmin sunucu rolüne ekleyin:

     

    ALTER SERVER ROLE [sysadmin] ADD MEMBER attrep_rtm_check_file_exists_login;

     

  19. [rtm_check_file_exists] işlevine sertifika imzasını ekleyin:

     

    ADD SIGNATURE TO [master].[attrep].[rtm_check_file_exists]

    BY CERTIFICATE [attrep_rtm_check_file_exists_cert]

    WITH PASSWORD = N'choose_your_own_pwd';

    Bilgi notuSaklı prosedür yeniden oluşturulursa, imzayı yeniden eklemeniz gerekir.
  20. Mevcut oturum açma kullanıcısını kullanın veya yeni bir oturum açma kullanıcısı oluşturun:

     

    CREATE LOGIN [username] WITH PASSWORD='password';

     

  21. Oturum açma kullanıcısı için ana ve MSDB veritabanlarında kullanıcı oluşturun:

     

    USE master

    GO

    CREATE USER [username] FOR LOGIN [username];

    GO

    USE msdb

    GO

    CREATE USER [username] FOR LOGIN [username];

    GO

     

    sysadmin rolüne sahip olmayan kullanıcılarla erişim sağlamak istediğiniz her veritabanı için bu adımı tekrarlayın.

  22. Kullanıcıya aşağıdaki izinleri ve rolleri verin (aşağıdaki her bir veritabanında):

    • Ana DB:
      • sys.fn_dblog üzerinde select
      • herhangi bir tanımı görüntüle
      • view server state (oturum açma bilgilerine verilmelidir).
      • sp_repldone üzerinde execute
      • sp_replincrementlsn üzerinde execute
      • sp_addpublication üzerinde execute
      • sp_addarticle üzerinde execute
      • sp_articlefilter üzerinde execute
      • [attrep].[split_partition_list] üzerinde select
      • [attrep].[rtm_dump_dblog] üzerinde select
      • [attrep].[rtm_position_1st_timestamp] üzerinde execute
      • [attrep].[rtm_check_file_exists] üzerinde execute

        Bilgi notuBu izin yalnızca yukarıdaki 16-20 adımlarını gerçekleştirirseniz gereklidir.
    • MSDB DB:
      • msdb.dbo.backupset üzerinde select
      • msdb.dbo.backupmediafamily üzerinde select
      • msdb.dbo.backupfile üzerinde select
    • Kaynak veritabanı için:
      • db_owner ROLE
  23. Uç noktanın bir yayın oluşturabilmesi için sysadmin olmayana erişim verin:

    USE master

    EXEC sp_replicationdboption @dbname = '<databaseName>', @optname = 'publish', @value = 'true'

    EXEC <databaseName>.sys.sp_addlogreader_agent

Bu sayfa size yardımcı oldu mu?

Bu sayfa veya içeriği ile ilgili bir sorun; bir yazım hatası, eksik bir adım veya teknik bir hata bulursanız, bize bildirin, düzeltelim!