<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>sharepointers : fix</title><link>http://blogs.msdn.com/skelley/archive/tags/fix/default.aspx</link><description>Tags: fix</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>sharepoint alerts: how to repair them after a web app move</title><link>http://blogs.msdn.com/skelley/archive/2007/06/18/alerts.aspx</link><pubDate>Mon, 18 Jun 2007 23:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:3390563</guid><dc:creator>skelley</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/skelley/comments/3390563.aspx</comments><wfw:commentRss>http://blogs.msdn.com/skelley/commentrss.aspx?PostID=3390563</wfw:commentRss><description>&lt;p&gt;this past weekend we&amp;nbsp;had a sharepoint&amp;nbsp;farm where we needed to detach the databases and reattach them to a different web application. &lt;/p&gt; &lt;p&gt;this can break a lot of things, &lt;a href="http://blogs.msdn.com/mikewat" mce_href="http://blogs.msdn.com/mikewat"&gt;dr watson&lt;/a&gt; has a &lt;a href="http://blogs.msdn.com/mikewat/archive/2007/06/18/moving-databases-between-web-apps.aspx" mce_href="http://blogs.msdn.com/mikewat/archive/2007/06/18/moving-databases-between-web-apps.aspx"&gt;good list of some of them&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;i'm going to focus on alerts and how to fix them (yep they break)&lt;/p&gt; &lt;p&gt;first of all there is a nice chunk of sample code to help fix this but its incomplete:&lt;/p&gt; &lt;p&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;936759" title="http://support.microsoft.com/default.aspx?scid=kb;en-us;936759" mce_href="http://support.microsoft.com/default.aspx?scid=kb;en-us;936759"&gt;http://support.microsoft.com/default.aspx?scid=kb;en-us;936759&lt;/a&gt;&lt;/p&gt; &lt;p&gt;here's the piece of code we care about:&lt;/p&gt; &lt;table unselectable="on" bgcolor="white" border="1" cellpadding="10" width="576"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td color="black" width="574"&gt;&lt;pre class="code"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;try&lt;/font&gt;&lt;br&gt;&lt;/span&gt;&lt;font color="#000000"&gt;{&lt;br&gt;    alert.Update();&lt;br&gt;    &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//Change the Alert frequency back to the initial state.&lt;br&gt;&lt;/span&gt;    alert.AlertFrequency = afPrevious;&lt;br&gt;    alert.Update();&lt;br&gt;}&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;catch&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;Exception&lt;/span&gt; ex)&lt;br&gt;{&lt;br&gt;    &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(163, 21, 21);"&gt;" -&amp;gt; Error changing Alert. {0}"&lt;/span&gt;, ex.Message);&lt;br&gt;} &lt;span style="color: rgb(0, 128, 0);"&gt;// inner try&lt;/span&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;basically all they're doing is changing a value in the alert, updating it, and then putting the value back to what it was.&lt;/p&gt;
&lt;p&gt;what this essentially does is update a hard coded value called &lt;b&gt;siteurl&lt;/b&gt; in the alerts table.&lt;/p&gt;
&lt;p&gt;this works, kinda&lt;/p&gt;
&lt;p&gt;the alerts will be sent out but the contents of the alerts will be referencing old links&lt;/p&gt;
&lt;p&gt;that's bad news. &lt;img src="http://spaces.live.com/rte/emoticons/heart_broken.gif" alt="heart_broken" mce_src="http://spaces.live.com/rte/emoticons/heart_broken.gif" align="absbottom"&gt;&lt;/p&gt;
&lt;p&gt;so how do we fix it? &lt;/p&gt;
&lt;p&gt;well lets start with the content&amp;nbsp;database tables that deal with alerts:&lt;/p&gt;
&lt;table unselectable="on" color="black" bgcolor="white" border="0" cellspacing="4" width="469"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="162"&gt;&lt;font color="#000000"&gt;&lt;b&gt;immedsubscriptions&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="293"&gt;&lt;font color="#000000"&gt;contains immediate alerts&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="163"&gt;&lt;font color="#000000"&gt;&lt;b&gt;schedsubscriptions&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;
&lt;td valign="top" width="293"&gt;&lt;font color="#000000"&gt;contains all other alerts (daily, weekly, etc)&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ok so lets have a look there&lt;/p&gt;
&lt;table unselectable="on" color="black" bgcolor="white" border="0" cellpadding="4" cellspacing="4" width="292"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="282"&gt;&lt;font color="#000000"&gt;select&amp;nbsp;top 20 * from immedsubscriptions&lt;br&gt;select top 20 * from schedsubscriptions&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;hmmm the column called properties seems to have some hard coded urls...&lt;/p&gt;
&lt;p&gt;(click to enlarge)&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/skelley/WindowsLiveWriter/alerts_C365/selectprops_2.png" mce_href="http://blogs.msdn.com/blogfiles/skelley/WindowsLiveWriter/alerts_C365/selectprops_2.png" atomicselection="true"&gt;&lt;img src="http://blogs.msdn.com/blogfiles/skelley/WindowsLiveWriter/alerts_C365/selectprops_thumb_2.png" style="border-width: 0px;" alt="selectprops" mce_src="http://blogs.msdn.com/blogfiles/skelley/WindowsLiveWriter/alerts_C365/selectprops_thumb_2.png" border="0" height="233" width="601"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;pretty strange since there is another field in that table called &lt;b&gt;siteurl &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;(fyi&amp;nbsp;updating the &lt;b&gt;siteurl&lt;/b&gt; in these tables is what the microsoft supplied&amp;nbsp;sample code fixes)... &lt;/p&gt;
&lt;p&gt;so&amp;nbsp;why not just use that &lt;b&gt;siteurl&lt;/b&gt;&amp;nbsp;as the url&amp;nbsp;in &lt;b&gt;properties&lt;/b&gt; instead of hard coding it?&amp;nbsp;&lt;/p&gt;
&lt;p&gt;no clue but they probably had a good reason. &lt;img src="http://spaces.live.com/rte/emoticons/fingerscrossed.gif" alt="fingerscrossed" mce_src="http://spaces.live.com/rte/emoticons/fingerscrossed.gif"&gt;&lt;/p&gt;
&lt;p&gt;anyways now we have to see whats in that bag... the property bag.&lt;/p&gt;
&lt;table unselectable="on" bgcolor="white" border="1" cellpadding="10" width="100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;pre class="code"&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; oldurl = "&lt;span style="color: rgb(163, 21, 21);"&gt;http://myoldwebapp&lt;/span&gt;"; &lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt; newurl = "&lt;span style="color: rgb(163, 21, 21);"&gt;http://mynewwebapp&lt;/span&gt;";&lt;/font&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;font color="#000000"&gt;SPPropertyBag spprop = alert.Properties;&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"siteurl"&lt;/span&gt;] != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)  &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//fix hard coded properties&lt;br&gt;&lt;/span&gt;{&lt;br&gt;    &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//Console.WriteLine("pre alert site url: " + spprop["siteurl"].ToString());&lt;br&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;(spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"siteurl"&lt;/span&gt;].Contains(oldurl))  &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//found old link reference/&lt;br&gt;&lt;/span&gt;    {&lt;br&gt;        spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"siteurl"&lt;/span&gt;] = spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"siteurl"&lt;/span&gt;].Replace(oldurl, newurl);&lt;br&gt;        &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//Console.WriteLine("post alert site url: " + spprop["siteurl"].ToString());&lt;br&gt;&lt;/span&gt;        &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(163, 21, 21);"&gt;"Updated siteurl in properties"&lt;/span&gt;);&lt;br&gt;        countsiteurlprop++;&lt;br&gt;        spprop.Update();&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"mobileurl"&lt;/span&gt;] != &lt;span style="color: rgb(0, 0, 255);"&gt;null&lt;/span&gt;)&lt;br&gt;{&lt;br&gt;    &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//Console.WriteLine("alert mobile url: " + spprop["mobileurl"].ToString());&lt;br&gt;&lt;br&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt; (spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"mobileurl"&lt;/span&gt;].Contains(oldurl))  &lt;/font&gt;&lt;font color="#000000"&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;//found old link reference/&lt;br&gt;&lt;/span&gt;    {&lt;br&gt;        spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"mobileurl"&lt;/span&gt;] = spprop[&lt;span style="color: rgb(163, 21, 21);"&gt;"mobileurl"&lt;/span&gt;].Replace(oldurl, newurl);&lt;br&gt;        &lt;span style="color: rgb(43, 145, 175);"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: rgb(163, 21, 21);"&gt;"Updated mobileurl in properties"&lt;/span&gt;);&lt;br&gt;        countmobileurlprop++;&lt;br&gt;        spprop.Update();&lt;br&gt;    }&lt;br&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;how did i know to look there? (i'm sleeping with the property bag lady)&lt;/p&gt;
&lt;p&gt;just kidding, it took a bit of tinkering considering that the &lt;b&gt;properties&lt;/b&gt; field&amp;nbsp;is not directly writable from an alerts object:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;SPAlert Properties&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/microsoft.sharepoint.spalert.properties.aspx" mce_href="http://msdn2.microsoft.com/microsoft.sharepoint.spalert.properties.aspx"&gt;Properties&lt;/a&gt;&amp;nbsp;Gets the properties of the alert. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spalert_properties.aspx" title="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spalert_properties.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spalert_properties.aspx"&gt;http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spalert_properties.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;if you want to set the alert, you must use the property bag. 
&lt;/p&gt;&lt;p&gt;this concludes how to fix alerts after a webapp move. i hope you like.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=3390563" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/skelley/archive/tags/fix/default.aspx">fix</category><category domain="http://blogs.msdn.com/skelley/archive/tags/alerts/default.aspx">alerts</category><category domain="http://blogs.msdn.com/skelley/archive/tags/repair/default.aspx">repair</category></item></channel></rss>