日期:2014-05-16  浏览次数:20402 次

数据库触发器的问题
最近在学习数据库的触发器自己写了一个防止姓名重复烦人触发器,运行了下发现不管数据库里面有没有数据,都会提示出错了,怎么添加也不行啊!求解啊各位大神!
USE ShoppingMall
GO
CREATE TRIGGER trigname
ON UserInfo
AFTER INSERT
AS
BEGIN
DECLARE @name nvarchar(50)
SELECT @name=inserted.Username FROM inserted
IF EXISTS(SELECT Username FROM UserInfo WHERE Username=@name)
BEGIN
RAISERROR('姓名重复不能插入!',16,1)
ROLLBACK
END
END
------解决方案--------------------
建立唯一索引不可以吗
------解决方案--------------------

USE ShoppingMall
GO
CREATE TRIGGER trigname
ON UserInfo
AFTER INSERT
AS
BEGIN
DECLARE @id  int
DECLARE @name nvarchar(50)
SELECT @id=id,@name=inserted.Username FROM inserted
IF EXISTS(SELECT Username FROM UserInfo WHERE Username=@name and id <>@id)--id唯一
BEGIN
RAISERROR('姓名重复不能插入!',16,1)
ROLLBACK
END
END 

你都插进去了,指定能查得到,你要把插的抛出去。
------解决方案--------------------
改成这样试试:


USE ShoppingMall
GO
CREATE TRIGGER trigname
ON UserInfo
AFTER INSERT
AS
BEGIN
DECLARE @name nvarchar(50)
SELECT @name=inserted.Username FROM inserted

IF (SELECT COUNT(*) FROM UserInfo WHERE Username=@name)>1
BEGIN
RAISERROR('姓名重复不能插入!',16,1)
ROLLBACK
END
END

------解决方案--------------------
[code=sql][code=text]
USE ShoppingMall
GO
CREATE TRIGGER trigname
ON UserInfo
AFTER INSERT
AS
BEGIN
DECLARE @name nvarchar(50)
SELECT @name=inserted.Username FROM inserted
 
IF (SELECT COUNT(*) FROM UserInfo WHERE Username=@name)>1
BEGIN
RAISERROR('姓名重复不能插入!',16,1)
ROLLBACK
END
END