PL-SQL-触发器

  • 时间:
  • 浏览:88
  • 来源:it300

在本章中,我们将在pl/sql中讨论触发器。触发器是存储程序,在发生某些事件时自动执行或激发。实际上,触发器是为响应以下任何事件而编写以执行的−-

  • adatabase manipulation(dml).statement(delete,insert,or update).

  • adatabase definition(ddl).statement(create,alter,or drop).

  • adatabase operation.(serverror,logo,logoFF,Startup,or Shutdown).

    • Triggers can be defined on the table,view,schema,or database with which the event is associated.

      Benefits of Triggers.

      Triggers can be written for the following purposes−-

      • generating some derived column values automatically.
      • enfor/li>
      • 事件日志记录和存储关于表访问
      • 审计
      • 表的同步复制
      • 强制安全授权
      • 防止无效事务
      • /ul>

        创建触发器

        创建触发器的语法是

        CREATE[OR REPLACE]TRIGGER._name{BEFOR|之前|之后|INSTEAD OF}{INSERT[OR]{INSERT[或]|更新[OR]|DELETE}OF col..{OF col.|DELETE}OF col OF col{col col{INSE INSERT.[RERERERERERERERERERERERERERERERERERERERENCOLOLOLOL作为新的作为n][FOREACHRON][FOR EACH ROW][当(条件)DECLARE]时,DECLARE声明语句BEGIN(条件)DECLARE可执行声明语句BEGIN-可执行语句声明语句BEGIN-可执行语句声明声明BEGIN-可执行语句可执行语句EXclass="list">
      • CREATE[O触发器名称_使用._name创建或替换现有触发器。

      • {BEFORE|AFTER|INSTEAD OF}这指定何时执行触发器。INSTEADOOF子句用于在视图上创建触发器。

        >

        >

        >li>>

      • >
      • >
      • >ON{DELETE}.}这指定了DML操作。<

        /p>/p>>>>>>>>>>>>>>>>>>p>

        >>>>>>

      • >>>>

        {{[OF col col col{COcol

      • [REFERENCING OLD AS o NEW AS n]这允许您为各种DML语句引用新的和旧的值,例如INSERT、UPDATE和DELETE。

      • [FOR EACH ROW]这指定行级触发器,即,对于受影响的每一行,将执行触发器。否则,在执行SQL语句时,触发器将只执行一次,这称为表级触发器。

      • WHEN(.)这为触发器将触发的行提供了条件。这个子句只对行级触发器有效。

        <>/丽>

        >示例

        首先,我们将使用在前几章中创建和使用的CUSTOMERS表<>/p>>pre class="结果notranslate">从客户选择.* --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -- ---------- ----- ----------- ---------- | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | ---- ---------- ----- --------- ------- -----

      • 下面的程序为customers表创建一个行级别的触发器,该触发器将为在CUSTOMERS表上执行的INSERT或UPDATE或DELETE操作触发。这个触发器将显示旧值和新值之间的工资差异

        CREATE or REPLACE TRIGGER display_.y_changesforedelete or INSERT or UPDATE on customer for EACH rown(NEW.ID>0)DECLARE._diff number;BEGIN._diff: =:NEW..y-:OLD..y;_dbms_output。put_line('Old.y: '|:OLD..y); dbms_output.put_line('New.y: '|:NEW..y); dbms_output.put_line('Salary.: '|._diff);END; /

        当在SQL提示符处执行上述代码时,它产生以下结果

        Trigger创建。

        >这里考虑

      • OLD和新的引用对于表级触发器不可用,而是您可以将它们用于记录级触发器。

      • 如果要在相同的触发器中查询表,则应该使用AFTER关键字,因为触发器只能在ini之后查询表或再次更改表。应用tial更改,并且表恢复到一致状态。

      • >以上触发器的写入方式使得它在表上的任何DELETE或INSERT或UPDATE操作之前触发,但是您可以将触发器写入单个或多个操作,例如BEFORE DELETE,每当记录将被触发时,该触发器将触发使用表上的DELETE操作删除。

      触发触发器

      让我们对CUSTOMERS表执行一些DML操作。这里有一个INSERT语句,它将在表

      INSERT INTO CUSTOMERS(ID、名称、年龄、地址、SALARY)VALUES(7, 'Kriti'、22, 'HP'、7500.00);

      当在CUSTOMERS表中创建记录时,将触发上面的创建触发器display_.y_change,并将触发它。显示以下结果

      Old.y:New.y:7500Salary.:

      因为这是新记录,所以旧的工资不可用,并且上面的结果为空。现在让我们在CUSTOMERS表上再执行一次DML操作。UPDATE语句将更新表

      UPDATE customers SET.y=.y 500WHERE id=2;

      当在CUSTOMERS表中更新记录时,将触发上面的创建触发器display_.y_change,并将显示以下结果


      猜你喜欢

      希腊最高法院批准俄罗斯对比特币嫌疑人的请求

      希腊最高法院批准俄罗斯对比特币嫌疑人的请求希腊最高法院上周五表示,一名据称使用比特币数字货币洗钱40亿美元的俄罗斯人应该被引渡到俄罗斯,一位法院消息人士说。AlexanderV

      2019-02-01

      塑造美国网络防御的创造性破坏和自满情绪

      塑造美国网络防御的创造性破坏和自满情绪创造性的破坏,思维的范式转换取代现有的秩序,可能是一个难以捉摸的概念,但它作为人类行为驱动力的力量是不可否认的。在硅谷和其他美国的高层科技

      2019-02-01

      为什么我(非常)担心PRISM

      为什么我(非常)担心PRISM美国国家安全局正在利用我们的数字生活,监控语音电话,电子邮件,社交媒体以及谁知道什么。美国国家安全局方面的人说,这是为了国家安全;它已经停止了恐怖

      2019-02-01

      先发优势:为什么新的恶意软件最初会打败反恐

      先发优势:为什么新的恶意软件最初会打败反恐虽然反病毒解决方案可以有效对抗广泛使用的恶意软件,但是有一个很好的机会,新的恶意软件会躲过那些解决方案。最近有重大安全事件的报告激增,

      2019-02-01

      台湾银行抢劫与朝鲜黑客有关

      台湾银行抢劫与朝鲜黑客有关最近针对台湾一家银行的网络抢劫事件已被安全研究人员联系到一个据信在朝鲜境外活动的臭名昭着的威胁组织。黑客利用SWIFT全球金融网络大致窃取来自台湾远东

      2019-02-01