我们有一个用户表,每个用户都有一个唯一的电子邮件和用户名。我们尝试在我们的代码中执行此操作,但是我们希望确保用户不会以相同的电子邮件用户名插入(或更新)到数据库中。我添加了一个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.
您可以在表格上添加唯一的约束,如果您尝试插入或更新并创建重复项,则会引发错误
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)左右,则可以使用唯一索引。
问题内容: 这个问题已经在这里有了答案 : MySQL中的CHECK约束不起作用 (8个答案) 去年关闭。 我想在MySQL中使用CHECK约束,但不受支持。(与其他RDBMS不同,它将理解但不强制执行CHECK。) 我已经看到了一些使用触发器的解决方法。但是他们倾向于为相关字段设置默认值,而不是返回错误。 如果不满足条件,是否可以构造一个返回错误的触发器? 最终,我想要一个复制CHECK约束的触
问题内容: 我有一个包含多个记录的表: 用户名(例如“ TOM”) Question_ID(例如“ q002”) 答案(例如“ D”) 我想创建一个触发器,以便没人可以两次提交相同问题的答案。它仅 是触发器 。 问题答案: 创建触发器
问题内容: 我正在研究触发器和约束。 我有一个使用触发器的问题(说实话,我不确定如何使用触发器。) 假设我们有一个教师表。 这个教师表包含Teacher_id,ssn,first_name,last_name,class_time 例如, 和 假设学生人数上限为25(学生人数上限由老师定义,因此可以是10、22、25 …等任意数字) 一个学生想添加鲍勃的班级。但是,我想触发拒绝添加学生的触发器。(
我有两张桌子,“预订”和“isBooked”。我想在isBooked表中添加值。但我不断收到错误“无法添加或更新子外键约束失败”。 有人能告诉我为什么在尝试将值插入“isBooked”时会出现此错误吗?
userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?
问题内容: 我正在工作,我有下表 现在我想防止插入,如果我有一个数据,尽管ID不同但存在数据 请指导我如何编写此触发器。 问题答案: 像这样的东西: 那只是为了插入,您可能也想考虑更新。 更新 一种更简单的方法是在表上创建唯一约束,这也将强制它进行更新并消除对触发器的需求。做就是了: 然后你就可以做生意。