關於禁用發佈可能出現的問題處理

      SQL Server在訂閱和發佈是經常出現一些意想不到的問題,導致發佈訂閱無法使用,此時經常需要對發佈訂閱進行刪除,筆者經過多次試驗,發現直接刪除發佈和訂閱時,經常會出現刪除不徹底,表面現象就是因發佈訂閱而出現的觸發器、rowguid列等仍然存在,從而影響數據庫的正常使用,這樣還需要進一步對數據庫處理才能徹底清楚發佈和訂閱。

      其實在發佈和訂閱的選項裏面,有一個禁用發佈,使用此功能,一般會完成發佈訂閱的處理,也不會有任何的殘留,所以提示大家在做發佈和訂閱的處理時,儘量使用禁用功能,當然,這樣處理有時候也會產生一些異常,對於遺留下的觸發器、rowguid列的問題,我們可以用一些腳本處理掉,腳本如下:

 

-- drop rowguid indexes

select 'drop index ' + sysobjects. name + '.' + sysindexes. name from

sysindexes

inner join sysobjects

on sysindexes. id = sysobjects. id

where objectproperty ( object_id ( sysobjects. name), 'IsMSShipped' ) = 0

and sysindexes. indid > 0 and sysindexes. indid < 255 and ( sysindexes. status &

64)= 0

and index_col ( sysobjects. name, sysindexes. indid, 1) = 'rowguid'

order by sysindexes. indid

 

-- remove rowguid default constraints

select 'alter table ' + b. name + ' drop constraint ' + a. name from

sysobjects a

inner join syscolumns on syscolumns. id = a. parent_obj

inner join sysobjects b on syscolumns. id = b. id

where syscolumns. name = 'rowguid'

and objectproperty ( object_id ( b. name), 'IsMSShipped' ) = 0

and a. xtype = 'D'

 

-- remove rowguid columns

select 'alter table ' + sysobjects. name + ' drop column ''rowguid'' ' from

syscolumns

inner join sysobjects on syscolumns. id = sysobjects. id

where syscolumns. name = 'rowguid'

and objectproperty ( object_id ( sysobjects. name), 'IsMSShipped' ) = 0

 

 

有時候 ,還會出現一下提示,

“標題: Microsoft SQL Server Management Studio
------------------------------

無 法刪除發佈“XXXX”。

有關幫助信息,請單擊: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.0.1600.22&EvtSrc=Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.Replication.ReplicationMenuItem&EvtID=CantDeletePublication&LinkId=20476

------------------------------
其 他信息:

執行 Transact-SQL 語句或批處理時發生了異常。 (Microsoft.SqlServer.ConnectionInfo)

------------------------------

無法作爲數據庫主體執行,因爲主體 "dbo" 不存在、無法模擬這種類型的主體,或您沒有所需的權限。
已將數據庫上下文更改爲 'XXXX'。 (Microsoft SQL Server,錯誤: 15517
)

有關幫助信息,請單擊: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=15517&LinkId=20476

其實產生上述問題的主要原因是兩方面:

1、可能是因爲孤立用戶引起的,其處理方式如下:

 

USE
 出問題的庫名;

GO
-- 查看孤立用戶
EXEC sp_change_users_login ' Report ' ;
GO
-- 修復孤立用戶
EXEC sp_change_users_login ' Auto_Fix ' , ' 孤立用戶名 ' , NULL , ' 用戶密碼 ' ;

還有一種情況是因爲數據庫的owner出現異常引起了
,解決方案如下:

USE 出問題的庫名;
EXEC sp_changedbowner ' sa ' ;

然後在使用禁用的方式

,就可以完成發佈訂閱的處理了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章