2018年7月25日 星期三

SQL server 2012/2014複本之發行與訂閱補充事項

這方面的細步很多人討論了,
本次施作參考這裡 : 快速逐步的實作SQL Server之主從複寫機制
 今天不講這些細節,主要是在作業中、後遇到的一兩個狀況:
1.如果是改了主機名稱:
在「新增訂閱」時卻出現找不到SQL server,出現以下訊息:
Replication Error: SQL Server replication requires the actual server name to make a connection to the server  (錯誤:18482:無法連線到伺服器'訂閱者',因'這台SQL'未定義為遠端伺服器!) 的訊息


很怪耶,明明SQL Server Management Studio連得到訂閱者啊,怎麼會出現這問題?
因為我們把主機改了,連帶的sql serve中的相關系統資料也要改才會正確,
怎麼改?
先用「SELECT * FROM sys.servers 」及「SELECT @@SERVERNAME」檢查訂閱者SQL server是不是出現舊的主機名稱
然後用以下的方式改到新的主機名稱
=========================
sp_dropserver '舊主機名稱';
GO
sp_addserver '新主機名稱', local;
GO
=========================
記得下完上述指令後重啟動SQL server的服務,再用「SELECT @@SERVERNAME 」「SELECT * FROM sys.servers」檢查值是否正確,
再回到新增訂閱精靈連看看,就應該可以了
上述相關資訊參考以下連結::
這裡  及 這裡

2.終於把訂閱者做好也同步好了,這次我是用「交易式發行集」,結果訂閱端會出現些現象
  A:沒有pk的table沒被同步過去,. .B.trigger物件沒被同步過去,合理的,因為真的只是要「交易」同步去訂閱者SQL server上,
 如果要把目前(發行者)DB中的trigger找出來呢?
請用以下指令:
======================================
SELECT
    sysobjects.name AS trigger_name
    --,USER_NAME(sysobjects.uid) AS trigger_owner
    --,s.name AS table_schema
    --,OBJECT_NAME(parent_obj) AS table_name
    --,OBJECTPROPERTY( id, 'ExecIsUpdateTrigger') AS isupdate
    --,OBJECTPROPERTY( id, 'ExecIsDeleteTrigger') AS isdelete
    --,OBJECTPROPERTY( id, 'ExecIsInsertTrigger') AS isinsert
    --,OBJECTPROPERTY( id, 'ExecIsAfterTrigger') AS isafter
    --,OBJECTPROPERTY( id, 'ExecIsInsteadOfTrigger') AS isinsteadof
    --,OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') AS [disabled]
FROM sysobjects
/*
INNER JOIN sysusers
    ON sysobjects.uid = sysusers.uid
*/ 
INNER JOIN sys.tables t
    ON sysobjects.parent_obj = t.object_id

INNER JOIN sys.schemas s
    ON t.schema_id = s.schema_id
WHERE sysobjects.type = 'TR'
EXCEPT
SELECT OBJECT_NAME(parent_id) as Table_Name FROM sys.triggers
=====================================
上述的指令參考這裡的討論

------------這次的施作意外收獲真不少--------------