我们有一个用户表,每个用户都有一个唯一的电子邮件和用户名.我们尝试在我们的代码中执行此操作,但我们希望确保用户永远不会使用相同的电子邮件用户名插入(或更新)数据库.我添加了一个BEFORE INSERT
Trigger,可防止重复用户的插入.
CREATE TRIGGER [dbo].[BeforeUpdateUser] ON [dbo].[Users] INSTEAD OF INSERT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE @Email nvarchar(MAX) DECLARE @UserName nvarchar(MAX) DECLARE @UserId int DECLARE @DoInsert bit SET @DoInsert = 1 SELECT @Email = Email, @UserName = UserName FROM INSERTED SELECT @UserId = UserId FROM Users WHERE Email = @Email IF (@UserId IS NOT NULL) BEGIN SET @DoInsert = 0 END SELECT @UserId = UserId FROM Users WHERE UserName = @UserName IF (@UserId IS NOT NULL) BEGIN SET @DoInsert = 0 END IF (@DoInsert = 1) BEGIN INSERT INTO Users SELECT FirstName, LastName, Email, Password, UserName, LanguageId, Data, IsDeleted FROM INSERTED END ELSE BEGIN DECLARE @ErrorMessage nvarchar(MAX) SET @ErrorMessage = 'The username and emailadress of a user must be unique!' RAISERROR 50001 @ErrorMessage END END
但对于Update触发器,我不知道如何做到这一点.我在谷歌找到了这个例子:http: //www.devarticles.com/c/a/SQL-Server/Using-Triggers-In-MS-SQL-Server/2/ 但我不知道它是否适用当您一次更新多个列时.
编辑:
我试图在这些列上添加一个唯一约束,但它不起作用:
Msg 1919, Level 16, State 1, Line 1 Column 'Email' in table 'Users' is of a type that is invalid for use as a key column in an index.
Robin Day.. 12
您可以在表上添加唯一约束,如果您尝试插入或更新并创建重复项,则会引发错误
ALTER TABLE [Users] ADD CONSTRAINT [IX_UniqueUserEmail] UNIQUE NONCLUSTERED ( [Email] ASC ) ALTER TABLE [Users] ADD CONSTRAINT [IX_UniqueUserName] UNIQUE NONCLUSTERED ( [UserName] ASC )
编辑:好的,我刚刚读了你的评论到另一篇文章,看到你正在使用NVARCHAR(MAX)作为你的数据类型.您是否有理由要求超过4000个字符的电子邮件地址或用户名?这就是你的问题所在.如果将其减少到NVARCHAR(250)或其左右,则可以使用唯一索引.
您可以在表上添加唯一约束,如果您尝试插入或更新并创建重复项,则会引发错误
ALTER TABLE [Users] ADD CONSTRAINT [IX_UniqueUserEmail] UNIQUE NONCLUSTERED ( [Email] ASC ) ALTER TABLE [Users] ADD CONSTRAINT [IX_UniqueUserName] UNIQUE NONCLUSTERED ( [UserName] ASC )
编辑:好的,我刚刚读了你的评论到另一篇文章,看到你正在使用NVARCHAR(MAX)作为你的数据类型.您是否有理由要求超过4000个字符的电子邮件地址或用户名?这就是你的问题所在.如果将其减少到NVARCHAR(250)或其左右,则可以使用唯一索引.