追加の制約を防ぐ重複をSQL更新のトリガー
-
23-08-2019 - |
質問
したユーザテーブル、ユーザーにユニークなメールユーザ名です。が行われているか体感してみてはこの内のコードがしたいと思っていユーザーが挿入されない(または更新)データベースに登録した同一usernameを持の送いたします。私を追加 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
もの更新のトリガから評価を頂きましたかではないかと思います。がその場で発音を確認することがこの例です: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.
解決
を追加できる独自のcontraint、これを誤っている場合、挿入や更新を重複
ALTER TABLE [Users] ADD CONSTRAINT [IX_UniqueUserEmail] UNIQUE NONCLUSTERED
(
[Email] ASC
)
ALTER TABLE [Users] ADD CONSTRAINT [IX_UniqueUserName] UNIQUE NONCLUSTERED
(
[UserName] ASC
)
編集:Ok、私は読コメントもポストやこだNVARCHAR(MAX)としてデータ型になります。ある理由が4000以上の文字メールアドレスまたはユーザー名?ここでの問題があると考えています。を小さくすればするNVARCHAR(250)または黒字にを利用することができ独自の指数です。
他のヒント
当社はその双方をあわせ持っていくのではなスを作成します。理由がありまんがの指数路線?
なぜならず利用の属性をカラムデータベース?設定のSQLサーバーを実施するように誤っている場合を挿入する惑わ.
のものを使用できるSQL文 UNIQUE
制約がそれぞれのカラムです。
を作成でき UNIQUE INDEX
関 NVARCHAR
次も可能ですので、その点も便利で NVARCHAR(450)
以下に抑えます。
なおす UNIQUE
カラムするので大きいの?
一般的に、私のようなトリガを可能な限りなどをすることがでの行動を非常に難解なることをご存知のトリガーが存在します。その他のcommentatatorsっているため、独自の制約の道のり(ば修正列の定義を許可します。
まんのを使用する必要がトリガーでこのようなデザインが不十分なものである。さんなぜ必要かどうかは論理に所属している。
それをご利用の場合は、独自の制約/index溶液にSQLサーバーを一つだけの場合はnull値が許可されるカラムです。そのため、たとえば、含まれておりませんが、メールアドレスオプションするのではなく、かつユーザーがnullの場合メールアドレスです。その場合、ならばリゾートには別のアプローチのようにトリガは濾過した。