1

ユーザーテーブルがあり、すべてのユーザーには一意の電子メールとユーザー名があります。コード内でこれを実行しようとしていますが、ユーザーが同じユーザー名の電子メールでデータベースに挿入 (または更新) されないようにしたいと考えています。BEFORE INSERT重複ユーザーの挿入を防ぐトリガーを追加しました。

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

しかし、更新トリガーについては、これを行う方法がわかりません。Google でこの例を見つけました: 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.
4

7 に答える 7

13

テーブルに一意の制約を追加できます。これにより、重複を挿入または更新して作成しようとするとエラーが発生します

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) 程度に減らすと、一意のインデックスを使用できます。

于 2009-02-13T14:31:21.763 に答える
5

1 つ以上の一意のインデックスを使用するだけでなく、多くの作業が必要に思えます。インデックスルートに行かなかった理由はありますか?

于 2009-02-13T14:25:50.997 に答える
2

データベースの列に UNIQUE 属性を使用しないのはなぜですか? 重複を挿入しようとすると、SQLサーバーがそれを強制し、エラーをスローするように設定します。

于 2009-02-13T14:27:21.973 に答える
2

そのためには、これらの各列でSQLUNIQUE制約を使用する必要があります。

于 2009-02-13T14:28:17.400 に答える
1

が以下になるとすぐにUNIQUE INDEX上に作成できます。NVARCHARNVARCHAR(450)

UNIQUEそんなに大きな列が本当に必要ですか?

于 2009-02-13T14:39:37.280 に答える
0

SQL Server で UNIQUE 制約/インデックス ソリューションを使用する場合、その列で許可される null 値は 1 つだけであることに注意してください。したがって、たとえば、メール アドレスをオプションにしたい場合、1 人のユーザーしか空のメール アドレスを持つことができないため、機能しません。その場合、トリガーやフィルター選択されたインデックスなどの別のアプローチに頼る必要があります。

于 2009-07-04T01:11:01.520 に答える