Microsoft SQL Serverソースエンドポイント-スタンドアロン環境での非sysadminユーザーのセットアップ
1. 1
Microsoft SQL Server ソースエンドポイント
スタンドアロン環境での非 sysadmin ユーザーのセットアップ
この資料では、Microsoft SQL Server のエンドポイント接続設定で sysadmin 以外のユー
ザーを指定できるようにセットアップする方法について説明します。
※ AlwaysOn 環境で sysadmin 以外のユーザーをセットアップする場合は、
AlwaysOn
可用性グループを使用する際の sysadmin 以外のユーザーのセットアップを参照し
てください。
制限事項と考慮事項
• サポートされているのは、SQL Server 2012 以降のみです。
• [Advanced] タブの [ Backup folder preprocessing command ]オプションはサポー
トされていません。
設定の手順
非 sysadmin レプリケートユーザーをサポートするには、次の手順を実行します。
1. レプリケーション用の SQL Server のセットアップ の説明に従ってレプリケーション
用の SQL Server をセットアップします。
2. ソース データベースで MS-REPLICATION を有効にします。これは、手動で実行す
るか、
sysadmin ユーザーを使用してタスクを 1 回実行することによって実行できます。
※ MS-REPLICATION ディストリビュータは、ローカルとして、または関連付け
られたリンク サーバーを介して sysadmin 以外のユーザーにアクセスできる
ように構成する必要があります。(適切な設定がなされていない場合、
“REPLICATION enablement requires SYSADMIN permission rank while user is
PERM_RANK_DBOWNER [1020101]”などのエラーによりタスク実行でエラ
ーが発生します。)
3. [ Exclusively use sp_repldone within a single task] オプションが有効になっている場合
は、MS-REPLICATION Log Reader ジョブを停止します。
4. マスターDB でスキーマ[attrep]を作成します。
5. 次のように、
Master データベースでテーブル値関数[attrep].[split_partition_list]を作成
します。
USE [master]
GO
2. 2
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
6. 次のように、Master データベースにプロシージャ[attrep].[rtm_dump_dblog]を作成し
ます。
USE [master]
GO
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),
3. 3
@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
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') )
4. 4
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
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
5. 5
([operation] = 'LOP_HOBT_DDL')
)
SET NOCOUNT OFF -- Re-enable "rows affected display"
end
GO
7. Master DB で証明書を作成します。(以下の'choose_your_own_pwd'を任意のパスワー
ドに変更します。)
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';
8. 次のように、証明書からログインを作成します。
Use [master]
Go
CREATE LOGIN attrep_rtm_dump_dblog_login FROM CERTIFICATE
[attrep_rtm_dump_dblog_cert];
9. 次のように、ログインを sysadmin サーバーロールに追加します。
ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_dump_dblog_login];
10. 次のように、証明書の署名を [master].[attrep].[rtm_dump_dblog]に追加します。(以下
の'choose_your_own_pwd'を任意のパスワードに変更します。)
Use [master]
GO
ADD SIGNATURE
TO [master].[attrep].[rtm_dump_dblog]
BY CERTIFICATE [attrep_rtm_dump_dblog_cert]
WITH PASSWORD = 'choose_your_own_pwd';
※ ストアド プロシージャを再作成する場合は、署名を再度追加する必要があります。
11. 次のように、Master データベースにプロシージャ
[attrep].[rtm_position_1st_timestamp]を作成します。
use [master]
if object_id('[attrep].[rtm_position_1st_timestamp]','P') is not null
DROP PROCEDURE [attrep].[rtm_position_1st_timestamp];
6. 6
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
12. Master DB で証明書を作成します。
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';
7. 7
13. 次のように証明書からログインを作成します。
Use [master]
Go
CREATE LOGIN attrep_rtm_position_1st_timestamp_login FROM CERTIFICATE
[attrep_rtm_position_1st_timestamp_cert];
14. 次のように、ログインを sysadmin サーバー ロールに追加します。
ALTER SERVER ROLE [sysadmin] ADD MEMBER [attrep_rtm_position_1st_timestamp_login];
15. 証明書によって署名を[master].[attrep].[rtm_position_1st_timestamp]に追加するには、
次のようにします。
(以下の'choose_your_own_pwd'を任意のパスワードに変更します。
)
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';
※ ストアド プロシージャを再作成する場合は、署名を再度追加する必要があります。
16. 次の各データベースで、次の権限/ロールを持つユーザーを作成します。
• Master DB:
select on sys.fn_dblog
view any definition
view server state (should be granted to the login).
execute on sp_repldone
execute on sp_replincrementlsn
execute on sp_addpublication
execute on sp_addarticle
execute on sp_articlefilter
select on [attrep].[split_partition_list]
execute on [attrep].[rtm_dump_dblog]
execute on [attrep].[rtm_position_1st_timestamp]
8. 8
• MSDB DB:
select on msdb.dbo.backupset
select on msdb.dbo.backupmediafamily
select on msdb.dbo.backupfile
• ソース データベース:
db_owner ROLE
以下が権限/ロールを持つユーザーを作成するためのスクリプトの例です:
USE [master]
GO
CREATE LOGIN [replicate] WITH PASSWORD=N'Qlik123!', DEFAULT_DATABASE=[master],
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
CREATE USER replicate FROM LOGIN [replicate];
Grant select on sys.fn_dblog to replicate;
Grant view any definition to replicate;
Grant view server state to replicate;
Grant execute on sp_repldone to replicate;
Grant execute on sp_replincrementlsn to replicate;
Grant execute on sp_addpublication to replicate;
Grant execute on sp_addarticle to replicate;
Grant execute on sp_articlefilter to replicate;
Grant select on [attrep].[split_partition_list] to replicate;
Grant execute on [attrep].[rtm_dump_dblog] to replicate;
Grant execute on [attrep].[rtm_position_1st_timestamp] to replicate;
use MSDB
GO
CREATE USER replicate FROM LOGIN [replicate];
Grant select on msdb.dbo.backupset to replicate;
Grant select on msdb.dbo.backupmediafamily to replicate;
Grant select on msdb.dbo.backupfile to replicate;
use Source1
GO
CREATE USER replicate FROM LOGIN [replicate];
exec sp_addrolemember 'db_owner', 'replicate';