/****** 对象: 表 [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 是什么意思谢谢
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 是什么意思谢谢
16表示错误的严重级别.
1为状态号.
用instead of ,记录没有insert到表,可以在触发器里手动执行insert语句2弹出一个错误
后触发应该已经有插入记录了!!
----------------
改为
OF INSERT就行了是不是啊
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 '李四'
/*
用户名已经存在,不能有相同的用户名
*/
因为>2说明数据库有三条的时候就报错
那也就是说明在执行这个触发器前,记录已经写入了表了是吗? --是的.这个for是后触发型的触发器.
只是如果报错用rollback返回时才删除了那记录的插入操作
2:这里的traierror('',16,1) 这里的16,1 是什么意思 --错误报警级别.