触发器用于此过程

时间:2015-04-15 09:49:17

标签: sql-server sql-server-2008

我创建了这个将数据插入数据库的过程,这很好用。现在我想创建一个阻止插入重复行的触发器。我正在使用SQL Server 2008

ALTER PROCEDURE [dbo].[AddEmployee]
  @Stu_id nvarchar(50),
  @Status int,
  @Time nvarchar(50),
  @Date nvarchar(50),
  @Sub_id nvarchar(50)
AS
BEGIN
  SET NOCOUNT ON;
  INSERT INTO  Attendanc (Stu_id, Status, Timing, Dates, Sub_id )
  VALUES (@Stu_id, @Status, @Time, @Date, @Sub_id)
END

1 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,触发器不适合您想要的工作。为防止表格中出现重复数据,您应在不应复制的列上添加unique constraint

另一种选择是添加unique index而不是唯一约束。这对于优化select语句很有用,但可能会对更新或插入数据产生不良影响。

添加唯一约束或索引后,
任何将重复数据插入这些列的尝试都会导致sql server引发错误 注意:如果更新结果将导致这些列具有重复数据,您也将无法更新行。

那你怎么避免这些错误呢? 在插入数据之前,先在程序中添加一个检查 - 如下所示:

-- Assuming the unique constraint is on columns Status and Sub_id
IF NOT EXISTS(SELECT 1 FROM Attendanc WHERE Status = @Status AND Sub_id = @Sub_id) 
BEGIN
    INSERT INTO  Attendanc (Stu_id, Status, Timing, Dates, Sub_id )
END

更新语句可能有点棘手,但仍有可能(这是一个简单的例子):

-- Still assuming the unique constraint is on columns Status and Sub_id
UPDATE A 
SET A.Status = @Status
FROM Attendanc A INNER JOIN Attendanc B ON(A.Sub_id = B.Sub_id)
WHERE A.Stu_id = @Stu_id
AND B.Status <> @Status 

仅当值不违反多列唯一约束时(在Status和Sub_Id上),这将更新Status列