#SQL Server 연결서버 사용시 통계 업데이트가 발생할때

연결서버을 사용하여 Select 쿼리만 날릴 뿐인데,
DBCC SHOW_STATISTICS 가 실패했다는 에러메시지가 날아와서 당황했다.

에러메시지는 2557, DBCC SHOW_STATISTICS를 실패했다는 메시지.

구글링 결과 아래와 같은 이야기가 나왔다. 기존에 알고 있던 정보와 같이해서 정리한다.

연결서버에 쿼리를 날릴때 MSSQL 서버는 정보 확인을 위해 아래와 같은 SP들을 호출한다. 

exec [AdventureWorks].[sys].sp_tables_info_90_rowset N’SalesOrderHeader’,N’Sales’,NULL 

exec [AdventureWorks].[sys].sp_columns_100_rowset N’SalesOrderHeader’,N’Sales’,NULL 

exec [AdventureWorks].[sys].sp_indexes_100_rowset N’SalesOrderHeader’,NULL,N’Sales’ 

exec [AdventureWorks].[sys].sp_check_constbytable_rowset N’SalesOrderHeader’,N’Sales’,NULL,NULL 

exec [AdventureWorks].[sys].sp_table_statistics2_rowset N’SalesOrderHeader’,N’Sales’,N’AdventureWorks’,NULL,NULL,NULL

이는 연결서버를 사용할때 DML 의 성격과 관계없이 발생한다. 쿼리를 할려면 최소한 메타데이터를 알아야 하는 것이고, 보통 연결서버에 쿼리를 날릴때 조회권한이 있는데 통계정보를 볼 권한이 없다는 건 좀 말이 안된다.

구글링한 블로그에 따르면 
db_owner 일때나 sysadmin 정도의 권한이 있어야 제대로 된 조회가 가능하다는 건데
멍청한 짓이 아닐 수 없다.

대부분 보안 문제로 연결서버의 로그인에게는 최소한의 읽기권한만 줄텐데 이때 이렇게 멍청하게 작동할 줄이야.

서비스팩에서 픽스가 된건지는 확인을 해봐야겠다.

[mssql] Snapshot Agent shows an errormsg “Invalid object Sysarticles.’ while reinitializing.

Couple days ago, We restored database so I had to reinitialize transaction replication to our development system.  After I reinitalizing all articles and subscriptions I reran a snapshot agent manually then shows an errormessage “Invalid object name sysarticles”.

I thought I have added sysarticles table as article accidently. But no I haven’t.
So I ran a SQl Profiler to capture that query(or a procedure that references sysarticles table) and I got the proc.

sp_scriptinsproc

A system procedure that generates a script for Insert Statements that references sysarticles.
As we know sysarticles tables is a system table that created into each publishing databases.
 If publishing database has no proc then sql server looking for master database to execute that procedure. There is no reason  master database should have sysarticles table unless you don’t set master database as a publisher.

So here is a simple solution.
Scripting sp_scriptinsproc procedure from master database(or other database) and generates it into publisher database.
And rerun snapshot agent you will never see that errormessage again.