我正在构建一个与SQL Server一起使用的.NET站点的用户注册。
我已经编写了一个存储过程来插入新用户。在插入之前,我想确保用户尚未注册。
用户名是他的电子邮件地址,在插入之前我正在进行以下检查:
IF EXISTS (SELECT 1 FROM dbo.Members WHERE _Email = @Email)
BEGIN
SELECT @UsernameAlreadyInUse
RETURN @UsernameAlreadyInUse
END
这是一个好方法吗?如果我有很多用户不会对我的表进行全面扫描并且实际上很慢?这种情况的最佳做法是什么?
由于
答案 0 :(得分:1)
如果您只想打一次数据库,可以选择以下方法。
您尝试INSERT,并跟踪@@ ROWCOUNT。
你的决定应该基于你是否认为“碰撞”是普通的,或者是罕见的。
我喜欢下面的内容,因为我觉得碰撞不会经常发生。 我得到“检查”和(可能的?)INSERT工作.........与一个db命中。
说完.......如果您使用MembershipProvider,我强烈建议您使用库中的方法来完成您需要做的事情。而不是直接处理数据库。 它是一个MembershipProvider模型,并且存在,因此您可以将“具体”实现(SqlMembershipProvider(下面的URL))换成另一个实现最少的更改。
http://msdn.microsoft.com/en-us/library/system.web.security.sqlmembershipprovider%28v=vs.110%29.aspx
/* START TSQL */
if exists ( SELECT * FROM information_schema.tables WHERE table_schema = 'dbo' and table_name = 'UserInfo' )
BEGIN
print 'About to DROP TABLE [dbo].[UserInfo]'
DROP TABLE [dbo].[UserInfo]
print 'TABLE [dbo].[UserInfo] dropped'
print ''
END
GO
CREATE TABLE [dbo].[UserInfo] (
UserInfoUUID [uniqueidentifier] not null default NEWSEQUENTIALID() ,
EmailAddress varchar(64) not null
)
GO
ALTER TABLE dbo.UserInfo ADD CONSTRAINT PK_UserInfo_UserInfoUUID
PRIMARY KEY CLUSTERED (UserInfoUUID)
GO
ALTER TABLE dbo.UserInfo ADD CONSTRAINT CK_UserInfo_UserInfoName_UNIQUE
UNIQUE (EmailAddress)
GO
SET NOCOUNT ON
declare @MyRowCount bigint
declare @UsernameAlreadyInUse bit
declare @EmailAddress varchar(64)
select @EmailAddress = 'bill@ms.com'
INSERT INTO [dbo].[UserInfo] ( EmailAddress )
Select @EmailAddress where not exists (select null from dbo.UserInfo innerUI where innerUI.EmailAddress = @EmailAddress)
select @MyRowCount = @@ROWCOUNT
Select @UsernameAlreadyInUse = 0
if (@MyRowCount = 0)
BEGIN
select @UsernameAlreadyInUse = 1
END
select * from [dbo].[UserInfo]
print '1st @UsernameAlreadyInUse'
print @UsernameAlreadyInUse
print ''
INSERT INTO [dbo].[UserInfo] ( EmailAddress )
Select @EmailAddress where not exists (select null from dbo.UserInfo innerUI where innerUI.EmailAddress = @EmailAddress)
select @MyRowCount = @@ROWCOUNT
Select @UsernameAlreadyInUse = 0
if (@MyRowCount = 0)
BEGIN
select @UsernameAlreadyInUse = 1
END
select * from [dbo].[UserInfo]
print '2nd @UsernameAlreadyInUse'
print @UsernameAlreadyInUse
print ''
SET NOCOUNT OFF
答案 1 :(得分:0)
IF EXISTS (SELECT Name FROM dbo.Members WHERE _Email = @Email)
BEGIN
RAISERROR('User Already Exist',16,1)
END