【趙強老師】利用資料庫觸發實現複雜的安全性檢查

来源:https://www.cnblogs.com/collen7788/archive/2020/04/20/12735706.html
-Advertisement-
Play Games

一、什麼是觸發器 資料庫觸發器是一個與表相關聯的,存儲的PL/SQL 語句。每當一個特定的數據操作語句(insert update delete)在指定的表上發出時,Oracle自動執行觸發器中定義的語句序列。 觸發器的應用場景如下: 複雜的安全性檢查 數據的確認 資料庫審計 數據的備份和審計 二、 ...


一、什麼是觸發器

資料庫觸發器是一個與表相關聯的,存儲的PL/SQL 語句。每當一個特定的數據操作語句(insert update delete)在指定的表上發出時,Oracle自動執行觸發器中定義的語句序列。

觸發器的應用場景如下:

  • 複雜的安全性檢查
  • 數據的確認
  • 資料庫審計
  • 數據的備份和審計

二、創建Oracle觸發器的語法

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;

其中:

  • BEFORE 和AFTER指出觸發器的觸發時序分別為前觸發和後觸發方式,前觸發是在執行觸發事件之前觸發當前所創建的觸發器,後觸發是在執行觸發事件之後觸發當前所創建的觸發器。
  • FOR EACH ROW選項說明觸發器為行觸發器。
  • 行觸發器和語句觸發器的區別表現在:行觸發器要求當一個DML語句操走影響資料庫中的多行數據時,對於其中的每個數據行,只要它們符合觸發約束條件,均激活一次觸發器;而語句觸發器將整個語句操作作為觸發事件,當它符合約束條件時,激活一次觸發器。
  • 當省略FOR EACH ROW 選項時,BEFORE 和AFTER 觸發器為語句觸發器,而INSTEAD OF 觸發器則只能為行觸發器
  • REFERENCING 子句說明相關名稱,在行觸發器的PL/SQL塊和WHEN 子句中可以使用相關名稱參照當前的新、舊列值,預設的相關名稱分別為OLD和NEW。觸發器的PL/SQL塊中應用相關名稱時,必須在它們之前加冒號(:),但在WHEN子句中則不能加冒號。
  • WHEN 子句說明觸發約束條件。Condition 為一個邏輯表達時,其中必須包含相關名稱,而不能包含查詢語句,也不能調用PL/SQL 函數。WHEN 子句指定的觸發約束條件只能用在BEFORE 和AFTER 行觸發器中,不能用在INSTEAD OF 行觸發器和其它類型的觸發器中。
  • 當一個基表被修改( INSERT, UPDATE, DELETE)時要執行的存儲過程,執行時根據其所依附的基表改動而自動觸發,因此與應用程式無關,用資料庫觸發器可以保證數據的一致性和完整性。

三、Oracle觸發器的類型

  • 行級觸發器:對DML語句影響的每個行執行一次,例如,一條update語句更新了100條數據,如果我們針對update定義了行級觸發器,那麼行級觸發器將會被觸發100次 。
  • 語句級觸發器:對每個DML語句執行一次,例如,一條update語句更新了200條數據,如果我們針對update定義了語句級觸發器,那麼語句級觸發器將會被觸發1次 。

四、利用資料庫觸發實現複雜的安全性檢查

/*
實施複雜的安全性檢查

禁止在非工作時間插入新員工
周末:to_char(sysdate,'day') in ('星期六','星期日')
上班前和下班後:to_number(to_char(sysdate,'hh24')) not between 9 and 18 
*/
create or replace trigger securityemp
before insert
on emp
begin
  if to_char(sysdate,'day') in ('星期六','星期日') or
     to_number(to_char(sysdate,'hh24')) not between 9 and 18 then
     --禁止insert操作 拋出異常
     raise_application_error(-20001,'禁止在非工作時間插入新員工');
  end if;
end;
/
  • 在上面的例子中,我們禁止在非工作時間插入新員工,從而實現執行insert語句時候的安全性檢查。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 壓縮和解壓縮命令 zip unzip gzip gunzip bzip2 bunzip2 tar zip (.zip格式的壓縮文件) 英文原意:package and compress (archive) files 功能:壓縮文件或目錄 語法:zip 選項[ r] 壓縮包名 源文件或源目錄 unz ...
  • 基本的操作方法:本文假設你的apahce安裝目錄為/usr/local/apache2,這些方法適合任何情況apahce啟動命令:推薦/usr/local/apache2/bin/apachectl start apaceh啟動apache停止命令/usr/local/apache2/bin/apa ...
  • 命令格式 [root@localhost ~]# scp [參數] [原路徑] [目標路徑] 命令功能 scp是 secure copy的縮寫, scp是linux系統下基於ssh登陸進行安全的遠程文件拷貝命令。linux的scp命令可以在linux伺服器之間複製文件和目錄。 命令參數 -1 強制s ...
  • Parallels Desktop是一款運行在 Mac 電腦上的極為優秀的虛擬機軟體。用戶可以在 Mac OS X 下非常方便運行 Windows、Linux 等操作系統及應用。用戶不必繁瑣重覆地重啟電腦即可在 Win 與 Mac 之間切換甚至同時使用它們。 Parallels Desktop15的 ...
  • 好幾年前寫了一篇《SSIS利用Microsoft Connector for Oracle by Attunity組件進行ETL!》,IT技術真是日新月異,這種方式對於新的SQL SERVER 資料庫版本已不適用了,比如SQL SERVER 2016 的SSIS不需要安裝任何插件就可以抽取Share ...
  • 引用地址:https://blog.csdn.net/weixin_34143774/article/details/89561946 請以原文為主,引用註明出處。問題:今天公司進行軟體測評,在測評期間,測評人員問起PostgreSQL登錄失敗導致用戶鎖定的次數,密碼輸錯幾次賬戶會被鎖定?網上查了一... ...
  • 前言 文章首發於微信公眾號【碼猿技術專欄】:天天用Redis,持久化方案有哪些你知道嗎? Redis目前已經成為主流的記憶體資料庫了,但是大部分人僅僅是停留在會用的階段,你真的瞭解Redis內部的工作原理嗎? 今天這篇文章將為大家介紹Redis持久化的兩種方案,文章將會從以下五個方面介紹: 什麼是RD ...
  • 近日Kafka發佈了最新版本 2.5.0,增加了很多新功能: 下載地址:https://kafka.apache.org/downloads 2.5.0 對TLS 1.3的支持(預設為1.2) 引入用於 Kafka Streams 的 Co groups 用於 Kafka Consumer 的增量 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...