|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
人力成本上的节省,MySQL的用户Spacemonkey实验室的首席执行官MitchPirtle如此表示:“维护MySQL使得你不需要一个年薪15万美元的DBA。可是,此时用户A存在于数据库A中,而新的MSSQL中固然能创立用户A,但没法把权限赋于用户A。新创立一个用户B吧,用户A创立的表和别的信息就又没法会见。在这里找到懂得决办法:
在源SQLServer上运转以下剧本。此剧本可在master数据库中创立名为sp_hexadecimal和sp_help_revlogin的两个存储历程。请在完成历程的创立以后持续实行第2步。
注重:上面的历程取决于SQLServer体系表。这些表的布局在SQLServer的分歧版本之间大概会有变更,请不要间接从体系表当选择。
-----BeginScript,Createsp_help_revloginprocedure-----
复制代码代码以下:
USEmaster
GO
IFOBJECT_ID(sp_hexadecimal)ISNOTNULL
DROPPROCEDUREsp_hexadecimal
GO
CREATEPROCEDUREsp_hexadecimal
@binvaluevarbinary(256),
@hexvaluevarchar(256)OUTPUT
AS
DECLARE@charvaluevarchar(256)
DECLARE@iint
DECLARE@lengthint
DECLARE@hexstringchar(16)
SELECT@charvalue=0x
SELECT@i=1
SELECT@length=DATALENGTH(@binvalue)
SELECT@hexstring=0123456789ABCDEF
WHILE(@i<=@length)
BEGIN
DECLARE@tempintint
DECLARE@firstintint
DECLARE@secondintint
SELECT@tempint=CONVERT(int,SUBSTRING(@binvalue,@i,1))
SELECT@firstint=FLOOR(@tempint/16)
SELECT@secondint=@tempint-(@firstint*16)
SELECT@charvalue=@charvalue+
SUBSTRING(@hexstring,@firstint+1,1)+
SUBSTRING(@hexstring,@secondint+1,1)
SELECT@i=@i+1
END
SELECT@hexvalue=@charvalue
GO
IFOBJECT_ID(sp_help_revlogin)ISNOTNULL
DROPPROCEDUREsp_help_revlogin
GO
CREATEPROCEDUREsp_help_revlogin@login_namesysname=NULLAS
DECLARE@namesysname
DECLARE@xstatusint
DECLARE@binpwdvarbinary(256)
DECLARE@txtpwdsysname
DECLARE@tmpstrvarchar(256)
DECLARE@SID_varbinaryvarbinary(85)
DECLARE@SID_stringvarchar(256)
IF(@login_nameISNULL)
DECLARElogin_cursCURSORFOR
SELECTsid,name,xstatus,passwordFROMmaster..sysxlogins
WHEREsrvidISNULLANDnamesa
ELSE
DECLARElogin_cursCURSORFOR
SELECTsid,name,xstatus,passwordFROMmaster..sysxlogins
WHEREsrvidISNULLANDname=@login_name
OPENlogin_curs
FETCHNEXTFROMlogin_cursINTO@SID_varbinary,@name,@xstatus,@binpwd
IF(@@fetch_status=-1)
BEGIN
PRINTNologin(s)found.
CLOSElogin_curs
DEALLOCATElogin_curs
RETURN-1
END
SET@tmpstr=/*sp_help_revloginscript
PRINT@tmpstr
SET@tmpstr=**Generated
+CONVERT(varchar,GETDATE())+on+@@SERVERNAME+*/
PRINT@tmpstr
PRINT
PRINTDECLARE@pwdsysname
WHILE(@@fetch_status-1)
BEGIN
IF(@@fetch_status-2)
BEGIN
PRINT
SET@tmpstr=--Login:+@name
PRINT@tmpstr
IF(@xstatus&4)=4
BEGIN--NTauthenticatedaccount/group
IF(@xstatus&1)=1
BEGIN--NTloginisdeniedaccess
SET@tmpstr=EXECmaster..sp_denylogin+@name+
PRINT@tmpstr
END
ELSEBEGIN--NTloginhasaccess
SET@tmpstr=EXECmaster..sp_grantlogin+@name+
PRINT@tmpstr
END
END
ELSEBEGIN--SQLServerauthentication
IF(@binpwdISNOTNULL)
BEGIN--Non-nullpassword
EXECsp_hexadecimal@binpwd,@txtpwdOUT
IF(@xstatus&2048)=2048
SET@tmpstr=SET@pwd=CONVERT(varchar(256),+@txtpwd+)
ELSE
SET@tmpstr=SET@pwd=CONVERT(varbinary(256),+@txtpwd+)
PRINT@tmpstr
EXECsp_hexadecimal@SID_varbinary,@SID_stringOUT
SET@tmpstr=EXECmaster..sp_addlogin+@name
+,@pwd,@sid=+@SID_string+,@encryptopt=
END
ELSEBEGIN
--Nullpassword
EXECsp_hexadecimal@SID_varbinary,@SID_stringOUT
SET@tmpstr=EXECmaster..sp_addlogin+@name
+,NULL,@sid=+@SID_string+,@encryptopt=
END
IF(@xstatus&2048)=2048
--loginupgradedfrom6.5
SET@tmpstr=@tmpstr+skip_encryption_old
ELSE
SET@tmpstr=@tmpstr+skip_encryption
PRINT@tmpstr
END
END
FETCHNEXTFROMlogin_cursINTO@SID_varbinary,@name,@xstatus,@binpwd
END
CLOSElogin_curs
DEALLOCATElogin_curs
RETURN0
GO
-----EndScript-----
2.在创立sp_help_revlogin存储历程后,请从源服务器上的查询剖析器中运转sp_help_revlogin历程。sp_help_revlogin存储历程可同时用于SQLServer7.0和SQLServer2000。sp_help_revlogin存储历程的输入是登录剧本,该剧本可创立带有原始SID和暗码的登录。保留输入,然后将其粘贴到方针SQLServer上的查询剖析器中,并运转它。比方:EXECmaster..sp_help_revlogin
复制代码代码以下:SP_DEFAULTDBcyiyun,DB_WAYUP
第1步后,在源服务器上运转sp_help_revlogin后,会发生创立用户数据的SQL,比方:
复制代码代码以下:
/*sp_help_revloginscript
**Generated062420091:40PMonWORKGROU-B1XTVC*/
DECLARE@pwdsysname
--Login:hxtest
SET@pwd=CONVERT(varbinary(256),0x0100CF4E7D342B359438E4BCCA72E6C83F44FCCF30C8016286DE2B359438E4BCCA72E6C83F44FCCF30C8016286DE)
EXECmaster..sp_addlogin520web,@pwd,@sid=0x1738BB6AD0CD24498F67FB5589E8EDCB,@encryptopt=skip_encryption
......
把这段间接在新服务器上运转,大概找到响应的用户名创立,就能够办理这个成绩了!关于这个理由我把它放在最后一位。在很多业界专家中有一个相当一致的观点:MySQL不能很好的扩展。关于这点可能有很大的分歧,争论的焦点主要集中于水平可扩展性和垂直可扩展性上。MySQL则更倾向于垂直可扩展性。 |
|