我正在使用 Sybase ASE 版本 16.0.0.1915(遵循 t-sql 语法)并尝试创建一个新触发器。此新触发器模拟另一个现有触发器,但稍作修改。修改现有触发器以解决两个“工作流程”会困难得多,因此复制到具有修改后的详细信息和“2”顺序的新触发器将是我的首选解决方案。
我正在阅读文档,为了创建基于相同操作的新触发器,我需要设置触发器触发的顺序。如果未指定顺序,则为其分配顺序 0(第一个)。 文档
所以这是我的触发器,现有的类似触发器没有订单集。当我将“ORDER 2”放入创建语句时(在名称之后,第 1 行中的“on”之前),我不断收到语法错误 -131。
我还尝试将“ORDER 2”放在表名之后、“for”之前、“insert”之后、“as”之前。都产生相同的错误-131。
那么我做错了什么?此触发器是否还有其他问题阻止我使用 ORDER 子句?
create trigger "DBA"."WKM_autoFillCL143" on
"DBA"."case_checklist" for insert
as
if((select top 1 "inserted"."code" from "inserted") in( '143' ) )
begin
declare @parentRef integer,@desc varchar(255),@desc1 varchar(255),@checkID integer
set @parentRef = (select top 1 "parent_ref" from "inserted")
if(@parentRef <> '0')
begin
set @desc = (select "description" from "case_checklist" where "checklist_id" = @parentRef)
if(@desc is not null)
begin
set @checkID = (select top 1 "checklist_id" from "inserted")
update "WKM_RecordChecklistMapping" set "c143" = @checkID where "c142" = @parentRef
declare @tabid integer
set @tabid = (select top 1 "tab_id" from "WKM_recordChecklistMapping" where "c142" = @parentRef)
set @tabid = (select top 1 "tab_id" from "user_tab2_data" where "tab_id" = @tabid)
if(@tabid is not null)
begin
declare @recProvider varchar(255),@recsRequested varchar(255),@dateFrom "datetime",@dateTo "datetime"
set @recProvider = (select top 1 "Provider_Name" from "user_tab2_data" where "tab_id" = @tabid)
set @recsRequested = (select top 1 "Records_Requested" from "user_tab2_data" where "tab_id" = @tabid)
set @dateFrom = (select top 1 "For_Dates_From" from "user_tab2_data" where "tab_id" = @tabid)
set @dateTo = (select top 1 "Through" from "user_tab2_data" where "tab_id" = @tabid)
set @desc1 = 'Receipt '+@recProvider+' Records? '+@recsRequested+', dates '+"coalesce"(convert(varchar(255),@dateFrom,1),'00/00/00')+' to '+"coalesce"(convert(varchar(255),@dateTo,1),'00/00/00')
set @checkID = (select top 1 "checklist_id" from "inserted")
update "case_checklist" set "description" = @desc1,"staff_assigned" = 'ZKS',"due_date" = ("today"()+7) where "checklist_id" = @checkID
end
end
end
end
名称下有 4 种不同的 RDBMS产品
Sybase
...Adaptiver Server Enterprise (ASE)
、SQLAnywhere
和. 4x 产品不共享通用的 SQL 语言/语法。IQ
Advantage
该问题引用了 中的
create trigger
语法链接ASE
。问题中的示例代码似乎也适用于
ASE
.但是,从评论中我们发现 OP 实际上正在使用该
SQLAnywhere
产品(版本16.0.0.1915
)。虽然SQLAnywhere
确实为方言提供了一些半可行的支持ASE's
T-SQL
,但它不包括create trigger
命令的通用语法。从评论中:OP 找到了
SQLAnyhere's
创建触发器命令的文档。使用该链接中的一个示例(向下滚动到 find
CREATE TRIGGER myTrig
),并修改 OP 的当前触发代码以匹配文档,我认为 OP 正在寻找类似的东西:注意事项:
ASE
,而且我的SQLAnywhere
经验相当有限,所以 OP 可能需要调整上述内容才能在SQLAnywhere
; 还 ...SQLAnywhere's
create trigger
(例如,触发器应该在插入之前还是之后触发?)ASE/T-SQL
) 触发器代码的其余部分,以查看哪些部分可以“按原样”使用SQLAnywhere
,哪些部分需要重写以匹配SQLAnywhere's
语法SQLAnywhere's
对带引号的标识符的支持(即,当前使用的双引号标识符是否符合SQLAnywhere's
语法?)@mustaccio 已经在评论中回答了您的问题:将其
AS
放在触发器顶部之前。你有一个更大的问题。您的触发器不处理多行插入。它需要完全重写。我希望这些连接正确,因为我没有完整的关系模型:
是否
parent_ref <> '0'
正确?看起来你真的想写parent_ref is not null
。无论哪种方式,我希望这不是您要与文本进行比较的 int 列。