触发错误 [英] Trigger Error

查看:52
本文介绍了触发错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张桌子:


------------------------------ ----------------------


CREATE TABLE CATEGORY(

CATEGORY_ID INTEGER IDENTITY( 1,1)NOT NULL,

CATEGORY_NAME VARCHAR(40)NOT NULL,

PARENT_CATEGORY_ID INTEGER,

CATEGORY_ICON IMAGE,

DEPTH INTEGER,

CONSTRAINT PK__CATEGORY PRIMARY KEY(CATEGORY_ID)



GO


------------------------------------------------- ---


我尝试创建此触发器,但我失败了:


----------- -----------------------------------------


CREATE TRIGGER [AI_CATEGORY] ON [dbo]。[CATEGORY]

FOR INSERT

AS

DECLARE @TEMP_ID AS INT,@ COUNTER AS INT

UPDATE AI_CATEGORY

SET @TEMP_ID = CATEGORY_ID,@ COUNTER = 1

如果PARENT_CATEGORY_ID不为空

BEGIN

WHILE @TEMP_ID不为空

BEGIN

更新AI_类别

SET @TEMP_ID = PARENT_CATEGORY_ID,

@COUNTER = @COUNTER + 1

END

END

更新类别

设置深度= @COUNTER


----------------- -----------------------------------


我明白了使用SQL Server 2000时出现以下错误:


服务器:消息207,级别16,状态3,过程AI_CATEGORY,第7行

无效的列名称''PARENT_CATEGORY_ID ''。


任何线索?


Coosa

I have a table:

----------------------------------------------------

CREATE TABLE CATEGORY (
CATEGORY_ID INTEGER IDENTITY(1,1) NOT NULL,
CATEGORY_NAME VARCHAR(40) NOT NULL,
PARENT_CATEGORY_ID INTEGER,
CATEGORY_ICON IMAGE,
DEPTH INTEGER,
CONSTRAINT PK__CATEGORY PRIMARY KEY (CATEGORY_ID)
)
GO

----------------------------------------------------

and i try to create this trigger, but i fail:

----------------------------------------------------

CREATE TRIGGER [AI_CATEGORY] ON [dbo].[CATEGORY]
FOR INSERT
AS
DECLARE @TEMP_ID AS INT, @COUNTER AS INT
UPDATE AI_CATEGORY
SET @TEMP_ID = CATEGORY_ID, @COUNTER = 1
IF PARENT_CATEGORY_ID IS NOT NULL
BEGIN
WHILE @TEMP_ID IS NOT NULL
BEGIN
UPDATE AI_CATEGORY
SET @TEMP_ID = PARENT_CATEGORY_ID,
@COUNTER = @COUNTER + 1
END
END
UPDATE CATEGORY
SET DEPTH = @COUNTER

----------------------------------------------------

And i get the following Error using SQL Server 2000:

Server: Msg 207, Level 16, State 3, Procedure AI_CATEGORY, Line 7
Invalid column name ''PARENT_CATEGORY_ID''.

Any clue?

Coosa

推荐答案

coosa写道:

[...]


我得到了和你一样的错误。但是,如果你稍微修改

触发器:


创建触发器[AI_CATEGORY] ON [dbo]。[CATEGORY]

FOR INSERT

AS

DECLARE @TEMP_ID AS INT,@ COUNTER AS INT,@ C AS INT

更新AI_CATEGORY

SET @TEMP_ID = CATEGORY_ID,@ COUNTER = 1

SELECT @C = PARENT_CATEGORY_ID from INSERTED

IF @C IS NOT NOT

BEGIN

WHILE @TEMP_ID不为空

BEGIN

更新AI_CATEGORY

SET @TEMP_ID = PARENT_CATEGORY_ID,

@COUNTER = @COUNTER + 1

END

END

更新类别

SET深度= @COUNTER


这样可行。不知道为什么,但是当Erland来的时候,我希望他能告诉我们你好吗?


Edward

-

阅读小组的阅读小组:
http://www.bookgroup.org.uk

coosa wrote:
[...]

I got the same error as you. However, if you slightly amend the
trigger thus:

CREATE TRIGGER [AI_CATEGORY] ON [dbo].[CATEGORY]
FOR INSERT
AS
DECLARE @TEMP_ID AS INT, @COUNTER AS INT, @C AS INT
UPDATE AI_CATEGORY
SET @TEMP_ID = CATEGORY_ID, @COUNTER = 1
SELECT @C = PARENT_CATEGORY_ID FROM INSERTED
IF @C IS NOT NULL
BEGIN
WHILE @TEMP_ID IS NOT NULL
BEGIN
UPDATE AI_CATEGORY
SET @TEMP_ID = PARENT_CATEGORY_ID,
@COUNTER = @COUNTER + 1
END
END
UPDATE CATEGORY
SET DEPTH = @COUNTER

This works. Don''t know why, but when Erland comes by, I expect he''ll
tell us!

Edward
--
The reading group''s reading group:
http://www.bookgroup.org.uk


2005年5月25日00:48:46 -0700,coosa写道:
On 25 May 2005 00:48:46 -0700, coosa wrote:
我有一张桌子:

------------------------ ----------------------------

CREATE TABLE CATEGORY(
CATEGORY_ID INTEGER IDENTITY(1, 1)NOT NULL,
CATEGORY_NAME VARCHAR(40)NOT NULL,
PARENT_CATEGORY_ID INTEGER,
CATEGORY_ICON IMAGE,
DEPTH INTEGER,
约束PK__CATEGORY PRIMARY KEY(CATEGORY_ID)

GO

--------------------------------- -------------------

我尝试创建此触发器,但我失败了:

--- -------------------------------------------------

CREATE TRIGGER [AI _CATEGORY] ON [dbo]。[CATEGORY]
FOR INSERT
AS /> DECLARE @TEMP_ID AS INT,@ COUNTER AS INT
更新AI_CATEGORY
SET @TEMP_ID = CATEGORY_ID ,@ COUNTER = 1
如果PARENT_CATEGORY_ID不为空
BEGIN
@TEMP_ID不为空时
BEGIN
更新AI_CATEGORY
SET @TEMP_ID = PARENT_CATEGORY_ID,
@ COUNTER = @ COUNTER + 1
END
结束
更新类别
设置深度= @COUNTER

------ ----------------------------------------------

使用SQL Server 2000时出现以下错误:

服务器:Msg 207,Level 16,State 3,Procedure AI_CATEGORY,Line 7
无效的列名''PARENT_CATEGORY_ID' '。

任何线索?

Coosa


嗨Coosa,


那里你的代码中有几个问题。

DECLARE @TEMP_ID AS INT,@ COUNTER AS INT


这似乎表明你希望触发器只处理一个

一次排。在SQL Server中,一个触发器在

语句完成后执行一次 - 所以如果一个INSERT语句4在

中插入行一次,则触发器被触发一次,并且处理所有4个新行

(可以从插入的伪表中提取)。

UPDATE AI_CATEGORY
SET @TEMP_ID = CATEGORY_ID,@ COUNTER = 1


首先,您的帖子中没有表格AI_CATEGORY。

其次,您使用更新语句,但您只更改

一些变量。该语句将处理AI_CATEGORY

中的所有行,并为每一行设置两个变量。最后,你已经多次将@ 1
的值分配给@COUNTER,而@TEMP_ID将是最后处理的任何行的

category_id 。这可以从执行变为执行,并且与
(或行集合)无关>
导致此触发器触发。

如果PARENT_CATEGORY_ID不为空


这是非法语法。将PARENT_CATEGORY_ID替换为本地

变量或只返回一个值的查询,以便通过

语法检查。

UPDATE AI_CATEGORY
SET @TEMP_ID = PARENT_CATEGORY_ID,
@ COUNTER = @COUNTER + 1


与上一个声明一样,这将处理来自
$ b $的所有行b AI_CATEGORY。 @COUNTER的值会快速增加(对于AI_CATEGORY中的每一行,它将增加1
)。并且@TEMP_ID将再次

是一个随机选择的PARENT_CATEGORY_ID。行。如果你很幸运,

它将为NULL并且循环将完成。但是很有可能

这不会是NULL - 并且你可能最终等待触发器

陷入循环,直到@COUNTER溢出最大整数值。

UPDATE CATEGORY
SET DEPTH = @COUNTER
I have a table:

----------------------------------------------------

CREATE TABLE CATEGORY (
CATEGORY_ID INTEGER IDENTITY(1,1) NOT NULL,
CATEGORY_NAME VARCHAR(40) NOT NULL,
PARENT_CATEGORY_ID INTEGER,
CATEGORY_ICON IMAGE,
DEPTH INTEGER,
CONSTRAINT PK__CATEGORY PRIMARY KEY (CATEGORY_ID)
)
GO

----------------------------------------------------

and i try to create this trigger, but i fail:

----------------------------------------------------

CREATE TRIGGER [AI_CATEGORY] ON [dbo].[CATEGORY]
FOR INSERT
AS
DECLARE @TEMP_ID AS INT, @COUNTER AS INT
UPDATE AI_CATEGORY
SET @TEMP_ID = CATEGORY_ID, @COUNTER = 1
IF PARENT_CATEGORY_ID IS NOT NULL
BEGIN
WHILE @TEMP_ID IS NOT NULL
BEGIN
UPDATE AI_CATEGORY
SET @TEMP_ID = PARENT_CATEGORY_ID,
@COUNTER = @COUNTER + 1
END
END
UPDATE CATEGORY
SET DEPTH = @COUNTER

----------------------------------------------------

And i get the following Error using SQL Server 2000:

Server: Msg 207, Level 16, State 3, Procedure AI_CATEGORY, Line 7
Invalid column name ''PARENT_CATEGORY_ID''.

Any clue?

Coosa
Hi Coosa,

There are several problems in your code.
DECLARE @TEMP_ID AS INT, @COUNTER AS INT
This seems to indicate that you expect the trigger to process only one
row at a time. In SQL Server, a trigger is executed once after a
statement is finished - so if an INSERT statement 4 inserts rows at
once, the trigger is fired once, and has to process all 4 new rows
(which can be extracted from the inserted pseudo-table).
UPDATE AI_CATEGORY
SET @TEMP_ID = CATEGORY_ID, @COUNTER = 1
First, there is no table AI_CATEGORY in your post.
Second, you use an update statement, but you only change the values of
some variables. This statement will process all rows from AI_CATEGORY
and set both variables for each row. In the end, you''ll have assigned
the value 1 to @COUNTER numerous times, and @TEMP_ID will be the
category_id of whatever row happens to be processed last. This can
change from execution to execution, and will have no relation to the row
(or collection of rows) that was/were inserted in the statement that
caused this trigger to fire.
IF PARENT_CATEGORY_ID IS NOT NULL
This is illegal syntax. Replace PARENT_CATEGORY_ID with either a local
variable or a query that returns exactly one value in order to pass the
syntax check.
UPDATE AI_CATEGORY
SET @TEMP_ID = PARENT_CATEGORY_ID,
@COUNTER = @COUNTER + 1
Like the previous statement, this will process all rows from
AI_CATEGORY. The value of @COUNTER wil increase rapidly (it will be
incremented by 1 for each row in AI_CATEGORY). And @TEMP_ID will again
be the PARENT_CATEGORY_ID of one "randomly chosen" row. If you''re lucky,
it''ll be NULL and the loop will finish. But there''s a good chance that
this will not be NULL - and you might end up waiting while the trigger
is stuck in a loop, until @COUNTER overflows the maximum integer value.
UPDATE CATEGORY
SET DEPTH = @COUNTER




这会将DEPTH列设置为相同的值

CATEGORY表中的所有行。我怀疑这是不是你想要的。


我可以帮助你改进你的代码,但老实说我不知道​​是什么

确切地说你正在努力实现。请为您的其他表(AI_CATEGORY)发布CREATE TABLE

语句,为两个表发布一些示例

数据(作为INSERT语句),然后向我们展示一个示例

INSERT操作和触发器执行的预期结果。对实际业务问题的简要说明也许有帮助。


Best,Hugo

-


(删除_NO_和_SPAM_以获取我的电子邮件地址)



This will set the DEPTH column to the same value in all rows in the
CATEGORY table. I doubt if that''s what you want.

I could help you to improve your code, but I honestly don''t kknow what
exactly you are trying to achieve. Please post the CREATE TABLE
statement for your other table (AI_CATEGORY) as well, post some sample
data (as INSERT statements) for both tables, then show us an example
INSERT operation and the expected result from the trigger execution. A
brief description of the actual business problem might help as well.

Best, Hugo
--

(Remove _NO_ and _SPAM_ to get my e-mail address)


啊,谢谢,


我修改为以下内容:


------------------------------- -------------------------------------------------- -----------


创建触发器[AI_CATEGORY] ON [dbo]。[CATEGORY]

FOR INSERT

AS

DECLARE @TEMP_ID AS INT,

@COUNTER AS INT,

@P_ID AS INT


SELECT @TEMP_ID = CATEGORY_ID,

@COUNTER = 1,

@P_ID = PARENT_CATEGORY_ID

FROM INSERTED
如果@P_ID不是空白

BEGIN

WHILE @TEMP_ID不为空

BEGIN

SELECT @TEMP_ID = @P_ID,

@COUNTER = @COUNTER + 1

来自INSERTED

结束

结束

更新类别

SET DEPTH = @ COUNTER


--------------------------- -------------------------------------------------- ---------------


现在至少当我检查语法时,SQL Server接受它并且我可以

然后将其保存在触发器下。

插入一些记录时,只要父类别为空,

它会将depthes更新为1,否则它会挂起,如果父类别

有些价值。

嗯,也许uc帮我一个想法,我需要跟踪

深度层次结构。

这就是一个例子:


CATEGORY_ID CATEGORY_NAME PARENT_CATEGORY_ID DEPTH

---------- -------------------------------------------

29 PC< NULL> 1

30 MOBILES< NULL> 1

32 DIGITAL CAMERAS< NULL> 1

33网络29 2

35音频29 2

36视频29 2

37音频卡35 3

38 IDE智能卡37 4

---------------------------- -------------------------


因此,当我插入记录时,我将深度留空以接受null

值,但在我插入一些记录之后,我希望触发器被触发

来自动检测每个类别的深度并更新这个

深度。

有什么想法吗?我不知道代码中有什么问题,但是因为它在运行时挂起,所以它定义为语义错误。


Coosa

Ah thanks,

I modified to the following:

--------------------------------------------------------------------------------------------

CREATE TRIGGER [AI_CATEGORY] ON [dbo].[CATEGORY]
FOR INSERT
AS
DECLARE @TEMP_ID AS INT,
@COUNTER AS INT,
@P_ID AS INT

SELECT @TEMP_ID = CATEGORY_ID,
@COUNTER = 1,
@P_ID = PARENT_CATEGORY_ID
FROM INSERTED
IF @P_ID IS NOT NULL
BEGIN
WHILE @TEMP_ID IS NOT NULL
BEGIN
SELECT @TEMP_ID = @P_ID,
@COUNTER = @COUNTER + 1
FROM INSERTED
END
END
UPDATE CATEGORY
SET DEPTH = @COUNTER

--------------------------------------------------------------------------------------------

Now at least when i check the syntax, SQL Server accepts it and i can
then save it under the triggers.
When inserting some records, as long the parent categories are nulls,
it updates the depthes to 1, else it hangs, if the parent category has
some value.
Hmm, maybe u c an help me with an idea, i need to keep track of the
depth of hierarchy.
It means as an example:

CATEGORY_ID CATEGORY_NAME PARENT_CATEGORY_ID DEPTH
-----------------------------------------------------
29 PC <NULL> 1
30 MOBILES <NULL> 1
32 DIGITAL CAMERAS <NULL> 1
33 NETWORKS 29 2
35 AUDIO 29 2
36 VIDEO 29 2
37 AUDIO CARDS 35 3
38 IDE AUDIO CARDS 37 4
-----------------------------------------------------

So when I insert records, i leave the depth empty to accept null
values, but after i insert some records, i want the trigger to be fired
to automatically detect the depth of each category and update this
depth.
Any idea? I don''t know what''s wrong in the code, but it''s definetely a
semantic error since it hangs in run time.

Coosa


这篇关于触发错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆