/****** 对象: 表 [dbo].[Test]    脚本日期: 2009-4-22 14:44:17 ******/
CREATE TABLE [dbo].[Test] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL 
) ON [PRIMARY]
GOALTER TABLE [dbo].[Test] ADD 
CONSTRAINT [DF_Test_Name] DEFAULT ('') FOR [Name],
CONSTRAINT [PK_Test] PRIMARY KEY  CLUSTERED 
(
[ID]
)  ON [PRIMARY] 
GOSET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO/****** 对象: 触发器 dbo.Test_INSERTED    脚本日期: 2009-4-22 14:44:17 ******/
CREATE TRIGGER [Test_INSERTED] ON [dbo].[Test] 
FOR INSERT
AS
Declare @Name as Varchar(50)
declare @ItemCount as Int
Select @Name  = Name From Inserted
Select @ItemCount = Count(Name) From dbo.Test Where Name = @Name
if(@ItemCount >2)
begin
raiserror('用户名已经存在,不能有相同的用户名',16,1)
rollback
end
GOSET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO看了
http://topic.csdn.net/u/20090419/15/d7b6c3ff-fad9-4d3d-ad5f-e3347f93fe77.html
我自己写的
以上是一个简单的表
这里要要求Name的记录不能超过两条
然后以上是我的代码
我想问的是
1:为什么这里是if(@ItemCount >2)而不是if(@ItemCount >1)?
   因为>2说明数据库有三条的时候就报错
   那也就是说明在执行这个触发器前,记录已经写入了表了是吗?
   只是如果报错用rollback返回时才删除了那记录的插入操作
2:这里的traierror('',16,1) 这里的16,1 是什么意思谢谢

解决方案 »

  1.   

    采用 After(For)触发器时,先插入记录,再执行触发器.
      

  2.   

    1 触发器的for 默认是after触发
      

  3.   

    raiserror 语句用来生成错误消息并启动会话的错误处理。
    16表示错误的严重级别.
    1为状态号.
      

  4.   

    FOR INSERT已经将记录插入到表中了,已经可以访问到,只是插入记录的这个事务还没有完成,因为还要执行触发器,如果触发器运行出错,那条插入就回滚,如果触发器正确执行完成,那也就成功插入了。
      

  5.   

    1用for,记录insert到表,可以判断后回滚
    用instead of ,记录没有insert到表,可以在触发器里手动执行insert语句2弹出一个错误
      

  6.   

    http://topic.csdn.net/u/20090420/10/b803e950-0f4a-45f8-a6d0-2fdf084cacfd.html
    后触发应该已经有插入记录了!!
      

  7.   

    FOR INSERT
    ----------------
    改为
    OF INSERT就行了是不是啊
      

  8.   

    不用触发器也可以吧?go
    create table Test
    (
    ID int identity (1,1) not null ,
    [Name] varchar(50) collate chinese_prc_ci_as not null 
    )
    on primary
    go
    insert into Test(Name) select '张三'select * from Test
    /*
    ID          Name
    ----------- --------------------------------------------------
    1           张三
    */go
    create proc AddTest(@name varchar(10))
    as
    begin
    if exists(select * from Test where [Name]=@name)
    begin
    select '用户名已经存在,不能有相同的用户名'
    end
    else
    begin
    insert into test(Name) select @name
    end 
    endgo
    exec AddTest '李四'
    select * from Test
    /*
    ID          Name
    ----------- --------------------------------------------------
    1           张三
    2           李四
    */go
    exec AddTest '李四'
    /*
    用户名已经存在,不能有相同的用户名
    */
      

  9.   

    1:为什么这里是if(@ItemCount >2)而不是if(@ItemCount >1)? 
      因为>2说明数据库有三条的时候就报错 
      那也就是说明在执行这个触发器前,记录已经写入了表了是吗? --是的.这个for是后触发型的触发器.
      只是如果报错用rollback返回时才删除了那记录的插入操作 
    2:这里的traierror('',16,1) 这里的16,1 是什么意思  --错误报警级别.