摘要:
在维护一个网站,原开发者存储日期时,都是使用int数据类型,如20120218等。现Insus.NET获取这个字段做其它处理,得先需要把它们转为DateTime数据类型。因此产生以下这个User-Defined Functions(自定义函数):udf_ConvertIntDatetimeCREAT... 阅读全文
摘要:
此篇博文是这篇密码需要带特殊字符的升级篇,前一篇的存储过程产生的密码随机数,有可能一个随机数就包含有过多的特殊字符,而且第一个字符就有可能是特殊字符。因此产生此篇,随机密码首字符不能为数字与特殊字符但必须包含且只有一个特殊字符。另外还修正了特殊字符集长度问题,使用特殊字符集长度减一(LEN(@SpecialCharacter) - 1) 这样当你增减特殊字符集时,再不需多次地方一同修改。修正前:SUBSTRING(@SpecialCharacter,CONVERT(TINYINT,ROUND(RAND()*6+1,0)),1)修正后:SUBSTRING(@SpecialCharacter,CO 阅读全文
摘要:
需要为程序中添加此功能。系统管理可以管理设置此参数,Default值为0,更新大于0,说明启用功能。其实它和用户管理表中的另外一个选项“密码永不过期”相辅相成之后,才能成形一个完整的功能。管理员更新“密码过期天数”选项值,如果由大于0的数值更新为0(初始值),数据库触发器会检查用户管理表中的“密码永不过期”选项或“密码过期日期”是否有值,如果条件为真,更新动作终止。tri_PasswordParameter_Update SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOALTERTRIGGER[dbo].[tri_PasswordParameter_Updat 阅读全文
摘要:
最近开发SQL想控制某些字段,不能手动直接在SQL 编辑更改,因而想到SQL只读字段功能。就比如实现的用户锁定时间,以及密码过期时间,这两个字段均是由密码参数相关设置而系统变更,为了不想让人为在数据手动更改它们,产生与策略相违的做法,因此Insus.NET特为此表写了一个更新(UPDATE)触发器,实现让SQL的字段有只读功能。如:tri_Users_Update CREATETRIGGER[dbo].[tri_Users_Update]ON[dbo].[Users]FORUPDATEASIFUPDATE([LockoutDate])--用户锁定时间BEGINRAISERROR(N'禁 阅读全文
摘要:
今天分享密码策略的重试次数与登录失败锁定持续的小功能。软件中,需要一个管理介面,可让系统管理设置相关的参数,这些设置将保存于数据库中,这两个参数初始化为0,如果大于0,说明管理员已经启用此功能。如下:从功能上看,只是涉及至验证用户与登录时需要实现在功能,Insus.NET不想改动太多地方,特别是程序部分,因此Insus.NET只是修改用户登录验证的一个存储过程:逻辑太约分几步,首先是密码参数表获取上图中两个参数:View Code DECLARE@NumberOfRetriesTINYINT=[dbo].[udf_GetPasswordParameterValue](1)DECLARE@Loc 阅读全文
摘要:
“Hi,我看了你这篇 三个随机产生密码的存储过程 最后一种的写法随机产生密码,觉得很好,并应用在我的程序中,但是上星期老板对我说,要在随机产生的密码带有特殊字符。我再次测试过之后,才发现你的函数产生的密码只是大小写英文字母和数字,并无包含特殊字符,我要怎样改它呢?”上面全文来自QQ留言。解决你的问题,需要使用上面相同一篇博文的第二种方法相结合,才可以,其实方法还有其它的,下面仅是Insus.NET想到的一种,仅供你参考,有问题,请继续来信,留言或在线讨论:usp_RandomPassword ALTERPROCEDURE[dbo].[usp_RandomPassword](@LengthINT 阅读全文
摘要:
需要为程序加一些功能,如下表,这些设置可让管理员根据自己实际情况设置,缺省值为0不作任限制。由于不是全新开发,而是在现在有程序补充功能,Insus.NET不想在程序作过多更改,只好修改存储过程来实现它们。现下面把实现上图highlight的选项功能分享出来。保持密码原有记录值,只要管理员设置了密码策略之后,用户更改自己的密码时,就会应用到了新密码策略。首先写一个获取参数值的自定义函数:udf_GetPasswordParameterValue SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--================================= 阅读全文
摘要:
重构,每天对Insus.NET来说,是必须的工作,不过一直是着重C#程序。昨晚在家中修改SQL一个小问题时,无意中看到一个触发器虽然它能正确运行,但值得重构它。这个触发器功能是当用户预定会议室成功之后,系统会发送一封预定成功的确认函邮件。下面代码是原始触发器tri_MeetingRoomBooking_BookingSuccessNotify SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:Insus.NET--Createdate: 2011-08 阅读全文
摘要:
协助一个朋友做一个小网站,其中一个功能,是让用户注册成功之后,系统将随机产生一个登录密码,并自动发送至注册邮箱中,朋友的做法是为了用户使用真实邮箱。随机产生密码,Insus.NET总结了三个,并分别写成了存储过程。第一个,usp_RandomPassword CREATEPROCEDURE[dbo].[usp_RandomPassword](@LengthINT=8)ASBEGINDECLARE@RandomPasswordNVARCHAR(MAX)=N'',@LINT=1WHILE@L<=@Length--循环密码长度BEGIN--随机产生每一位字符,ASCII码48至 阅读全文
摘要:
开发的软件中是允许用户可以更自己的密码,现在客户有这样一个要求,是当用户更新密码时,要限制用户不能重新使用最近三次的历史密码。实现客户的要求,唯有在数据库,创建一个密码更新Log表,然后再为Member表写一个触发器,每当用户更新密码时,去检索这个Log表,看看这次更新的密码是否存在Log表中,如果存在,提示用户,返之继续更新动作,然后把更新的信息插入Log表中,最后是删除Log记录,只保留此用户最近三次记录。相关代码,可以参考:MemberPasswordChangeLog CREATETABLEMemberPasswordChangeLog(Log_IdINTIDENTITY(1,1)PR 阅读全文
摘要:
“大哥,看了你这篇博文http://www.cnblogs.com/insus/archive/2012/01/27/2330058.html,我怎样才能产生10个且每个有8位不相同的随机数字?”刚才有位网友在SKYPE问及如上问题。好的,Insus.NET也正想写一个存储过程来应用上面这篇的SQL语句,你可以参考如下的存储过程,如果还问题请继续讨论。usp_RandomNumber CREATEPROCEDURE[dbo].[usp_RandomNumber](@LenINT=1,--随机数位数@RowsINT=1--随机笔数)ASBEGINDECLARE@TASTABLE([RandomN 阅读全文
摘要:
MS SQL有一个函数CHAR()是将int(0-255) ASCII代码转换为字符。那我们可以使用下面MS SQL语句,可以随机生成小写、大写字母,特殊字符和数字。大写字母:CHAR(ROUND(RAND() * 25 + 65,0))小写字母:CHAR(ROUND(RAND() * 25 + 97,0))特殊字符:CHAR(ROUND(RAND()*13+33,0))数字:CHAR(ROUND(RAND()*9+48,0)) 阅读全文
摘要:
你想获取某一年份第一周开始的日期,Insus.NET给你的答案,可以参考使用下面这个函数:http://www.cnblogs.com/insus/articles/1622988.htmlSELECT[StartDate]FROM[dbo].[udf_Week](2012,2012)WHERE[Week]=1上面SQL语句执行结果:但你还是觉得此方法很复杂,而且只需要日期部分,时间部分无需显示。因此Insus.NET更改并产生如下一个新函数,你把函数附加入你的数据库中,即可在程序中应用它了。udf_StartDateOfFirstWeek SETANSI_NULLSONGOSETQUOTED 阅读全文
摘要:
一个旧有系统需要从另一个新系统获取数据。由于两个系统数据库的的排序规规则不同。在存储过程中SELECT数据时,引发了“无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突。”错误。参考截图两个数据的排序规则:Insus.NET没有尝试去更新数据库的collation排序规则,担心会对其它数据的影响。但是问题出现了,还是需要想办法去解决的。在有问题的存过程中,写一个与目标表结构相同的临时表,在设计临时表,在出现问题的字段加上与数据源表的排序规则。如: 阅读全文
摘要:
Msg 102, Level 15, State 1, Line 3Incorrect syntax near '+'.当你尝试执行下面这段代码时,会得到如上这个错误提示。View Code DECLARE@MyNameNVARCHAR(100)DECLARE@FieldNameSYSNAME=N'Name'EXECUTEsp_executesqlN'SELECTTOP1@OutputName=['+@FieldName+']FROM[dbo].[Member]',N'@OutputNameNVARCHAR(100)OUT 阅读全文
摘要:
相关的OBJECTPROPERTY可参考:http://msdn.microsoft.com/en-us/library/ms176105.aspx开发过程中,错误免不了。为了纠正错误与规范化。可以使用MS SQL Server的系统存储过程sp_rename与OBJECTPROPERTY来更改重命名。实例一,更改表名:View Code IFEXISTS(SELECTTOP11FROMdbo.sysobjectsWHEREid=object_id(N'[dbo].[Employee]')ANDOBJECTPROPERTY(id,N'IsUserTable')= 阅读全文
摘要:
从SQL Server的视图INFORMATION_SCHEMA 中用INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 和INFORMATION_SCHEMA.TABLE_CONSTRAINTS两个视图INNER JOIN在一起,可以列出需要的数据,下面Insus.NET把它写成一个自定义函数:udf_KeyColumns CREATEFUNCTION[dbo].[udf_KeyColumns]()RETURNSTABLEASRETURN(SELECTkcu.[TABLE_NAME],kcu.[COLUMN_NAME],kcu.[ORDINAL_POSITI 阅读全文
摘要:
参考下面sp_executesql单个输出参数,@I变量为动态列名,列名后缀n或是c,为了比较更新前后值是否发生了变化,分别做了两次SELECT取值,程代码冗余和产生不容忽视性能的问题。:View Code SET@sql=N'SELECT@N=['+CONVERT(NVARCHAR(MAX),@I)+'n]FROM#inserted'EXECUTEsp_executesql@sql,N'@NDECIMAL(18,0)OUTPUT',@NnOUTPUT;SET@sql=N'SELECT@O=['+CONVERT(NVARCHAR( 阅读全文
摘要:
C#中有如下bool判断:第一种:boolisExist=false;if(isExist==true){//...}第二种:boolisExist=false;if(isExist){//...}T-SQL中判断记录是否存在:第一种:IF(SELECTCOUNT(*)FROM[tableName])>0BEGIN--...ENd第二种:IFEXISTS(SELECTTOP11FROM[tableName])BEGIN--...ENdInsus.NET的选择,不管是C#还是T-SQL均为第二种。 阅读全文
摘要:
平常时写触发器(TRIGGER),一般会分别写插入(INSERT),删除(DELETE)和更新(UPDATE)单独的触发器。但是有时候,可以视看处进逻辑程度,可以把三者写成一个触发器,只是在其中稍作判断而已。你可以根据从下面方法判断触发器是是处理了插入,删除还是更新触发的:View Code --宣告两个变量DECLARE@DBIT=0DECLARE@IBIT=0--如果在DELETED内部临时触发表找到记录,说明旧数据被删除IFEXISTS(SELECTTOP11FROMDELETED)SET@D=1--如果在INSERTED内部临时触发表找到记录,说明有新数据插入IFEXISTS(SELE 阅读全文