SQL触发器问题,满意后追加

我想要建个触发器 达到以下效果
某表记录为0条
当程序执行一条insert sql语句时通过触发器判断后
数据库的记录为2条
如果当程序中执行两条(或者两条以上)insert sql语句时通过触发器判断后数据库的记录为1条

还有个简单的
当发现insert向表中增加记录时候,通过触发器判断后自动向该表增加(和前者)2条相同的记录
这样说清楚些吧!
1,有一个数据库,程序执行一条insert 表1 sql语句 触发事件--触发器也同样再次像表1插入同样的语句,效果为程序执行一条insert 语句过后,数据库中增加了两条同样的记录
2,执行一条insert sql语句过后,触发时间--如果是08年就再次插入1条同样的数据,如果是09年就增加2条同样的数据,如果是2010年就增加1--10(随机产生)条记录
等等啊,我好好弄一下去,可以的话肯定会给你分的,不会过期,这你放心就是!
==================================================================================================================
好像还是不行啊,不管 THEN 1 还是THEN 4 ,THEN 6 怎么都执行2次,我也是在本地测试的,不管修不修改时间都执行2次,触发器建立之前执行结果为一次,触发器建立过后,不管2009或者2009或者2010设置的多少,执行结果都为2次,这是怎么回事!是sql问题还是怎么的?请教 请教,急,跟上次还是一样的!

你把你写的触发器发过来,我给你改。
我给你代码,全部都是试过的,所以你要相信这是正确的。不正确,是你抄的不正确。
====================

你这个问题看似简单,其实不简单,他需要三方面的关键技术:
1.使用触发器嵌套。
2.控制嵌套层次。
3.产生随机整数。(2010年的1-10随机数)

下面是我给您的全面解决方法:

--为避免您在抄录的过程中出现错误,使用我为您建立的表作试验,试好后再改到自已的表中,以下代码(包括注释)完全复制到查询分析器中即可执行,建测试表,建触发器,测试及查看语句均在其中,我已实际测试通过。

--一、建立测试表,TABLENAME,如果原来有这个表,要先用DROP TABLE TABLENAME 删掉,或改名也行。
-- 请注意,在表中有一个自增列,是为了保证不插入完全相同的列(在SQLSERVER中是不允许的),造成错误
CREATE TABLE TABLENAME(A varchar (16) NULL ,B float ,C float ,[id] int IDENTITY (1, 1) NOT NULL )
GO
--二、建立触发器
CREATE TRIGGER TR_TABLENAME_Insert ON TABLENAME
FOR INSERT
AS
declare--声明与插入字段数及类型相同的变量
@a VARCHAR(16),
@b float,
@c float
select --取得此次插入的值
@a=a,
@b=b,
@c=c
from inserted
DECLARE @N TINYINT --声明重复插入次数

SET @N=CASE WHEN YEAR(GETDATE())=2008 THEN 1 --2008年重复插入一次
WHEN YEAR(GETDATE())=2009 THEN 2 --2009年重复插入二次
ELSE cast(ceiling(rand() * 10) as int) --2010年及其它年份随机产生1-10之间的整数,作为插入次数
END

if @@NESTLEVEL <=@N --当插入次数不足设定次数时,继续插入上面的插入值。
INSERT INTO [TABLENAME]([A], [B], [C])
VALUES(@A,@b,@c)

GO

--三、测试:(可重复执行多次,来查看结果,可将计算机当前日期进行修改,以完成2009年以上的测试)
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('TEST',1,1)
select * from TABLENAME

--还有一点,年份我取的是当前年份,如果是根据插入的字段值中的年分,那么就将该GETDATE()函数用为年份字段设置的变量代替,请注意字段类型的匹配就行了。

=============
怎么了?问题解决了就不差急了?
=====================================

你抄得一定有问题,从表到存储过程都直接复制就可以。

还有一种可能,年份是从数据库服务器的当前时间取的,你在试验时,要改数据库服务器的系统才行。
我的服务器是在本机,所以改服务器系统时间比较容易。

如果不方便改服务器时间,你可以用其它方式试验,如改成判断其它数据,下面我帮你改一个,通过判断A字段是2008,2009还是2010来确定重复次数。

ALTER TRIGGER TR_TABLENAME_Insert ON TABLENAME
FOR INSERT
AS
declare--声明与插入字段数及类型相同的变量
@a VARCHAR(16),
@b float,
@c float
select --取得此次插入的值
@a=a,
@b=b,
@c=c
from inserted
DECLARE @N TINYINT --声明重复插入次数

SET @N=CASE WHEN @A='2008' THEN 1 --2008年重复插入一次
WHEN @A='2009' THEN 2 --2009年重复插入二次
ELSE cast(ceiling(rand() * 10) as int) --2010年及其它年份随机产生1-10之间的整数,作为插入次数
END

if @@NESTLEVEL <=@N --当插入次数不足设定次数时,继续插入上面的插入值。
INSERT INTO [TABLENAME]([A], [B], [C])
VALUES(@A,@b,@c)

GO

--再次测试:下面是试验和查看三种结果,请注意,第一次多增加一条件记录,
第二次是多增加二条件记录,第三次是多增加1-10条件任意记录

INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('2008',1,1)
select * from TABLENAME
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('2009',1,1)
select * from TABLENAME
INSERT INTO [TABLENAME]([A], [B], [C]) VALUES('2010',1,1)
select * from TABLENAME
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-11-14
/*建表Table1*/
CREATE TABLE Table1
(Eno NUMERIC(4) REFERENCES teacher(Eno),
Sal SUMERIC(7,2),
Username char(10),
Date TIMETAMP);

/*建立触发器*/
CREATE TRIGGER insert_RT
AFTER INSERT ON Table1
FOR EACH ROW
AS BEGIN
INSERT INTO Table1 VALUES(
new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
END;
第2个回答  2008-11-21
触发器向同一个表中添加数据?这样不进入死循环?本回答被提问者采纳
第3个回答  2008-11-14
楼主说的有点乱,说清楚点,其实触发器为非是在那三种情况下变换,没有什么很难的问题,说清楚点才能给你解决啊
第4个回答  2008-11-14
啥是触发器?
相似回答