笔记081122 --- trigger

本文详细介绍了数据库触发器的设计与应用,包括行级触发器、级联更新、删除数据等操作,并探讨了触发器与事务之间的关系,以及如何利用触发器来记录数据变更日志。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

笔记081122 --- trigger

2008-11-21 下午6:32 发布人 tiger chang

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
触发器

触发器的设计 是自动执行的,触发器是不接受参数的
可以用来维护表的约束限制,审批表的相关信息,
数据操作员触发器,
数据定义元触发器。

~~~~~~~~~~~~~~~~~~~~~~~~~~~
行级触发器的工作原理
~~~~~~~~~~~~~~~~~~~~~~~~~~~
事务简述
    事务是数据库中的重要机制,用于确保数据完整性和并发处理

的能力
它将一条、一组SQL语句当作成一个逻辑上的单元,用于保证这些语句都

能成功或失败。
事务的特性
    A(AOMICITY):原子性
    C(CONSISTENCY):一致性
    I(ISOLATION):隔离性
    D(DURABILITY):永久性
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
删除数据的行级触发器

CREATE OR REPLEACE TRIGGER del_s
AFTER DELETE ON STUDENT
FOR EACH ROW
BEGIN
DELETE FROM SC WHERE SNO  = :OLD.SNO;
END del_s;
/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

CREATE OR REPLACE TRIGGER INSERT_S
AFTER INSERT ON STUDENT
FOR EACH ROW
BEGIN
INSERT INTO SC(SNO,CNO) VALUES(NEW.SNO,'0001');
END;
/

OLD AND NEW
old 和 new 是内存中的特殊的表,
old  new 是在内存中的逻辑表

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

级联更新
 
CREATE OR REPLACE TRIGGER UPDATE_S
AFTER UPDATE ON STUDENT
FOR EACH ROW
BEGIN
UPDATE SC SET SNO = :NEW.SNO WHERE SNO= :OLD.SNO;
END;
/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
触发器中不能使用commit & rollback;

CREATE OR REPLACLE  TRIGGER DEL_STU
AFTER DELETE ON STUDENT
FOR EACH ROW
BEGIN
IF :OLD.SNO = '05062233' THEN
RAISE_APPLICATION_ERROR(-20000,'不允许删除该数据'); 
ENDIF;
END;
/

-------------_______________
SQL> CREATE OR REPLACE  TRIGGER DEL_STU
  2  AFTER DELETE ON STUDENT
  3  FOR EACH ROW
  4  BEGIN
  5  IF :OLD.SNO = '06062233' THEN
  6  RAISE_APPLICATION_ERROR(-20000,'不允许删除该数据');
  7  END IF;
  8  END;
  9  /

触发器已创建

SQL> DELETE FROM STUDENT WHERE SNO = '06062233';
DELETE FROM STUDENT WHERE SNO = '06062233'
            *
第 1 行出现错误:
ORA-20000: 不允许删除该数据
ORA-06512: 在 "CHANGHU.DEL_STU", line 3
ORA-04088: 触发器 'CHANGHU.DEL_STU' 执行过程中出错

_____________________________________________


RAISE_APPLICATION_ERROR(-20000,'不允许删除该数据'); 
启动错误
(-20999  -20000)这个错误号的使用范围。
---- -20000是错误好,''为错误信息


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

语句级的触发器

~~~~~~~~~~~~~~~~~~~~~~~~~

CREATE TABLE MYLOG(
CURR_USER VARCHAR2(100),
CURR_DATE DATE,
ACT     CHAR(1)
);

CREATE OR REPLACE TRIGGER DML_AA
AFTER INSERT OR DELETE OR UPDATE ON STUDENT
BEGIN
IF INSERTING THEN
    INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
ELSEIF DELETING THEN
    INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
ELSE
    INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
END IF ;
END;
/

SQL> EDIT
已写入 file afiedt.buf

  1  CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> /

触发器已创建

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CREATE OR REPLACE TRIGGER SET_AUTO
BEFORE INSERT ON AUTO
FOR EACH ROW
DECLARE
NO NUMBER(5),
BEGIN
SELECT MYSEQ.NEXTVAL INTO NO FROM DUAL;
:NEW.A:=NO;
END;
/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

替换触发器的应用

只能建到试图上

解决试图的多表更新问题


CREATE OR REPLACE TRIGGER TR_V_E_D
INSERT OF INSERT ON view_sc
FOR EACH ROW
BEGIN
INSERT INTO .....
INSERT INTO ......
END;
/


~~~~~~~~~~~~~~~~~~~~~

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


SQL> L
  1  CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSEIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> EDIT
已写入 file afiedt.buf

  1  CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> /

触发器已创建

SQL> DESC DEPT2;
 名称                                      是否为空
 ----------------------------------------- -------

 ID                                        NOT NUL
 NAME

SQL> INSER INTO  DEPT VALUES(4,'HELLOWORLD');
SP2-0734: 未知的命令开头 "INSER INTO..." - 忽略了剩
SQL> INSERT INTO DEPT2 VALUES (4,'HELLOWORLD');

已创建 1 行。

SQL> INSERT INTO DEPT2 VALUES (4,'HELLOWORLD');
INSERT INTO DEPT2 VALUES (4,'HELLOWORLD')
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (CHANGHU.SYS_C004113)


SQL> INSERT INTO DEPT2 VALUES (5,'HELLOWORLD');

已创建 1 行。

SQL> INSERT INTO DEPT2 VALUES (6,'HELLOWORLD');

已创建 1 行。

SQL> UPDATE DEPT2 SET NAME = 'GOOGLE' WHERE ID = 5

已更新 1 行。

SQL> UPDATE DEPT2 SET NAME = 'GOOGLE' WHERE ID = 3

已更新 1 行。

SQL> DELETE  FROM DEPT2 WHERE ID = 5;

已删除 1 行。

SQL> DELETE  FROM DEPT2 WHERE ID = 4;

已删除 1 行。

SQL> SELECT * FROM MYLOG;

未选定行

SQL> SELECT * FROM MYLOG;

未选定行

SQL> SELECT TARGGER_NAME FROM USER_TRIGGERS;
SELECT TARGGER_NAME FROM USER_TRIGGERS
       *
第 1 行出现错误:
ORA-00904: "TARGGER_NAME": 标识符无效


SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;

TRIGGER_NAME
--------------------------------------------------
INSERT_S
UPDATE_S
DEL_DEPT2
DEL_S
DEL_STU
DEPT2
ABOUT_MYLOG

已选择7行。

SQL> SELECT * FROM MYLOG;

未选定行

SQL> CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11  END;
 12  /

触发器已创建

SQL> EDIT
已写入 file afiedt.buf

  1  CREATE OR REPLACE TRIGGER MYLOG
  2  AFTER INSERT OR DELETE OR UPDATE ON DEPT2
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> /

触发器已创建

SQL> INSERT INTO DEPT2 VALUES(19,'HELLO');

已创建 1 行。

SQL> SELECT * FROM MYLOG;

CURR_USER                                CURR_DATE      AC
---------------------------------------- -------------- --
CHANGHU                                  22-11月-08     I

SQL> UPDATE DEPT2 SET NAME = 'GOOGLE' WHERE ID = 19;

已更新 1 行。

SQL> SELECT * FROM MYLOG;

CURR_USER                                CURR_DATE      AC
---------------------------------------- -------------- --
CHANGHU                                  22-11月-08     I
CHANGHU                                  22-11月-08     U

SQL> DELETE FROM DEPT2 WHERE ID = 19;

已删除 1 行。

SQL> SELECT * FROM MYLOG;

CURR_USER                                CURR_DATE      AC
---------------------------------------- -------------- --
CHANGHU                                  22-11月-08     I
CHANGHU                                  22-11月-08     U
CHANGHU                                  22-11月-08     D

SQL>

<think>我们正在讨论Wi-Fi6(802.11ax)中的波束成形技术,特别是HE(High-Efficiency)非触发式(non-TB)探测和触发式(TB)探测的区别。根据用户提供的引用内容(引用[1]),我们可以总结出以下关键点:引用[1]中关于HE探测的要点:1.non-TBNDPA(空数据包宣告)只能单播,且只能有一条STA(站点)信息,AID(关联标识符)不能是0或2047(除了0和2047以外的数值)。2.non-TB探测只能使用全带宽(fullBW)。3.TBNDPA必须是广播的,使用广播地址(RA),且必须包含两个或以上的STA信息。4.支持跨BSSID(基本服务集标识符),但需要接收方支持,且NDPA的发送地址(TA)是目标BSSID。5.在STA信息中,对于AP、IBSS、mesh、TDLSpeer,AID11字段为0。6.TBNDPA支持AID为2047,且仅出现在第一个STA信息中。7.TBNDPA支持SU-type(单用户类型)、MU-type(多用户类型)、CQI反馈(信道质量指示)。8.在TB探测中,波束成形器(beamformer)决定子载波分组(scgrouping)、Ng(分组大小)、码本大小(codebooksize)和/或Nc(在NDPA中指定)。9.在non-TB探测中,波束成形接收器(beamformee)决定上述参数(即第8点)。10.多次BFRP(波束成形轮询)必须在当前TXOP(传输机会)内完成。未被NDPA指定的STA不能被触发。11.优先满足PPDU(物理层协议数据单元)长度限制。如果超过限制,反馈(feedback)将不被发送。现在,我们需要根据这些信息来回答用户的问题:HEnon-trigger-based(non-TB)sounding和HEtrigger-based(TB)sounding的区别,特别是在单用户(SU)和多用户(MU)场景下的应用。我们将从以下几个方面进行对比:1.基本工作模式2.帧结构(NDPA)特点3.带宽使用4.参数决定方5.适用场景(SU/MU)6.其他特性(如AID、广播/单播等)具体回答如下:</think>### Wi-Fi 6中HE non-TB Sounding与HE TB Sounding技术对比 #### 一、核心区别概览 | **特性** | **HE non-TB Sounding** | **HE TB Sounding** | |--------------------|-------------------------------------|-----------------------------------| | **工作模式** | 单播(Unicast) | 广播(Broadcast) | | **NDPA帧结构** | 仅含单条STA信息 | ≥2条STA信息,首条AID=2047[^1] | | **带宽限制** | 强制全带宽(full BW) | 支持部分带宽 | | **参数决策方** | Beamformee(接收端)决定[^1] | Beamformer(发射端)决定[^1] | | **反馈触发方式** | 被动反馈 | BFRP轮询主动触发 | | **跨BSS支持** | 不支持 | 支持(需接收端兼容)[^1] | #### 二、单用户(SU)场景应用 **1. non-TB Sounding适用场景** - **设备配对**:AP与单个STA建立专用链路 - **操作流程**: ```mermaid graph LR A[AP发送non-TB NDPA] --> B[单STA接收] B --> C[STA计算CSI参数] C --> D[被动反馈CSI] ``` - **优势**:低开销、低延迟,适用于手机/笔记本等单设备连接 **2. TB Sounding在SU的特殊应用** - **伪装广播**:通过AID=2047实现伪单播[^1] - **特殊需求**:当需要发射端控制码本参数时使用 #### 三、多用户(MU)场景应用 **1. TB Sounding核心优势** - **大规模调度**:单帧支持最多8用户CSI获取 - **关键流程**: ```mermaid sequenceDiagram AP->>+STA群组: 广播TB NDPA(含STA列表) STA群组-->>AP: 同步反馈CSI AP->>AP: 计算MU-MIMO预编码 ``` - **参数控制**:发射端统一设置: - 子载波分组($sc\ grouping$) - 码本尺寸($codebook\ size$) - 量化精度($N_c, N_g$)[^1] **2. non-TB在MU的限制** - **协议禁止**:NDPA只能包含单STA信息[^1] - **替代方案**:通过连续单播实现,但效率低下 #### 四、关键技术差异详解 **1. 反馈机制对比** - **TB轮询规则**: - BFRP触发严格限定在当前TXOP - 仅NDPA指定STA可响应[^1] $$ \text{Feedback}_{\text{valid}} = \begin{cases} 1 & \text{if } \text{STA}_{\text{ID}} \in \text{NDPA}_{\text{list}} \\ 0 & \text{otherwise} \end{cases} $$ **2. 物理层限制处理** - 共同约束:PPDU长度超限时自动丢弃反馈[^1] - TB优化:通过码本参数压缩反馈量 **3. 波束成形参数控制** | **参数** | non-TB控制方 | TB控制方 | |----------------|--------------|----------| | 子载波分组 | Beamformee | Beamformer | | 码本类型 | Beamformee | Beamformer | | 量化比特数 | Beamformee | Beamformer | #### 五、典型应用场景推荐 | **场景** | **推荐技术** | **原因** | |-------------------------|------------------|------------------------------| | 手机直连AP | non-TB Sounding | 单设备低开销 | | 会议室多设备MU-MIMO | TB Sounding | 高效多用户信道获取 | | 跨AP协同调度 | TB Sounding | 支持跨BSSID[^1] | | VR设备低延迟传输 | non-TB Sounding | 快速单用户反馈 | | 体育场高密度部署 | TB Sounding | 大规模用户管理能力 | > **设计哲学差异**: > non-TB采用**接收端中心化**设计,适合简单场景; > TB采用**发射端集中控制**,实现复杂环境的高效调度[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值