当前位置:  开发笔记 > 数据库 > 正文

添加约束以防止SQL Update触发器中出现重复

如何解决《添加约束以防止SQLUpdate触发器中出现重复》经验,为你挑选了1个好方法。

我们有一个用户表,每个用户都有一个唯一的电子邮件和用户名.我们尝试在我们的代码中执行此操作,但我们希望确保用户永远不会使用相同的电子邮件用户名插入(或更新)数据库.我添加了一个BEFORE INSERTTrigger,可防止重复用户的插入.

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)或其左右,则可以使用唯一索引.



1> Robin Day..:

您可以在表上添加唯一约束,如果您尝试插入或更新并创建重复项,则会引发错误

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)或其左右,则可以使用唯一索引.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有