T-Sql

t-sql 中觸發器的 ORDER 放置

  • January 13, 2021

我正在使用 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產品SybaseAdaptiver 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 正在尋找類似的東西:

create trigger "DBA"."WKM_autoFillCL143"
after insert order 4 on "DBA"."case_checklist"
REFERENCING NEW AS inserted
FOR EACH STATEMENT
BEGIN
....

注意事項

  • 我主要工作ASE,而且我的SQLAnywhere經驗相當有限,所以 OP 可能需要調整上述內容才能在SQLAnywhere; 還 …
  • OP 應該檢查通過命令可用的各種選項SQLAnywhere's create trigger(例如,觸發器應該在插入之前還是之後觸發?)
  • OP 將需要查看目前 ( ASE/T-SQL) 觸發器程式碼的其餘部分,以查看哪些部分可以“按原樣”使用SQLAnywhere,哪些部分需要重寫以匹配SQLAnywhere's語法
  • OP 還希望驗證SQLAnywhere's對帶引號的標識符的支持(即,目前使用的雙引號標識符是否符合SQLAnywhere's語法?)

引用自:https://dba.stackexchange.com/questions/282784