I'm a forty-something Microsoft SQL Server DBA of 12+ years, a devoted husband, and a father of two young boys (with another coming soon!). I have been a DBA at a university, at a major bank, at a healthcare system, and I now work as a consultant with customers across the United States.
I recently had a colleague request help with a replication problem he was having with a client. The client was running transactional replication from a SQL Server 2005 Publisher to multiple SQL Server 2005 Subscribers and was having issues after attempting to add several articles (tables) to an existing publication.
The initial error reported on multiple subscribers looked like this in Replication Monitor:
“Unable to replicate a view or function because the referenced objects or columns are not present on the Subscriber.”
To me this said that some of the article changes that had been made during the publication change hadn’t been properly sent to the subscribers, so I decided to reinitialize all subscriptions:
(Another colleague pointed out that I could have reinitialized only the broken subscriptions one-by-one, but in this case a majority of the subscriptions were broken and the publication was relatively small.)
Three of the four subscriptions failed re-initialization with two different errors, one with a object reference error and the other two with a replication error.
The first subscription, on SubServer1, failed re-initialization with the following error:
Cannot DROP TABLE 'dbo.Table99' because it is being referenced by object 'View1'.
I found that the referenced view was created with SCHEMABINDING, which was preventing the related table from being dropped and recreated. The view didn’t have any explicit permissions on it, so I scripted the view, dropped it, re-ran initialization for that subscription, which succeeded, and then recreated the view (again with SCHEMABINDING as it was originally).
SubServer2 and SubServer3 had a different but actually related issue:
In both of these cases, the re-initialization was failing because a table on the subscriber couldn’t drop a table being used in replication. What this essentially means is:
In Publication #1, PubServer1 is publishing to SubServer2
In Publication #2, SubServer2 is publishing one or more of the tables from Publication #1 to some other server or servers.
In essence, SubServer2 is both a subscriber to Publication #1 and a publisher of Publication #2 (often called a “re-publisher”). This results in the error seen above, because part of the default options for a re-initialization of a subscription is to drop and recreate the tables, and when a table is an article in a publication (in this case Publication #2 above) it cannot be dropped to reinitialize the subscription to Publication #1.
For information on re-publishing and the order of steps required to use it, see the TechNet article here and the blog post here. There are many limitations on both the publications and the subscriptions involved in such an arrangement.
The fix to this is alter the properties of the offending articles, or all articles, in the publication (in this case the change was made to all articles, but it could have been made one-by-one as well:
Changing article properties in this fashion automatically marks all subscriptions for re-initialization (assuming you don’t cancel out of the above dialog box). Your options are to accept the default as shown, in which case you need to manually run the snapshot agent job on the Distributor before the re-initialization will occur, or to check the “Generate the new snapshot now” box which will reach out to the Distributor and immediately fire the snapshot agent job, beginning the re-initialization process right away.
The decision on what to do here should be based on how critical the replication is to your infrastructure (if you need it fixed *now* you may have no alternative but to generate it right away) and how large the publication itself is (a large publication can be time- and resource-intensive to generate and transfer a snapshot during business hours).
In this case based on the tables included in the publication it was possible to “Generate the new snapshot now” because of its relatively small size. This re-initialization completed successfully on all subscribers with the “Delete Data” option configured.
The final item here is that my notes above about the SCHEMABINDING view would not be completely relevant had I first discovered the republishing situation. The SCHEMABINDING view broke that single subscriber because the SCHEMABINDING prevented the table from being dropped, but had the article's property been set to “Delete Data” rather than “Drop and Recreate” the SCHEMABINDING issue would have been handled without dropping and recreating the view.
Hope this helps!