2010年9月

SQLServer 解决“错误15023:当前数据库中已存在用户或角色”

在使用SQL Server 2000时,我们经常会遇到一个情况:需要把一台服务器上的数据库转移到另外一台服务器上。而转移完成后,需要给一个”登录”关联一个"用户"时,往往会发生错误:

错误15023:当前数据库中已存在用户或角色

这个问题非常棘手,几经排常找到了原因与解决方法,因为这个问题与解决方法均比较复杂,所以把这个过程中的一些经验纪录下来与大家分享,希望能对大家以后的类似操作有所帮助。

原因及解决办法如下:

首先介绍一下sql server中“登录”与“用户”的区别,“登录”用于用户身份验证,而数据库“用户”帐户用于数据库访问和权限验证。登录通过安全识别符 (SID) 与用户关联。将数据库恢复到其他服务器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户。这种情况被称为存在“孤立用户”。此时是不能通过新建登录或者是对同名登录授予对应数据库的“用户”权限来解决登录问题,因为SQL Server会报出“错误15023:当前数据库中已存在用户或角色”。为了解决这个问题,需要调用系统存储过程sp_change_users_login,具体用法如下:

Use netzs

go
sp_change_users_login 'update_one', 'yjsy232', 'yjsy232'

其中netzs为存在孤立用户的数据库,update_one是存储过程的参数,表示只处理一个用户,前一个yjsy232是“用户”,后一个yjsy232是“登录”,以上这个SQL表示将服务器登录“yjsy232”与 netzs 数据库用户“yjsy232”重新连接起来。这样就可以正常使用数据库了。

关于jQuery的trigger('click')或click()无法触发链接的点击事件

自jQuery1.3.2以后,jQuery对象的事件就不触发dom自带的事件了,如以前的$('a').click()可以实现点击这个链接,但1.3.2和之后的版本都不支持了,有什么办法可以兼容IE、Firefox、Chrome的触发这个事件呢,下面的代码就可以实现了。

if(document.all)
	linkObj.click();
else
{
	var evt = document.createEvent("MouseEvents");
	evt.initEvent("click", true, true);
	linkObj.dispatchEvent(evt);
}

几个国外不错的一次性邮箱

注册论坛,网站验证需要E-mail?又不想收到垃圾邮件,用一次性自爆邮箱就OK了,推荐一个不错的。

10minutemail:极有名的一次性邮箱提供商。10分钟自爆,还支持中文。打开网页就为你提供了一个邮箱地址。复制下来就OK了。
spam.la:简单易用,DreamHost的副产品。邮件都是公开的,这点不是很爽,用了一下收信有时也很慢。
jetable:也是比较老的一个服务了,期限从1个小时到一个月。 推荐
Spambox:邮箱自爆时间可以自定义,可以从30分钟到1年。推荐

Mailinator:临时邮箱格式:M8R-xxx@mailinator.com。不错,推荐,收信速度快。
tempemail:很简洁。
mailexpire:自爆时间可以从12小时到3个月自行选择。
spamfree24:最大特点是域名后缀选择性多一些。收信速度还不错。
guerrillamail:15分钟自爆,国内访问速度比较慢。

清空MSSQL数据库日志与set recovery simple

1.打开查询分析器,输入命令 DUMP TRANSACTION 数据库名称 WITH NO_LOG

2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。

如果以后不想要它变大 SQL2000下使用: 在数据库上点右键->属性->选项->故障恢复-模型-选择-简单模型。 或用SQL语句: alter database 数据库名 set recovery simple

GetFiles(searchPattern)匹配的问题

在 searchPattern 中允许使用以下通配说明符。

通配符 描述
* 零个或多个字符。
? 正好一个字符。

通配说明符以外的字符表示它们自己。例如,searchPattern 字符串“*t”搜索 path 中所有以字母“t”结尾的名称。searchPattern 字符串“s*”搜索 path 中所有以字母“s”开头的名称。

扩展名恰好是三个字符时的 searchPattern 匹配行为与扩展名多于三个字符时不同。恰好为三个字符的 searchPattern 返回扩展名为三个或三个以上字符的文件。一个字符、两个字符或三个以上字符的 searchPattern 只返回扩展名恰好等于该长度的文件。

以下列表显示了 searchPattern 参数的不同长度的行为:

“*.xyz”返回扩展名为 .xyz、.xyzw、.xyzwa、.xyzwab等的文件。
“*.xyzw”只返回扩展名为 .xyzw的文件。
“*.xyzwa”只返回扩展名为 .xyzwa的文件。
“*.xyzwab”只返回扩展名为 .xyzwab的文件。

为什么偏偏当扩展名是3个字符的时候就特殊呢??据说是以前dos系统就是这样设计的,.net沿用。

让wordpress3.0.1的主题支持菜单

升了级后,发现使用的主题不支持菜单,以前的导航都无法显示了。在主题functions.php中加入:
// This theme uses wp_nav_menu() in one location.
register_nav_menus( array(
'primary' => __( 'Primary Navigation', 'twentyten' ),
) );
但只修改这里,并不会真正在主题导航菜单上启用这个功能,只会在侧边小工具中多出custom menu小工具一项,还需修改导航部分代码,才会体验到新的功能。
一般主题导航部分代码为:
<?php wp_list_pages('title_li='); ?>
或:
<?php wp_list_categories('sorderby=name&depth=4&title_li='); ?>
改为
<?php wp_nav_menu( 'id=navbar' ); ?>
也可以根据自己使用的主题功能修改为类似:
<?php wp_nav_menu( 'id=navbar&menu_class=headermenu' ); ?>

.net framework2.0,3.0,3.5的CookieContainer的bug解决方法

用HttpWebRequest发送请求,附上了CookieContainer(CookieContainer里面确定已经包含了所有需要的Cookie),但是当发送请求后某些Cookie并没有发送出去,调试了两天,一直觉得是请求的网站设了什么古怪的限制,使请求老是发送不成功,最后用SocketSniff抓包发现少发送了几个Cookie(因为这些cookie涉及到几个子域名),检查CookieContainer,里面确实有这几个Cookie,最后只好反编译HttpWebRequest,在类CookieModule里发现方法OnSendingHeaders的如下代码,这个是把cookie设置到headers里面的关键地方:

internal static void OnSendingHeaders(HttpWebRequest httpWebRequest)
{
try
{
if (httpWebRequest.CookieContainer != null)
{
string str;
httpWebRequest.Headers.RemoveInternal("Cookie");
string cookieHeader = httpWebRequest.CookieContainer.GetCookieHeader(httpWebRequest.Address, out str);
if (cookieHeader.Length > 0)
{
httpWebRequest.Headers["Cookie"] = cookieHeader;
}
}
}
catch
{
}
}
问题出在GetCookieHeader这个方法里面,某些Cookie的domain判断错误导致没有附加上去。.Net framework4.0以下的都存在此问题。最后把程序框架调到4.0的,就没有这个问题了。当然4.0以下的框架版本可以用下面的方法处理一下CookieContainer里面domain。
  1. Don't use .Add(Cookie), Use only .Add(Uri, Cookie) method.
  2. Call BugFix_CookieDomain each time you add a cookie to the container or before you use .GetCookie or before system use the container.

    privatevoidBugFix_CookieDomain(CookieContainercookieContainer){   System.Type_ContainerType=typeof(CookieContainer);   Hashtabletable=(Hashtable)_ContainerType.InvokeMember("m_domainTable",                               System.Reflection.BindingFlags.NonPublic|                               System.Reflection.BindingFlags.GetField|                               System.Reflection.BindingFlags.Instance,                               null,                               cookieContainer,                               newobject[]{});   ArrayListkeys=newArrayList(table.Keys);   foreach(stringkeyObjinkeys)   {       stringkey=(keyObjasstring);       if(key[0]=='.')       {           stringnewKey=key.Remove(0,1);            table[newKey]=table[keyObj];       }   }}