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 ' ;
然後在使用禁用的方式
,就可以完成發佈訂閱的處理了。