Oracle觸發器:數據世界的“隱形守護者“

??今天,我想和大家聊一個在Oracle數據庫領域既強大又神秘的話題——觸發器(Trigger)?。在座的各位可能都寫過SQL語句,做過表結構設計,甚至用過存儲過程,但有很多人對觸發器的態度可能是"既愛又怕":愛它的自動化能力,怕它的不可控風險。

??我先問大家一個問題:當你在系統中執行一條UPDATE語句修改用戶賬戶余額時,是否希望同時自動記錄這筆操作的審計日志?當你刪除一張訂單時,是否需要級聯刪除關聯的物流信息?當插入一條不符合業務規則的記錄時,能否在數據庫層面直接攔截而不是依賴應用程序?

??這些場景,都可以通過Oracle觸發器輕松實現。它就像數據庫的"隱形守護者",在數據操作的背后默默執行著規則,讓業務邏輯更嚴謹,讓系統更安全。

一、觸發器是什么?為什么需要它?

1.1 觸發器的本質

??Oracle觸發器是一種存儲在數據庫中的PL/SQL程序單元,它會在特定的數據庫事件(如DML操作、DDL操作、甚至系統事件)發生時被自動觸發執行。簡單來說,它是數據庫的"事件響應器",就像現實中的煙霧報警器——當檢測到"煙霧"(特定事件)時,會自動觸發"警報"(執行代碼)。

1.2 它解決了什么問題?

??傳統的數據約束(如主鍵、外鍵、CHECK約束)只能處理簡單的邏輯校驗,但面對復雜的業務規則(如跨表操作、動態計算、審計追蹤),它們往往力不從心。例如:

??當員工離職時,需要同時禁用其關聯的系統賬號;
當財務人員修改大額訂單金額時,需要自動記錄修改前后的差異;
當插入一條"已刪除"狀態的記錄時,需要阻止操作并提示原因。
這些需求無法僅通過表約束實現,而觸發器可以在數據操作的"現場"(BEFORE/AFTER)實時響應,完成應用程序難以處理的跨表聯動、審計追蹤等任務。

1.3 觸發器 vs 應用程序邏輯

??有人可能會問:“為什么不把這些邏輯寫在應用程序里?” 這里需要明確兩者的邊界:
?應用程序?:負責用戶交互、業務流程編排,需要考慮界面友好性、響應速度;
?數據庫觸發器?:負責數據一致性的"最后一道防線",確保無論數據通過何種方式(應用程序、SQL Developer、第三方工具)修改,規則都能被嚴格執行。

??舉個例子:如果業務規則是"用戶積分必須大于0",應用程序可能在提交時校驗,但如果有人直接通過SQL Developer執行UPDATE user SET points = -100 WHERE id=1,這時候只有數據庫層面的觸發器能攔截這種違規操作。

二、觸發器的核心類型:從"何時觸發"到"如何觸發"

??Oracle觸發器的分類可以從多個維度展開,理解這些分類是掌握觸發器的第一步。

2.1 按觸發事件分類

??觸發器的"觸發源"是數據庫事件,主要分為三類:

事件類型說明典型場景
?DML 事件?當執行 INSERTUPDATEDELETE 等數據操作語言(DML)語句時觸發審計日志記錄、級聯更新、業務規則實時校驗
?DDL 事件?當執行 CREATEALTERDROP 等數據定義語言(DDL)語句時觸發表結構變更審計、數據庫權限變更監控
?系統事件?當數據庫啟動、關閉、用戶登錄/登出等系統級行為發生時觸發數據庫狀態監控、用戶登錄日志記錄

2.2 按觸發時機分類

??觸發器可以在事件發生前(BEFORE)或發生后(AFTER)執行,這直接影響它能訪問的數據狀態:

???BEFORE觸發器?:在DML/DDL操作執行前觸發。此時,新數據(如INSERT的新行)尚未提交到表中,可以修改或阻止操作(通過RAISE_APPLICATION_ERROR)。
示例:員工入職時,自動為其生成工號(BEFORE INSERT觸發器填充工號字段)。

???AFTER觸發器?:在DML/DDL操作執行后觸發。此時,數據已寫入表中,適合執行后續操作(如審計日志、發送通知)。
? 示例:訂單支付成功后(AFTER UPDATE),觸發器自動扣減庫存。

2.3 按作用級別分類

??觸發器可以作用于整張表(語句級)或單條記錄(行級),這決定了它的執行頻率:

???語句級觸發器?:無論操作影響多少行,僅執行一次。例如,對表執行DELETE * FROM employees,語句級觸發器只會觸發1次。
?行級觸發器?:每條被影響的記錄都會觸發一次。例如,上述DELETE操作刪除了10條記錄,行級觸發器會觸發10次(需聲明FOR EACH ROW)。
注意:行級觸發器的性能消耗更高,需謹慎使用——如果一張表有10萬行,每次DELETE都觸發10萬次代碼,可能導致數據庫鎖死!

2.4 特殊類型觸發器

??除了上述基礎類型,Oracle還提供了更靈活的觸發器:

???INSTEAD OF觸發器?:替代原始的DML操作。例如,視圖(View)默認不支持直接INSERT/UPDATE,但可以通過INSTEAD OF觸發器將對視圖的修改映射到基表。
示例:一個視圖關聯了員工表和部門表,通過INSTEAD OF INSERT觸發器,將視圖插入操作拆解為向兩張基表插入數據。

???復合觸發器(Compound Trigger)??:結合了BEFORE/AFTER語句級和行級觸發的特性,允許在一個觸發器中按事件階段(BEFORE STATEMENT、BEFORE EACH ROW、AFTER EACH ROW、AFTER STATEMENT)編寫邏輯。它主要用于解決行級和語句級操作的協同問題(如統計批量操作的總影響行數)。

三、觸發器的實戰場景:從簡單到復雜

??現在,我們通過幾個真實場景,看看觸發器如何解決實際問題。

3.1 場景1:數據審計——誰在什么時候改了什么?

??某金融系統需要記錄所有用戶賬戶余額的修改記錄,包括修改人、修改前金額、修改后金額、修改時間。

???實現方案?:創建AFTER UPDATE行級觸發器,在余額被修改時,將變更信息寫入審計表account_audit。

-- 創建審計表
CREATE TABLE account_audit (audit_id      NUMBER PRIMARY KEY,account_id    NUMBER,old_balance   NUMBER,new_balance   NUMBER,changed_by    VARCHAR2(30),change_time   TIMESTAMP
);-- 創建序列用于審計表主鍵
CREATE SEQUENCE audit_seq;-- 創建AFTER UPDATE行級觸發器
CREATE OR REPLACE TRIGGER trg_account_update_audit
AFTER UPDATE OF balance ON accounts
FOR EACH ROW
BEGIN-- 僅當余額實際發生變化時記錄IF :OLD.balance <> :NEW.balance THENINSERT INTO account_audit (audit_id, account_id, old_balance, new_balance, changed_by, change_time)VALUES (audit_seq.NEXTVAL, :OLD.account_id, :OLD.balance, :NEW.balance, USER, SYSTIMESTAMP);END IF;
END;
/

???效果?:任何對accounts表的balance字段的修改都會自動生成一條審計記錄,無需應用程序干預。

3.2 場景2:業務規則強制——禁止"先款后貨"的違規操作

??某電商系統中,訂單狀態必須遵循"待支付→已支付→已發貨→已完成"的流程。業務規則要求:未支付的訂單(狀態=待支付)不能直接修改為"已發貨"。

???實現方案?:創建BEFORE UPDATE觸發器,在更新訂單狀態前檢查是否符合規則。

CREATE OR REPLACE TRIGGER trg_order_status_check
BEFORE UPDATE OF status ON orders
FOR EACH ROW
DECLAREv_valid BOOLEAN := FALSE;
BEGIN-- 允許的狀態流轉:待支付→已支付;已支付→已發貨;已發貨→已完成CASE WHEN :OLD.status = '待支付' AND :NEW.status = '已支付' THEN v_valid := TRUE;WHEN :OLD.status = '已支付' AND :NEW.status = '已發貨' THEN v_valid := TRUE;WHEN :OLD.status = '已發貨' AND :NEW.status = '已完成' THEN v_valid := TRUE;ELSE v_valid := FALSE;END CASE;IF NOT v_valid THENRAISE_APPLICATION_ERROR(-20001, '非法狀態變更:當前狀態=' || :OLD.status || ',嘗試變更為=' || :NEW.status);END IF;
END;
/

???效果?:如果嘗試將待支付訂單直接改為已發貨,數據庫會直接拋出錯誤,阻止操作。

3.3 場景3:級聯操作——刪除用戶時自動清理關聯數據

??某社交系統中,用戶表(users)與發帖表(posts)、評論表(comments)存在外鍵關聯。業務要求:刪除用戶時,自動刪除其所有發帖和評論。

???實現方案?:傳統的做法是在應用程序中先刪帖子、再刪評論、最后刪用戶,但如果有人直接執行DELETE FROM users WHERE id=100,可能導致關聯數據殘留。通過觸發器可以實現"自動級聯"。

-- 創建AFTER DELETE語句級觸發器
CREATE OR REPLACE TRIGGER trg_user_delete_cascade
AFTER DELETE ON users
FOR EACH ROW
BEGIN-- 刪除該用戶的所有發帖DELETE FROM posts WHERE user_id = :OLD.id;-- 刪除該用戶的所有評論DELETE FROM comments WHERE user_id = :OLD.id;
END;
/

???注意?:這里使用行級觸發器(FOR EACH ROW)是因為每條用戶記錄的刪除都需要觸發級聯操作。但如果用戶表有10萬條記錄,批量刪除時可能觸發10萬次級聯DELETE,導致性能問題。實際場景中,更優方案是通過外鍵的ON DELETE CASCADE屬性實現(但僅適用于簡單級聯),而復雜級聯(如需要額外邏輯)仍需觸發器。

四、觸發器的"雙刃劍":編寫規范與風險規避

??觸發器雖然強大,但一旦濫用,可能成為系統的"性能殺手"或"邏輯炸彈"。以下是我總結的黃金法則?:

4.1 編寫規范

???命名清晰?:觸發器名稱應包含業務含義和觸發類型,例如trg_order_status_check(訂單狀態校驗觸發器)、trg_account_audit(賬戶審計觸發器)。
???邏輯簡潔?:避免在觸發器中編寫復雜業務邏輯(如多表關聯查詢、循環),保持原子性。復雜的邏輯應封裝到存儲過程,觸發器僅調用存儲過程。
???事務一致性?:觸發器中的操作應與主事務保持一致——如果主事務回滾,觸發器的操作也會回滾(因為觸發器在事務上下文中執行)。
?錯誤處理?:盡量使用RAISE_APPLICATION_ERROR拋出明確錯誤,避免靜默失敗;如果需要記錄錯誤日志,可通過自治事務(PRAGMA AUTONOMOUS_TRANSACTION)實現,但需謹慎使用(可能導致數據不一致)。

4.2 性能風險與規避

???減少行級觸發器的使用?:行級觸發器每行執行一次,對大表的DML操作(如批量導入)會導致性能驟降。例如,向10萬行的表插入數據,行級觸發器會執行10萬次,而語句級觸發器僅執行1次。
?避免遞歸觸發?:如果觸發器A在執行過程中修改了表T,導致觸發器A再次被觸發(遞歸),可能引發死循環或棧溢出。例如:

CREATE OR REPLACE TRIGGER trg_emp_salary_update
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN-- 如果漲薪超過10%,觸發管理員通知IF (:NEW.salary - :OLD.salary) / :OLD.salary > 0.1 THENUPDATE employees SET manager_id = manager_id WHERE id = :OLD.manager_id; -- 修改管理員記錄,再次觸發觸發器END IF;
END;

??這種情況下,修改管理員記錄會再次觸發同一觸發器,導致無限遞歸。

???批量操作的優化?:對于批量DML(如INSERT … SELECT),可通過BULK COLLECT和FORALL減少觸發器執行次數,或在觸發器中判斷是否為批量操作(通過SQL%ROWCOUNT)。

4.3 調試與監控

??觸發器的調試比普通PL/SQL更困難,因為它是隱式執行的。建議:

??在觸發器中添加DBMS_OUTPUT.PUT_LINE輸出調試信息(僅適用于開發環境);
使用Oracle的AWR(自動工作負載倉庫)或ASH(活動會話歷史)監控觸發器的執行計劃和耗時;
記錄觸發器的執行日志到專用表(如trigger_logs),包含觸發時間、事件類型、影響的行數等信息。

五、實戰案例:銀行轉賬的"隱形審計官"

??讓我們通過一個完整的案例,感受觸發器的實戰價值。

5.1 需求背景

??某銀行核心系統需要實現:當客戶A向客戶B轉賬時,自動記錄轉賬流水(包括轉出賬戶、轉入賬戶、金額、時間、操作柜員),并確保轉賬后轉出賬戶余額不低于0。

5.2 技術實現

?表結構?:

CREATE TABLE accounts (account_id   NUMBER PRIMARY KEY,balance      NUMBER NOT NULL CHECK (balance >= 0),owner_name   VARCHAR2(100)
);CREATE TABLE transactions (txn_id       NUMBER PRIMARY KEY,from_account NUMBER REFERENCES accounts(account_id),to_account   NUMBER REFERENCES accounts(account_id),amount       NUMBER NOT NULL CHECK (amount > 0),txn_time     TIMESTAMP DEFAULT SYSTIMESTAMP,operator     VARCHAR2(30)
);

?觸發器設計?:
我們需要對accounts表的UPDATE操作(轉賬本質是修改轉出和轉入賬戶的余額)進行攔截,但直接修改余額可能涉及兩條UPDATE語句(先扣減轉出賬戶,再增加轉入賬戶)。因此,更好的方式是對包含轉賬邏輯的存儲過程添加觸發器,或者在應用層調用存儲過程時觸發。

??這里,我們假設轉賬操作通過存儲過程transfer_funds完成:

CREATE OR REPLACE PROCEDURE transfer_funds(p_from_account IN NUMBER,p_to_account   IN NUMBER,p_amount       IN NUMBER,p_operator     IN VARCHAR2
) ISv_balance NUMBER;
BEGIN-- 檢查轉出賬戶余額是否足夠SELECT balance INTO v_balanceFROM accountsWHERE account_id = p_from_accountFOR UPDATE; -- 行鎖,防止并發修改IF v_balance < p_amount THENRAISE_APPLICATION_ERROR(-20002, '轉出賬戶余額不足');END IF;-- 扣減轉出賬戶余額UPDATE accountsSET balance = balance - p_amountWHERE account_id = p_from_account;-- 增加轉入賬戶余額UPDATE accountsSET balance = balance + p_amountWHERE account_id = p_to_account;-- 插入交易流水(這里可以交給觸發器自動完成)-- INSERT INTO transactions (...) VALUES (...);COMMIT;
END;
/

??為了自動記錄交易流水,我們創建一個AFTER UPDATE復合觸發器,監控accounts表的更新操作,并判斷是否為轉賬(即同一事務中存在兩條UPDATE語句,一條扣款、一條入賬)。

CREATE OR REPLACE TRIGGER trg_transfer_audit
FOR UPDATE OF balance ON accounts
COMPOUND TRIGGERTYPE t_txn_rec IS RECORD (from_account NUMBER,to_account   NUMBER,amount       NUMBER,operator     VARCHAR2(30));v_txn t_txn_rec;v_count NUMBER := 0; -- 記錄本次事務中更新的賬戶數BEFORE STATEMENT ISBEGIN-- 初始化變量v_count := 0;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN-- 每次更新前記錄賬戶ID和舊余額IF v_count = 0 THENv_txn.from_account := :OLD.account_id;v_txn.amount := :OLD.balance - :NEW.balance; -- 扣款金額=舊余額-新余額(應為正數)ELSIF v_count = 1 THENv_txn.to_account := :OLD.account_id;-- 驗證入賬金額是否等于扣款金額(防止邏輯錯誤)IF :NEW.balance - :OLD.balance <> v_txn.amount THENRAISE_APPLICATION_ERROR(-20003, '轉賬金額不一致:扣款=' || v_txn.amount || ',入賬=' || (:NEW.balance - :OLD.balance));END IF;-- 插入交易流水INSERT INTO transactions (txn_id, from_account, to_account, amount, operator)VALUES (txn_seq.NEXTVAL, v_txn.from_account, v_txn.to_account, v_txn.amount, p_operator); -- 注意:p_operator需從外部傳入,此處簡化為示例END IF;v_count := v_count + 1;END BEFORE EACH ROW;AFTER STATEMENT ISBEGIN-- 確保本次事務只處理兩筆更新(一筆扣款、一筆入賬)IF v_count != 2 THENRAISE_APPLICATION_ERROR(-20004, '非法轉賬操作:本次事務更新了' || v_count || '個賬戶');END IF;END AFTER STATEMENT;
END trg_transfer_audit;
/

5.3 效果驗證

??當執行transfer_funds(1001, 1002, 5000, ‘柜員001’)時:

??存儲過程檢查轉出賬戶(1001)余額是否≥5000;
扣減1001賬戶余額5000元,觸發觸發器的BEFORE EACH ROW,記錄from_account=1001,計算amount=5000;
增加1002賬戶余額5000元,觸發觸發器的BEFORE EACH ROW(此時v_count=1),驗證入賬金額是否等于5000元,并插入交易流水;
事務提交前,AFTER STATEMENT驗證本次事務僅更新了2個賬戶,確保沒有遺漏。
如果轉賬過程中出現錯誤(如余額不足、入賬金額不一致),觸發器會直接拋出錯誤,阻止操作,保證數據一致性。

六、結語:讓觸發器成為你的"得力助手"而非"麻煩制造者"

??親愛的朋友們,Oracle觸發器不是洪水猛獸,而是一把"雙刃劍"。它能讓業務邏輯更嚴謹、數據更安全,但也可能因濫用導致性能問題或邏輯漏洞。

記住以下幾點?:
觸發器是數據庫的"最后一道防線",用于強制執行無法通過應用層約束實現的規則;
優先使用簡單觸發器(語句級、BEFORE),避免不必要的行級觸發;
始終測試觸發器的性能影響,尤其是在批量操作場景下;
注釋清晰、日志完善,讓未來的你(或其他開發者)能快速理解觸發器的意圖。

??最后,我想用一句話總結:?觸發器的價值,在于讓數據操作"符合預期"——無論這種預期是來自業務規則、審計需求,還是系統安全。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89839.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python桌面版數獨游戲(三版)-增加難易度模式

數獨游戲難度模式解析 在數獨游戲中&#xff0c;難度通常由已知數字&#xff08;提示數&#xff09;的數量決定。難度越高&#xff0c;已知數字越少&#xff0c;玩家需要推理的步驟越多。以下是不同模式下的算法區別和核心代碼解析。 文章目錄數獨游戲難度模式解析1. **難度模…

k8s查看某個pod的svc

在 Kubernetes 中&#xff0c;要查看與特定 Pod 相關的 Service&#xff0c;可以通過以下方法&#xff1a;#### 方法一&#xff1a;通過標簽匹配1. **獲取 Pod 的標簽**bashkubectl get pod <pod-name> --show-labels輸出示例&#xff1a;NAME READY STATUS RESTARTS AGE…

通俗易懂卷積神經網絡(CNN)指南

本文用直觀類比和可視化方法&#xff0c;幫你徹底理解CNN的工作原理&#xff0c;無需深厚數學基礎也能掌握計算機視覺的核心技術。卷積神經網絡&#xff08;CNN&#xff09;是深度學習中革命性的架構&#xff0c;它徹底改變了計算機"看世界"的方式。本文將用最直觀的…

AV1平滑緩沖區

對于解碼的每一幀視頻數據&#xff0c;解碼器都必須從緩沖池中找到一個尚未被使用的幀緩沖區插槽來存儲解碼后的數據。分配的幀緩沖區插槽用于臨時保存解碼過程中生成的幀數據&#xff0c;直到它們被用于顯示或進一步的處理。函數get_free_buffer的作用是在緩沖池中搜索尚未被分…

Python并發編程:突破GIL枷鎖,高效利用多核CPU

解密concurrent.futures的雙引擎&#xff1a;線程池與進程池的明智選擇在Python并發編程領域&#xff0c;concurrent.futures模塊堪稱利器&#xff0c;但如何正確使用其兩大核心組件——ThreadPoolExecutor和ProcessPoolExecutor&#xff0c;卻讓許多開發者困惑。本文將深入剖析…

在Windows Server 2012 R2中安裝與配置IIS服務并部署mssql靶機教程

在Windows Server 2012 R2中安裝與配置IIS服務全指南 IIS&#xff08;Internet Information Services&#xff09;作為Windows系統自帶的Web服務組件&#xff0c;在企業級Web部署、內網服務搭建等場景中應用廣泛。本文將詳細介紹在Windows Server 2012 R2中安裝IIS服務的完整流…

C#/.NET/.NET Core技術前沿周刊 | 第 47 期(2025年7.14-7.20)

前言 C#/.NET/.NET Core技術前沿周刊&#xff0c;你的每周技術指南針&#xff01;記錄、追蹤C#/.NET/.NET Core領域、生態的每周最新、最實用、最有價值的技術文章、社區動態、優質項目和學習資源等。讓你時刻站在技術前沿&#xff0c;助力技術成長與視野拓寬。 歡迎投稿、推薦…

一.AD域與DFS集群-AD域安裝

目錄 1.網絡規劃 2.主域控安裝 3.輔助域控安裝 1.網絡規劃 服務器名稱IP地址DNS名稱主域控192.168.188.2pdc.test.cn輔助域控192.168.188.3bdc.test.cnDFS1192.168.188.4dfs1.test.cnDFS2192.168.188.5dfs2.test.cn 服務器系統版本為windows server 2022 2.主域控安裝 第一…

BUUCTF在線評測-練習場-WebCTF習題[BSidesCF 2020]Had a bad day1-flag獲取、解析

解題思路打開靶場&#xff0c;作者對我們進行了親切的關懷老規矩查看源碼、抓包并沒有發現什么貓膩點下面兩個按鈕會出現貓貓狗狗的圖片&#xff0c;此時我們發現url多了個 參數category那么比較明顯就是提示我們是任意文件包含、任意文件讀取漏洞了找不到任何信息&#xff0c;…

stm32mp157f-dk2安裝鏡像并且部署qt全流程

在網上看的關于stm32mp157的開發教程太少了&#xff0c;于是乎寫一篇踩坑筆記&#xff0c;僅供學習參考 大概流程&#xff1a;在虛擬機通過stm32cubeprogrammer燒錄鏡像&#xff0c;然后燒錄成功之后&#xff0c;給stm32mp157連接網線&#xff0c;使得開發板有ip地址&#xff…

遺像照片尺寸要求及手機制作打印方法

遺像作為寄托哀思的重要載體&#xff0c;其規格和質量都有嚴格要求。本文將詳細介紹遺像照片的標準尺寸規范&#xff0c;并提供使用手機快速制作合規遺像的完整方案。一、遺像照片的標準尺寸要求遺像照片的尺寸主要分為傳統黑白遺像和現代彩色遺像兩種規格。傳統黑白遺像一般采…

適配器模式 (Adapter Pattern)

適配器模式 (Adapter Pattern) 適配器模式是一種結構型設計模式&#xff0c;用于解決兩個不兼容接口之間的兼容性問題&#xff0c;充當兩個不同接口之間的橋梁。 &#x1f31f; 核心思想轉換接口&#xff1a;將一個類的接口轉換成客戶端期望的另一個接口&#xff0c;使原本不兼…

03-虛幻引擎藍圖類的各父類作用講解

虛幻引擎&#xff08;Unreal Engine&#xff09;的藍圖系統提供了多種父類&#xff0c;每種父類都有其特定的用途和生命周期。理解這些父類的作用&#xff0c;是高效使用藍圖開發游戲的基礎。以下是虛幻引擎中常見藍圖父類的詳細講解&#xff1a;1. Actor 作用&#xff1a;所有…

141 個 LangChain4j Maven 組件分類解析、多場景實戰攻略

141 個 LangChain4j Maven 組件分類解析、多場景實戰攻略 文章目錄 141 個 LangChain4j Maven 組件分類解析、多場景實戰攻略 1. 引言 2. LangChain4j 組件分類 2.1. 核心模塊 (Core Modules) 2.2. LLM 集成 (LLM Integrations) 2.3. 向量存儲集成 (Embedding Store Integratio…

Python可迭代歸約函數深度解析:從all到sorted的進階指南

在Python中&#xff0c;歸約函數&#xff08;Reduction Functions&#xff09;是處理可迭代對象的利器。它們通過遍歷元素并逐步收斂為單個結果&#xff0c;廣泛應用于數據分析、邏輯判斷和數值計算等場景。本文將系統梳理這些函數的核心特性、使用技巧及底層邏輯&#xff0c;助…

大帶寬服務器都有哪些應用場景?

大帶寬服務器憑借著高速的數據傳輸能力和強大的網絡承載能力&#xff0c;通常被企業應用在需要高流量和高并發處理能力的業務場景當中&#xff0c;下面&#xff0c;就讓我們共同了解一下大帶寬服務器的應用場景吧&#xff01;首先&#xff0c;隨著科學技術的快速發展&#xff0…

爬蟲實戰指南:從定位數據到解析請求的全流程解析

爬蟲的本質是什么&#xff1f; 爬蟲的本質就是用代碼模擬人類在瀏覽器里的操作&#xff0c;像點擊網頁、填寫表單、提交數據等行為&#xff0c;自動化地進行網頁數據的獲取和處理。比如&#xff1a; 發送 GET 請求 來請求網頁內容&#xff0c;相當于你在瀏覽器地址欄輸入網址…

Sentinel dashboard 添加context-path后無法信息無法上傳問題

Sentinel dashboard 添加context-path后無法加載問題 添加server.servlet.context-path/sentinel后可以正常訪問&#xff0c;但是客戶端啟動后信息上報失敗。 transport: dashboard: localhost:8858/sentinel 經查閱文檔需要加入api-path&#xff0c;但是我配置提示無api-path所…

iOS —— 3Gshare項目總結與思考

登陸注冊及推出主頁面這部分有兩種寫法&#xff1a;一種是在SceneDelegate中推出LoginVC&#xff0c;后在判斷登陸成功后退去主要程序。另一種則是先加載主程序&#xff0c;后推出登陸頁面。通過同組同學實踐證明&#xff0c;后者在推出登陸頁面時會閃一下&#xff0c;因此還是…

硅基計劃3.0 學習總結 貳 順序表與鏈表 初版

文章目錄一、順序表——ArrayList1. 實現自己MyArrayList1. 實現add基礎方法2. 實現指定位置加元素add方法3. 完善數組打印方法display4. 完善根據下標找元素get5. 完善判斷數字是否在數組中contains6. 根據數字找下標indexOf7. 更新指定下標元素set8. 獲取數組有效長度size9. …