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

发布网友 发布时间:2022-04-25 02:13

我来回答

6个回答

热心网友 时间:2022-04-10 17:00

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

你这个问题看似简单,其实不简单,他需要三方面的关键技术:
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

热心网友 时间:2022-04-10 18:18

/*建表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;

热心网友 时间:2022-04-10 19:52

触发器向同一个表中添加数据?这样不进入死循环?

热心网友 时间:2022-04-10 21:44

楼主说的有点乱,说清楚点,其实触发器为非是在那三种情况下变换,没有什么很难的问题,说清楚点才能给你解决啊

热心网友 时间:2022-04-10 23:52

啥是触发器?

热心网友 时间:2022-04-11 02:16

可以说清楚一点吗,你要效果

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com