DB移行などで、新・旧のデータベースサーバのユーザを比較する時に利用します。
サーバロールの付与漏れの確認に利用ください。
下記の個所を比較するDBサーバ名に書き換えてください。
SET @DATABASEA = ‘DBサーバ1’
SET @DATABASEB = ‘DBサーバ2’
サンプルでは、OPENROWSETにWindows認証を利用していますので、ダブルホップ接続にならない様に気を付けてください。
不明な場合は、DBサーバ1かDBサーバ2にログインして、ログインしたサーバに対して実行してください。
また、Ad Hoc Distributed Queriesを有効にする必要があります。
-- サーバロール比較 全DB
DECLARE @DATABASEA varchar(50)
DECLARE @DATABASEB varchar(50)
-----
--比較するサーバを指定します
-----
SET @DATABASEA = 'DBサーバ1'
SET @DATABASEB = 'DBサーバ2'
IF object_id('tempdb..#dbname') IS NOT NULL
BEGIN
drop table #dbname
END
IF object_id('tempdb..#user_itiran') IS NOT NULL
BEGIN
drop table #user_itiran
END
create table #dbname (
[SERVER_NAME] varchar(256)
,[DB_NAME] varchar(256)
PRIMARY KEY CLUSTERED
(
[SERVER_NAME] ASC,
[DB_NAME] ASC
)
)
create table #user_itiran(
[Server名] varchar(256),
[DB名] varchar(256),
[Login Type] sysname,
[srvLogin] varchar(100),
[srvRole] varchar(100),
[dbUser] varchar(100),
[dbRole] varchar(100)
)
declare @MYSERVER_NAME as varchar(256)
declare @MYDB_NAME as varchar(256)
declare @MYsql as varchar(4000)
declare serverlist_cur CURSOR FOR
SELECT @DATABASEA DBNAME
UNION SELECT @DATABASEB
OPEN serverlist_cur
FETCH NEXT FROM serverlist_cur INTO @MYSERVER_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
set @MYsql='
insert into #dbname
select *
FROM OPENROWSET(''SQLNCLI'', ''Server='+@MYSERVER_NAME+';Trusted_Connection=yes;'',
''select @@SERVERNAME,name from sys.sysdatabases '')
'
exec(@MYsql)
-- データを取得
FETCH NEXT FROM serverlist_cur INTO @MYSERVER_NAME
END
CLOSE serverlist_cur
DEALLOCATE serverlist_cur
------
--取得したサーバ、DBリストをもとにユーザ、権限を取得
declare serverlist_cur CURSOR FOR
SELECT * from #dbname
OPEN serverlist_cur
FETCH NEXT FROM serverlist_cur INTO @MYSERVER_NAME, @MYDB_NAME
WHILE @@FETCH_STATUS = 0
BEGIN
set @MYsql='
insert into #user_itiran
select *
FROM OPENROWSET(''SQLNCLI'', ''Server='+@MYSERVER_NAME+';database=' + @MYDB_NAME + ';Trusted_Connection=yes;'',
''
select
''''' + @MYSERVER_NAME + ''''' as サーバ名,
''''' + @MYDB_NAME + ''''' as DB名,
[Login Type]=
case sp.type
when ''''u'''' then ''''WIN''''
when ''''s'''' then ''''SQL''''
when ''''g'''' then ''''GRP''''
end,
convert(varchar(100),sp.name) as srvLogin,
convert(varchar(100),sp2.name) as srvRole,
convert(varchar(100),dbp.name) as dbUser,
convert(varchar(100),dbp2.name) as dbRole
from
sys.server_principals as sp left join
sys.database_principals as dbp on sp.sid=dbp.sid left join
sys.database_role_members as dbrm on dbp.principal_Id=dbrm.member_principal_Id left join
sys.database_principals as dbp2 on dbrm.role_principal_id=dbp2.principal_id left join
sys.server_role_members as srm on sp.principal_id=srm.member_principal_id left join
sys.server_principals as sp2 on srm.role_principal_id=sp2.principal_id
where case sp.type
when ''''u'''' then ''''WIN''''
when ''''s'''' then ''''SQL''''
when ''''g'''' then ''''GRP''''
end is not null '')
'
EXEC(@MYsql)
FETCH NEXT FROM serverlist_cur INTO @MYSERVER_NAME, @MYDB_NAME
END
CLOSE serverlist_cur
DEALLOCATE serverlist_cur
-------
--一致していないもののリスト
select * from
(
select
[Server名] TBAservername
,[DB名] TBAdbname
,[Login Type] [TBALogin Type]
,[srvLogin] [TBAsrvLogin]
,[srvRole] [TBAsrvRole]
,[dbUser] [TBAdbUser]
,[dbRole] [TBAdbRole]
FROM #user_itiran where [Server名] =@DATABASEA
)a
full outer join
(
select
[Server名] TBBservername
,[DB名] TBBdbname
,[Login Type] [TBBLogin Type]
,[srvLogin] [TBBsrvLogin]
,[srvRole] [TBBsrvRole]
,[dbUser] [TBBdbUser]
,[dbRole] [TBBdbRole]
FROM #user_itiran where [Server名] =@DATABASEB
) b
on isnull(a.TBAdbname ,'')=isnull(b.TBBdbname ,'')
and isnull(a.[TBALogin Type],'')=isnull(b.[TBBLogin Type] ,'')
and isnull(a.[TBAsrvLogin] ,'')=isnull(b.[TBBsrvLogin] ,'')
and isnull(a.[TBAsrvRole] ,'')=isnull(b.[TBBsrvRole] ,'')
and isnull(a.[TBAdbUser] ,'')=isnull(b.[TBBdbUser] ,'')
and isnull(a.[TBAdbRole] ,'')=isnull(b.[TBBdbRole] ,'')
where isnull(a.[TBALogin Type],'') <> isnull(b.[TBBLogin Type],'')
or isnull(a.[TBAsrvLogin] ,'') <> isnull(b.[TBBsrvLogin] ,'')
or isnull(a.[TBAsrvRole] ,'') <> isnull(b.[TBBsrvRole] ,'')
or isnull(a.[TBAdbUser] ,'') <> isnull(b.[TBBdbUser] ,'')
or isnull(a.[TBAdbRole] ,'') <> isnull(b.[TBBdbRole] ,'')