20.Oracle11g中的触发器

news2025/1/21 6:32:51

oracle11g中的触发器

  • 一、触发器的概述
    • 1、什么是触发器
    • 2、触发器的类型
    • 3、触发器的组成
    • 4、触发器的作用
  • 二、触发器的创建语法
    • 1、创建语法
    • 2、数据库启动触发器
    • 3、 用户登录触发器:
  • 三、对触发器的基本操作
  • 点击此处跳转下一节:21.Oracle的程序包(Package)

一、触发器的概述

1、什么是触发器

触发器是一种特殊的存储过程,它是一段PL/SQL代码,可以在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行。触发器可以用来实现数据约束、数据审计、数据复制等功能。

  • 触发器是当特定事件出现时自动执行的存储过程
    • 提供审计和日志记录
    • 启用复杂的业务逻辑
  • 特定事件可以是执行更新的DML语句和DDL语句
    • 自动生成数据
    • 自定义复杂的安全权限
  • 触发器不能被显式调用

2、触发器的类型

在这里插入图片描述

Oracle11g中的DML触发器分为三种类型:

  • 行级触发器:对于每一行数据的操作都会触发该触发器。
  • 语句级触发器:对于每一条SQL语句的操作都会触发该触发器。
  • 复合触发器:既可以作为行级触发器,也可以作为语句级触发器。

3、触发器的组成

  1. 常见触发器由以下三部分组成

    • 触发器语句(事件)
      • 定义激活触发器的 DML 事件和 DDL 事件
    • 触发器限制
      • 执行触发器的条件,该条件必须为真才能激活触发器
    • 触发器操作(主体)
      • 包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
  2. 在Oracle 11g中,触发器由以下几个主要组成部分构成

    • 触发器名称(Trigger Name)
      • 触发器的名称是唯一的,用于标识触发器。在创建触发器时,需要为触发器指定一个名称,并且在数据库中触发器的名称是唯一的。
    • 触发时机(Triggering Event)
      • 触发器可以在不同的操作时机被触发,包括BEFOREAFTERINSTEAD OFBEFORE表示在操作执行之前触发,AFTER表示在操作执行之后触发,INSTEAD OF用于视图触发器。
    • 触发的操作类型(Triggering Action)
      • 触发器可以响应不同类型的数据库操作,包括INSERTUPDATEDELETE等。此外,还可以使用组合形式,比如INSERT OR UPDATEUPDATE OR DELETE等。
    • 触发的表(Triggering Table)
      • 触发器可以绑定到特定的数据库表上,当表上的操作符合触发条件时,触发器会被激活。
    • 触发器逻辑(Trigger Logic)
      • 触发器逻辑定义了触发器被激活时所执行的操作。这部分通常包含在BEGINEND之间,可以包括各种PL/SQL语句和逻辑。
    • 引用新旧值(Referencing New/Old Values)
      • 在行级触发器中,可以使用NEWOLD关键字来引用被操作的行的新旧值。这样可以在触发器逻辑中对新旧值进行比较和操作。
    • 触发条件(Trigger Condition)
      • 在行级触发器中,可以使用WHEN关键字来指定触发条件,只有当条件满足时触发器才会被激活。
    • 触发器类型(Trigger Type)
      • 触发器可以是行级触发器(FOR EACH ROW)或者语句级触发器(FOR EACH STATEMENT)。行级触发器会在每行被操作时触发,而语句级触发器会在每个SQL语句执行时触发。

    以上是Oracle 11g触发器的主要组成部分,了解这些组成部分可以帮助我们更好地理解和设计触发器,以满足特定的业务需求。

4、触发器的作用

  1. 实现数据约束:通过触发器可以对特定的数据库操作进行限制,从而保证数据的完整性和一致性。

    当使用触发器实现数据约束时,可以在触发器中编写逻辑来检查插入、更新或删除的数据是否符合特定的约束条件。以下是一个简单的示例,演示了如何使用触发器实现数据约束:

    假设我们有一个名为employee的表,包含以下字段:employee_id, employee_name, salary。我们希望在每次更新员工的薪水时,自动检查薪水是否在有效范围内(例如,不能低于最低工资,不能高于最高工资)。

    首先,我们创建一个触发器,当有员工的薪水被更新时,自动检查薪水是否在有效范围内。

    CREATE OR REPLACE TRIGGER check_salary_range_trigger
    BEFORE UPDATE OF salary ON employee
    FOR EACH ROW
    BEGIN
        IF :NEW.salary < 1000 THEN
            RAISE_APPLICATION_ERROR(-20001, 'Salary cannot be less than 1000');
        ELSIF :NEW.salary > 100000 THEN
            RAISE_APPLICATION_ERROR(-20002, 'Salary cannot exceed 100000');
        END IF;
    END;
    /
    

    在上面的代码中,我们创建了一个名为check_salary_range_trigger的触发器。它是一个行级触发器(FOR EACH ROW),当员工的薪水被更新前(BEFORE UPDATE OF salary ON employee)触发器会检查薪水是否在有效范围内。如果薪水不在有效范围内,触发器会抛出一个自定义的应用程序错误,从而阻止薪水更新操作。

    现在,当我们尝试更新员工的薪水时,触发器会自动检查薪水是否在有效范围内,如果不符合约束条件,更新操作将被阻止并抛出相应的错误信息。

    这就是一个简单的触发器示例,说明了触发器在实现数据约束功能时的作用。其他的数据约束也可以通过类似的方式在触发器中实现。


  2. 实现数据审计:通过触发器可以记录特定的数据库操作,从而实现数据审计的功能。

    假设我们有一个名为employee的表,包含以下字段:employee_id, employee_name, salary。我们希望在每次有新员工加入时,自动记录员工加入的时间。

    首先,我们创建一个新的表employee_audit,用于记录员工加入的时间。表的结构如下:

    CREATE TABLE employee_audit (
        employee_id NUMBER,
        join_date DATE
    );
    

    接下来,我们创建一个触发器,当有新员工加入时,自动将员工的ID和加入时间插入到employee_audit表中。

    CREATE OR REPLACE TRIGGER employee_join_trigger
    AFTER INSERT ON employee
    FOR EACH ROW
    BEGIN
        INSERT INTO employee_audit (employee_id, join_date)
        VALUES (:NEW.employee_id, SYSDATE);
    END;
    /
    

    在上面的代码中,我们创建了一个名为employee_join_trigger的触发器。它是一个行级触发器(FOR EACH ROW),当有新的员工被插入(AFTER INSERT ON employee)时,触发器会将员工的ID和加入时间插入到employee_audit表中。

    现在,当我们向employee表中插入新的员工记录时,触发器会自动将员工的ID和加入时间记录到employee_audit表中,从而实现了数据审计的功能。

    这就是一个简单的触发器示例,说明了触发器在实现数据审计功能时的作用。其他的触发器功能也可以通过类似的方式实现。


  3. 实现数据复制:通过触发器可以在不同的数据库之间实现数据的复制。

    当使用触发器实现数据复制时,可以在触发器中编写逻辑来将插入、更新或删除的数据复制到另一个表中。以下是一个简单的示例,演示了如何使用触发器实现数据复制:

    假设我们有一个名为employee的表,包含以下字段:employee_id, employee_name, salary。我们希望在每次有新员工加入时,自动将员工的信息复制到另一个表employee_copy中。

    首先,我们创建一个新的表employee_copy,用于存储复制的员工信息。表的结构与employee表相同。

    CREATE TABLE employee_copy (
        employee_id NUMBER,
        employee_name VARCHAR2(100),
        salary NUMBER
    );
    

    接下来,我们创建一个触发器,当有新员工加入时,自动将员工的信息复制到employee_copy表中。

    CREATE OR REPLACE TRIGGER employee_copy_trigger
    AFTER INSERT ON employee
    FOR EACH ROW
    BEGIN
        INSERT INTO employee_copy (employee_id, employee_name, salary)
        VALUES (:NEW.employee_id, :NEW.employee_name, :NEW.salary);
    END;
    /
    

    在上面的代码中,我们创建了一个名为employee_copy_trigger的触发器。它是一个行级触发器(FOR EACH ROW),当有新的员工被插入(AFTER INSERT ON employee)时,触发器会将员工的ID、姓名和薪水插入到employee_copy表中。

    现在,当我们向employee表中插入新的员工记录时,触发器会自动将员工的信息复制到employee_copy表中,从而实现了数据复制的功能。

    这就是一个简单的触发器示例,说明了触发器在实现数据复制功能时的作用。其他的数据复制也可以通过类似的方式在触发器中实现。


  4. 实现业务逻辑:通过触发器可以实现特定的业务逻辑,从而简化应用程序的开发和维护。

    假设我们有一个名为orders的表,包含以下字段:order_id, order_date, total_amount。我们希望在每次有新订单插入时,自动更新客户的最近订单日期。

    以下是一个示例代码,演示了如何使用触发器实现这个业务逻辑:

    首先,我们创建一个名为customer的表,包含以下字段:customer_id, customer_name, last_order_datelast_order_date字段用于存储客户的最近订单日期。

    CREATE TABLE customer (
        customer_id NUMBER,
        customer_name VARCHAR2(100),
        last_order_date DATE
    );
    

    接下来,我们创建一个触发器,当有新订单插入时,自动更新客户的最近订单日期。

    CREATE OR REPLACE TRIGGER update_last_order_date_trigger
    AFTER INSERT ON orders
    FOR EACH ROW
    BEGIN
        UPDATE customer
        SET last_order_date = :NEW.order_date
        WHERE customer_id = :NEW.customer_id;
    END;
    /
    

    在上面的代码中,我们创建了一个名为update_last_order_date_trigger的触发器。它是一个行级触发器(FOR EACH ROW),当有新的订单被插入(AFTER INSERT ON orders)时,触发器会自动更新对应客户的最近订单日期。

    现在,当我们向orders表中插入新的订单记录时,触发器会自动更新对应客户的最近订单日期,从而实现了业务逻辑的功能。

    这就是一个简单的触发器示例,说明了触发器在实现业务逻辑时的作用。其他的业务逻辑也可以通过类似的方式在触发器中实现。


  5. 实现性能优化:通过触发器可以对特定的数据库操作进行优化,从而提高系统的性能。

    触发器可以用于实现性能优化,例如在数据更新时进行一些计算或者更新其他相关的数据。以下是一个示例代码,演示了如何使用触发器实现性能优化:

    假设我们有一个名为order_items的表,包含以下字段:order_id, item_id, quantity, unit_price。我们希望在每次插入或更新订单项时,自动更新订单的总金额。

    首先,我们创建一个名为orders的表,包含以下字段:order_id, order_date, total_amounttotal_amount字段用于存储订单的总金额。

    CREATE TABLE orders (
        order_id NUMBER,
        order_date DATE,
        total_amount NUMBER
    );
    

    接下来,我们创建一个触发器,当有新的订单项插入或更新时,自动更新订单的总金额。

    CREATE OR REPLACE TRIGGER update_order_total_amount_trigger
    AFTER INSERT OR UPDATE ON order_items
    FOR EACH ROW
    BEGIN
        IF INSERTING THEN
            UPDATE orders
            SET total_amount = total_amount + (:NEW.quantity * :NEW.unit_price)
            WHERE order_id = :NEW.order_id;
        ELSIF UPDATING THEN
            UPDATE orders
            SET total_amount = total_amount - (:OLD.quantity * :OLD.unit_price) + (:NEW.quantity * :NEW.unit_price)
            WHERE order_id = :NEW.order_id;
        END IF;
    END;
    /
    

    在上面的代码中,我们创建了一个名为update_order_total_amount_trigger的触发器。它是一个行级触发器(FOR EACH ROW),当有新的订单项被插入或更新(AFTER INSERT OR UPDATE ON order_items)时,触发器会自动更新对应订单的总金额。

    在触发器中,我们使用了条件语句来区分插入和更新操作,以便在每种情况下都能正确更新订单的总金额。

    现在,当我们向order_items表中插入或更新订单项时,触发器会自动更新对应订单的总金额,从而实现了性能优化的功能。

    这就是一个简单的触发器示例,说明了触发器在实现性能优化时的作用。其他的性能优化也可以通过类似的方式在触发器中实现。


总之,触发器是Oracle数据库中非常重要的一个功能,它可以帮助我们实现很多有用的功能,并且可以提高系统的性能和可维护性。在使用触发器时,需要注意避免过度使用,以免对系统性能产生负面影响。


二、触发器的创建语法

1、创建语法

在Oracle 11g中,可以使用以下语法来创建触发器:

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE | {INSERT OR UPDATE} | {UPDATE OR DELETE} | {INSERT OR DELETE} | {INSERT OR UPDATE OR DELETE}}
ON table_name
[REFERENCING {NEW AS new | OLD AS old | NEW AS new OLD AS old}]
[FOR EACH ROW | FOR EACH STATEMENT]
[WHEN (condition)]
BEGIN
    -- 触发器逻辑
END;
/

下面是对上述语法中各个部分的详细介绍:

  1. CREATE [OR REPLACE] TRIGGER trigger_name:用于创建一个新的触发器。OR REPLACE关键字表示如果同名的触发器已经存在,则替换掉原有的触发器。

  2. {BEFORE | AFTER | INSTEAD OF}:指定触发器的触发时机,BEFORE表示在操作执行前触发,AFTER表示在操作执行后触发,INSTEAD OF用于视图触发器。

  3. {INSERT | UPDATE | DELETE | {INSERT OR UPDATE} | {UPDATE OR DELETE} | {INSERT OR DELETE} | {INSERT OR UPDATE OR DELETE}}:指定触发器要响应的操作类型。可以是单个操作类型,也可以是多个操作类型的组合。

  4. ON table_name:指定触发器要绑定的表名。

  5. [REFERENCING {NEW AS new | OLD AS old | NEW AS new OLD AS old}]:用于在触发器逻辑中引用新旧值。NEW表示新值,OLD表示旧值。

  6. [FOR EACH ROW | FOR EACH STATEMENT]:指定触发器是行级触发器还是语句级触发器。FOR EACH ROW表示行级触发器,FOR EACH STATEMENT表示语句级触发器。

  7. [WHEN (condition)]:可选项,用于在行级触发器中指定触发条件。

  8. BEGIN ... END;:在BEGINEND之间包含了触发器的逻辑代码。

  9. 触发器逻辑:在BEGINEND之间的部分是触发器的逻辑代码,用于定义触发器要执行的操作。

  10. /:表示SQL语句的结束。

通过以上语法,可以在Oracle 11g中创建各种类型的触发器,用于实现特定的业务逻辑或性能优化。

2、数据库启动触发器

数据库启动触发器是在数据库启动时自动执行的触发器,它可以用于执行一些初始化操作。在Oracle数据库中,可以使用AFTER STARTUP触发器来实现数据库启动触发器。以下是一个简单的示例:

CREATE OR REPLACE TRIGGER startup_trigger
AFTER STARTUP
ON DATABASE
BEGIN
  -- 在数据库启动时执行的操作
  DBMS_OUTPUT.PUT_LINE('Database has been started');
  -- 可以在这里添加其他需要执行的初始化操作
END;
/

在上面的示例中,我们创建了一个名为startup_trigger的触发器,它在数据库启动后执行。在触发器的BEGINEND之间可以编写需要在数据库启动时执行的操作。

示例如下:
这段SQL包含了两部分操作:

CREATE TABLE event_table (event varchar2(30), 
                          time  date);

这部分SQL用来创建一个名为event_table的表,表中包含了事件(event)和时间(time)两个字段。这个表似乎是用来记录不同事件和它们发生的时间。

CREATE OR REPLACE TRIGGER tr_startup
  AFTER startup ON DATABASE
BEGIN
  INSERT INTO event_table VALUES (ora_sysevent, SYSDATE);
END;

这部分SQL用来创建一个名为tr_startup的触发器,它是一个“after startup”类型的触发器,意味着它会在数据库启动后触发。当数据库启动时,触发器会将当前系统事件(ora_sysevent)和当前时间(sysdate)插入到event_table表中。

这样,当数据库启动时,触发器会自动将相关信息记录到event_table表中,从而实现了记录数据库启动事件的功能。

3、 用户登录触发器:

用户登录触发器是在用户登录到数据库时自动执行的触发器,它可以用于记录用户登录信息、执行安全检查等操作。在Oracle数据库中,可以使用AFTER LOGON触发器来实现用户登录触发器。以下是一个简单的示例:

CREATE OR REPLACE TRIGGER login_trigger
AFTER LOGON
ON DATABASE
BEGIN
  -- 在用户登录时执行的操作
  DBMS_OUTPUT.PUT_LINE('User ' || USER || ' has logged in');
  -- 可以在这里添加其他与用户登录相关的操作
END;
/

在上面的示例中,我们创建了一个名为login_trigger的触发器,它在用户登录后执行。在触发器的BEGINEND之间可以编写需要在用户登录时执行的操作,例如记录用户登录信息、执行权限检查等。
示例如下:

CREATE TABLE log_table(username  varchar2(20), 
                       logon_time  date, 
                       logoff_time  date, 
                       address varchar2(20));

这部分SQL用来创建一个名为log_table的表,表中包含了用户名(username)、登录时间(logon_time)、登出时间(logoff_time)和地址(address)等字段。

CREATE OR REPLACE TRIGGER tr_logon
  AFTER logon ON DATABASE
BEGIN
  INSERT INTO log_table
    (username, logon_time, address)
  VALUES
    (ora_login_user, SYSDATE, ora_client_ip_address);
END;

这部分SQL用来创建一个名为tr_logon的触发器,它是一个“after logon”类型的触发器,意味着它会在用户登录后触发。当用户登录时,触发器会将当前登录用户(ora_login_user)、登录时间(sysdate)和客户端IP地址(ora_client_ip_address)插入到log_table表中。

oracle常用系统变量
	- Ora_client_ip_address 返回客户端的ip地址
	- Ora_database_name 返回当前数据库名
	- Ora_login_user 返回登录用户名
	- Ora_dict_obj_name 返回ddl操作所对应的数据库对象名 
	- Ora_dict_obj_type 返回ddl操作所对应的数据库对象的类型  

oracle常用系统变量

这样,当用户登录数据库时,触发器会自动将相关信息记录到log_table表中,从而实现了用户登录日志的记录功能。


通过使用数据库启动触发器和用户登录触发器,可以在数据库启动和用户登录时执行一些必要的操作,从而提高数据库的安全性和可靠性。

三、对触发器的基本操作

在Oracle 11g中,可以通过以下方式对触发器进行基本操作:启用、禁用、删除、查看触发器的基本信息。

  1. 启用触发器:

    ALTER TRIGGER trigger_name ENABLE;
    
  2. 禁用触发器:

    ALTER TRIGGER trigger_name DISABLE;
    
  3. 删除触发器:

    DROP TRIGGER trigger_name;
    
  4. 查看触发器的基本信息:

    SELECT trigger_name, table_name, triggering_event
    FROM user_triggers;
    

    这条查询语句将返回当前用户拥有的所有触发器的名称(trigger_name)、所属表名(table_name)和触发事件(triggering_event)的信息。

通过以上操作,可以对Oracle 11g中的触发器进行启用、禁用、删除以及查看基本信息的操作。

点击此处跳转下一节:21.Oracle的程序包(Package)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1268890.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QNX下多窗口叠加融合方案

目的&#xff1a;QNX下EGL多窗口叠加融合方案 环境&#xff1a; 系统&#xff1a;QNX 环境&#xff1a;8155/8295问题&#xff1a; EGL有时候在同一个进程中因为引入不同的功能&#xff0c;在不同的线程中进行窗口的绘制和融合&#xff0c;QNX下的融合方案&#xff0c;实测使…

夸克大模型助力学术科研提效 四大优势提升知识正确性

当严谨的学术科研与创新的大模型技术结合在一起&#xff0c;会擦出什么样的火花&#xff1f;日前&#xff0c;夸克大模型甫一推出便以优秀的性能成为国产大模型中的“学霸”。在中国科学技术协会近期主办的“大模型应用场景研讨会”上&#xff0c;夸克大模型在快速阅读、创作润…

求臻医学胃癌关爱日:美味的高“盐”值杀手

胃癌的发病率具有广泛的地域差异&#xff0c;在东南亚国家尤为高发。韩国是胃癌发病率排名第一的国家&#xff0c;其次为日本&#xff0c;中国紧随其后&#xff0c;由于中国人口基数大&#xff0c;其绝对患胃癌人数为全球第一&#xff0c;每年有100多万新诊断患者&#xff0c;其…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

wvp 视频监控平台抓包分析

抓包时机 下面的抓包时机是抓包文件最新&#xff0c;但是最有用的包 选择网卡开始抓包 如果之前已经选择网卡&#xff0c;直接开始抓包 停止抓包 重新抓包 sip播放过程分析 过滤条件 tcp.port 5060 and sip 可以看到有这些包 选择任何一个 &#xff0c;戍边右键--追踪流--…

Maven——使用Nexus创建私服

私服不是Maven的核心概念&#xff0c;它仅仅是一种衍生出来的特殊的Maven仓库。通过建立自己的私服&#xff0c;就可以降低中央仓库负荷、节省外网带宽、加速Maven构建、自己部署构件等&#xff0c;从而高效地使用Maven。 有三种专门的Maven仓库管理软件可以用来帮助大家建立…

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录 一、异常处理1、异常概念引入2、抛出异常语法3、捕获异常语法4、异常捕获流程 二、异常处理代码示例1、错误代码示例 - 抛出异常 / 不捕获异常2、正确代码示例 - 抛出异常 / 捕获异常3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常 一、异常处理 1、异常概…

【导航控制器的基本使用 Objective-C语言】

一、导航控制器的基本使用 1.那接下来呢,我们就要讲解这个重中之重了啊,导航控制器,大家一定要注意听,那首先呢,我们先来看ppt,引导一下, 导航控制器.pptx,打开, 那接下来呢,我们就要学习这个多控制器的管理了, 里面的第一个内容,叫做导航控制器, 那今天呢,我们…

unity学习笔记08

一、预制体 在Unity中&#xff0c;预制体&#xff08;Prefab&#xff09;是一种特殊类型的游戏对象&#xff0c;它允许你创建、配置和保存一个对象&#xff0c;然后在场景中多次使用。预制体的使用使得开发者能够更加灵活和高效地设计和管理游戏对象。 1.创建预制体 可以选择…

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型 网络结构图测试代码网络结构图 测试代码 import paddle import numpy as np import pandas as pd from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):

专业的调查问卷平台推荐:提升数据收集与分析效率

无论是学生还是职场人士&#xff0c;想做好一份调查问卷&#xff0c;关键先要确定调查的主题&#xff0c;然后确定调查人群&#xff0c;编辑问题&#xff0c;最后能够尽可能的美化问卷调查的主题。 想要做到这几点&#xff0c;就要要求问卷调查平台: 1、能够帮助你快速制作出一…

TA-Lib学习研究笔记(一)

TA-Lib学习研究笔记&#xff08;一&#xff09; 1.介绍 TA-Lib&#xff0c;英文全称“Technical Analysis Library”,是一个用于金融量化的第三方库&#xff0c;涵盖了150多种交易软件中常用的技术分析指标&#xff0c;如RSI,KDJ,MACD, MACDEXT, MACDFIX, SAR, SAREXT, MA,SM…

Ubuntu16.04.4系统本地提权实验

目录 1.介绍&#xff1a; 2.实验&#xff1a; 3.总结&#xff1a; 1.介绍&#xff1a; 1.1&#xff1a;eBPF简介&#xff1a;eBPF(extendedBerkeleyPacketFilter)是内核源自于BPF的一套包过滤机制&#xff0c;BPF可以理解成用户与内核之间的一条通道&#xff0c;有非常强大的…

免费好用的伪原创工具推荐,都是国内的人工智能AI

在当今数字化信息爆炸的时代&#xff0c;创作者们为了在激烈的竞争中脱颖而出&#xff0c;常常需要花费大量时间来创作独特的内容。然而&#xff0c;有时候时间并不是每个人都拥有充足的资源。于是&#xff0c;一些免费智能伪原创工具成为了许多创作者的利器&#xff0c;能够在…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

将原生Spring项目中某些配置文件中的易变内容参数化

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Making Reconstruction-based Method Great Again for Video Anomaly Detection

Making Reconstruction-based Method Great Again for Video Anomaly Detection 文章信息&#xff1a; 发表于ICDM 2022&#xff08;CCF B会议&#xff09; 原文地址&#xff1a;https://arxiv.org/abs/2301.12048 代码地址&#xff1a;https://github.com/wyzjack/MRMGA4VAD…

PM2 在线和离线部署uvicorn和fastapi项目过程

PM2介绍 PM2 is a daemon process manager that will help you manage and keep your application online 24/7 PM2是一个后台进程管理工具&#xff0c;能帮助管理应用和维持应用7*24小时运行。 PM2在线安装 npm install pm2 -gPM2离线安装(适用于内网) 参见 如何离线安装pm2…

Error running OrderServiceBoot. Command line is too long.

微服务启动不成功&#xff0c;报Error running OrderServiceBoot. Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun. 解决&#xff1a; 方法一&#xff1a; 右上角启动小三角 -->Edit configuration–>-右侧…

接单平台在精不在多,劝诸位程序员找个好平台!

程序员想找兼职搞副业&#xff0c;结果知乎上逛了一大圈&#xff0c;各种平台推荐&#xff0c;可以说是眼花缭乱。要么就是平台一搜&#xff0c;各种劝退&#xff01;好好好&#xff0c;就问一句&#xff0c;还搞不搞&#xff1f;Of course~有钱还不赚的是傻子。加班摸鱼的时候…