精华内容
下载资源
问答
  • Windows事件触发器日志记录

    千次阅读 2018-12-21 20:02:40
    方法一:使用windows触发器记录系统日志 打开windows事件查看器 手动触发事件 在windows事件触发器中找到想要添加触发器的事件 点击右下方,将任务附加到此事件 方法二:任务计划程序 打开windows任务计划程序 创建...

    方法一:使用windows触发器记录系统日志

    打开windows事件查看器
    手动触发事件
    在windows事件触发器中找到想要添加触发器的事件
    点击右下方,将任务附加到此事件

    方法二:任务计划程序

    打开windows任务计划程序
    创建任务
    设置名称,位置
    选中触发器细节(当任何用户登陆时候)
    根据需求调整其他选项(可以打开脚本实现读写和新建文件等操作)

    实际应用

    当后台有新用户建立的时候,系统日志触发器被触发,运行事先预设的程序或者脚本
    脚本源码:
    backup.bat 当后台建立3389连接的时候,将连接信息记录在D盘的data.txt文件中

    for /F %%i in ('date /t') do ( set tt=%%i)
    echo %tt:~0,10% >> D:\data.txt
    echo %tt:~0,10% >> C:\phpStudy\PHPTutorial\WWW\data.txt
    time /t >> D:\data.txt
    time /t >> C:\phpStudy\PHPTutorial\WWW\data.txt
    netstat -n -p tcp | find ":3389" >> D:\data.txt
    netstat -n -p tcp | find ":3389" >> C:\phpStudy\PHPTutorial\WWW\data.txt
    copy /y C:\Windows\System32\winevt\Logs\Security.evtx D:\backuplogs\
    copy /y C:\Windows\System32\winevt\Logs\Security.evtx C:\phpStudy\PHPTutorial\WWW\
    

    pop.bat 当后台新建用户的时候,记录并弹窗提醒

    msg %username% /time:60 "WARNING:a backdoor account is created"
    time /t >> D:\data.txt
    time /t >> C:\phpStudy\PHPTutorial\WWW\data.txt
    echo USER CREATED >>  D:\data.txt
    echo USER CREATED >>  C:\phpStudy\PHPTutorial\WWW\data.txt
    

    double.bat 将应用程序和脚本绑定在一起,启动程序的同时记录日志

    cd D:\
    start V15.lnk
    time /t >> D:\data.txt
    echo Siemens TIA Portal V15 has been opend >>D:\data.txt
    

    检测shell反弹的脚本正在进一步完善

    展开全文
  • PostgreSQL触发器日志审计小神器 最近遇到的项目问题,审计日志记录不够详细,比如某用户编辑了某台设备,只记录了用户操作的设备名、操作时间、登录用户和登录IP,至于设备其他属性编辑前和编辑后的信息就没有...

    PostgreSQL触发器,日志审计小神器

     

    最近遇到的项目问题,审计日志记录不够详细,比如某用户编辑了某台设备,只记录了用户操作的设备名、操作时间、登录用户和登录IP,至于设备其他属性编辑前和编辑后的信息就没有更详细的对比了,审计粒度不够细,显然是不能让客户满意的,秉承客户满意优先原则,只好技术加持一波了。

     

    实际客户想要记录的更多,涉及的业务属性比较广,返本溯源,我们决定在数据库层面解决,以期能最少的改动业务代码。

    利用PostgreSql触发器在源表数据发生变化的时候准备一张对应表进行备份记录,把变化数据就像提交svn一样插入到历史表中,如图

     

     

    解决方案有了,但其实还存在一个问题触发器只在数据库内部运行,如何记录是当前是哪个登录用户对数据源进行的变更还是个问题,经过一位大佬的指导,可以利用PostgreSql的会话变量解决,简单的测试代码如下

     

     

     

     

    打印结果

     

     

     

    这样就可以利用数据库会话变量的特性,在每一次的数据库变更前,先将全局操作pid关联到用户uid为一张表,而变更的时候,将将全局操作pid插入到历史数据表中,这样通过唯一的全局操作pid就可以关联查询出是哪个用户的操作了。

    于是解决方案图变为

     

     

     

    开心的代码实现

     

    创建审计主表

     

     

     

     

     

    创建审计历史表

     

     

     

     

     

     

    创建用户id和操作id关联表

     

     

     

     

    在用户进行数据操作变更的postgresql连接时,我们都先将数据库全局变量插入到operation_log表中,将当前登录的用户id与这次变更操作绑定在一起,这个可以封装在web框架层实现。

     

     

    创建触发器

     

    触发器函数定义了触发器被触发后执行的操作,下面列一下触发器函数中可以使用的变量,例子中的 OLD,就表示触发操作的旧数据行,详细如下:

    NEW:INSERTUPDATE 操作触发的行级触发器中存储的新的数据行,

    OLD:INSERTUPDATE 操作触发的行级触发器中存储的的数据行,

    TG_OP:代表当前触发器监听到的操作类型,数据类型为 text,内容为 INSERTUPDATEDELETETRUNCATE

     

     

     

     

    小结

    本文只是大概如何利用PostgreSql触发器对用户行为进行详细日志审计,旨在提供一个触发器记录数据源变更和web框架结合的思路,希望对你有所帮助,如果你有更好的解决方案可以留言告诉我哦

     

    PS:如果文章对你有价值,欢迎点个推荐。

    转载于:https://www.cnblogs.com/mrwh/p/11553106.html

    展开全文
  • 数据备份和日志记录等业务是顺序IO业务。随机IO是指读写操作时间连续,但访问地址不连续,随机分布在磁盘LUN的地址空间中。产生随机IO的业务有OLTP服务,SQL,即时消息服务等。(其实就是说在数据库查询时读取...

    顺序IO&随机IO

    顺序IO是指读取和写入操作基于逻辑块逐个连续访问来自相邻地址的数据。在顺序IO访问中,HDD所需的磁道搜索时间显着减少,因为读/写磁头可以以最小的移动访问下一个块。数据备份和日志记录等业务是顺序IO业务。随机IO是指读写操作时间连续,但访问地址不连续,随机分布在磁盘LUN的地址空间中。产生随机IO的业务有OLTP服务,SQL,即时消息服务等。(其实就是说在数据库查询时读取的不是连续区域,是要在整个磁盘上进行查找,多数时间可能耗费在了磁头寻道上)

         ① 顺序I/O一般只需扫描一次数据、所以、缓存对它用处不大

         ② 顺序I/O比随机I/O快

         ③ 随机I/O通常只要查找特定的行、但I/O的粒度是页级的、其中大部分是寻址,耗费时间,顺序I/O所读取的数据、通常发生在想要的数据块上的所有行更加符合成本效益。 所以、缓存随机I/O可以节省更多的workload

    SQL的主键和外键的作用

     外键取值规则:空值或参照的主键值。

    (1)插入非空值时,如果主键表中没有这个值,则不能插入。

    (2)更新时,不能改为主键表中没有的值。

    (3)删除主键表记录时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。

    (4)更新主键记录时,同样有级联更新和拒绝执行的选择。

    简而言之,SQL的主键和外键就是起约束作用。 

    关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。

    比如:

    学生表(学号,姓名,性别,班级)

        其中每个学生的学号是唯一的,学号就是一个主键;

    课程表(课程编号,课程名,学分)

        其中课程编号是唯一的,课程编号就是一个主键;

    成绩表(学号,课程号,成绩)

        成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以,学号和课程号的属性组是一个主键。

     

    成绩表中的学号不是成绩表的主键,但它和学生表中的学号相对应,并且学生表中的学号是学生表的主键,则称成绩表中的学号是学生表的外键;同理,成绩表中的课程号是课程表的外键。

     

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下:

    一、主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。

    外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

     

    二、主键、外键和索引的区别

     

    定义:

     主键--唯一标识一条记录,不能有重复的,不允许为空

     外键--表的外键是另一表的主键外键可以有重复的可以是空值

     索引--该字段没有重复值,但可以有一个空值

    作用:

     主键--用来保证数据完整性

     外键--用来和其他表建立联系用的

     索引--是提高查询排序的速度

    个数:

     主键--主键只能有一个

     外键--一个表可以有多个外键

     索引--一个表可以有多个唯一索引


    触发器:

    关于触发器可以先读这篇文章:

    https://www.cnblogs.com/yank/p/4193820.html

    Before与After区别:before:(insert、update)可以对new进行修改。 after不能对new进行修改,两者都不能修改old数据。

    after:是先完成数据的增删改,然后再触发,触发的语句晚于监视的增删改,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品数量。当商品数量少于订单数量时造成爆库。 before:先完成触发,在进行增删改,触发语句先于监视的增删改,我们就有机会判断,修改即将发生的操作。 案例操作: 触发器使用after: 当某个订单的数量超过库存的数量时会出现库存为负数。造成所谓的爆库问题。

     触发器,顾名思义,就是当执行某个事件的时候触发另一个事件的执行!这个触发的时间分为BEFORE和AFTER两种,分别有before insert,before update,before delete和after insert,after update,after delete这六种情况

    FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表,在触发器中我们经常会用到NEWOLD这两个关键字,在这里我还是先解释下这两个字的意思!其中NEW是指刚刚插入到数据库的数据表中的一个域,也可以理解为对象(object)的意思。比如在一个insert触发器中我用到了NEW那他的意思就是说,要使用刚刚插入到数据表的某个值,要使用具体的某一个值的话需要这样子写:NEW.字段名(NEW.username)这样子就获取到了刚刚插入到数据表中的一个字段的值!!OLD,OLD是在delete触发器中有用的,意思是说我要删除一条数据,但是在触发器中要用到之前的那个数据,那么我就可以通过OLD来获取了!比如我删除了一条数据,里面包含一个email,现在我在触发器的内部sql中要用就可以这样子写:OLD.email!

    对于INSERT语句, 只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以在和NEW以及OLD同时使

    触发器的使用案例:http://database.51cto.com/art/201005/200671.htm

     绑定变量

    绑定变量是为了减少解析的,比如你有个语句这样

    select aaa,bbb from ccc where ddd=eee;

    如果经常通过改变eee这个谓词赋值来查询,像如下

    select aaa,bbb from ccc where ddd=fff;
    select aaa,bbb from ccc where ddd=ggg;
    select aaa,bbb from ccc where ddd=hhh;

    每条语句都要被数据库解析一次,这样比较浪费资源,如果把eee换成“:1”这样的绑定变量形式,无论ddd后面是什么值,都不需要重复解析。

    Java实现绑定变量的方法:

    [java] view plaincopy
    PreparedStatement pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");  
    pstmt.setBigDecimal(1, 15.00);  
    pstmt.setInt(2, 110592);   
    /result statmement:   UPDATE employees SET salay = 15.00 WHERE id = 110592  
    pstmt.executeQuery(); 

    假设要将id从1到10000的员工的工资都更新为150.00元,不使用绑定变量,则:

    [java] view plaincopy
    sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 1");  
    sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 2");  
    sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 3");  
    sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 4");  
    ....  
    sql.executeQuery("UPDATE employees SET salay = 150.00 WHERE id = 10000");  

    使用绑定变量,则:

    [java] view plaincopy
    PreparedStatement pstmt;  
    for (id = 1; id < 10000; id  )  
    {  
      if (null == pstmt)  
        pstmt = con.prepareStatement("UPDATE employees SET salay = ? WHERE id = ?");  
      pstmt.setBigDecimal(1, 150.00);  
      pstmt.setInt(2, id);   
      pstmt.executeQuery();  
    }  

    二者区别在于,不用绑定变量,则相当于反复解析、执行了1w个sql语句。使用绑定变量,解析sql语句只用了一次,之后的9999次复用第一次生成的执行计划。显然,后者效率会更高一些。

    什么时候不应该/不必要使用绑定变量

    • 如果你用数据仓库,一条大查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微。
    • 变量对优化器产生执行计划有很重要的影响的时候:绑定变量被使用时,查询优化器会忽略其具体值,因此其预估的准确性远不如使用字面量值真实,尤其是在表存在数据倾斜(表上的数据非均匀分布)的列上会提供错误的执行计划。从而使得非高效的执行计划被使用。

    全文索引

    全文检索是对大数据文本进行索引,在建立的索引中对要查找的单词进行进行搜索,定位哪些文本数据包括要搜索的单词。因此,全文检索的全部工作就是建立索引和在索引中搜索定位,所有的工作都是围绕这两个来进行的。

    建立全文索引中有两项非常重要,一个是如何对文本进行分词,一是建立索引的数据结构。分词的方法基本上是二元分词法、最大匹配法和统计方法。索引的数据结构基本上采用倒排索引的结构。

    分词的好坏关系到查询的准确程度和生成的索引的大小。在中文分词发展中,早期经常使用分词方式是二元分词法,该方法的基本原理是将包含中文的句子进行二元分割,不考虑单词含义,只对二元单词进行索引。因此该方法所分出的单词数量较多,从而产生的索引数量巨大,查询中会将无用的数据检索出来,好处是算法简单不会漏掉检索的数据。之后又发展出最大匹配分词方法,该方法又分为正向最大分词和逆向最大分词。其原理和查字典类似,对常用单词生成一个词典,分析句子的过程中最大的匹配字典中的单词,从而将句子拆分为有意义的单词链。最大匹配法中正向分词方法对偏正式词语的分辨容易产生错误,比如“首饰和服装”会将“和服”作为单词分出。达梦数据库采用的是改进的逆向最大分词方法,该分词方法较正向正确率有所提高。最为复杂的是通过统计方式进行分词的方法。该方法采用隐式马尔科夫链,也就是后一个单词出现的概率依靠于前一个单词出现的概率,最后统计所有单词出现的概率的最大为分词的依据。这个方法对新名词和地名的识别要远远高于最大匹配法,准确度随着取样文本的数量的增大而提高。

     二元分词方法和统计方法是不依赖于词典的,而最大匹配法分词方法是依赖于词典的,词典的内容决定分词结构的好坏。

    全文检索的索引被称为倒排索引,之所以成为倒排索引,是因为将每一个单词作为索引项,根据该索引项查找包含该单词的文本。因此,索引都是单词和唯一记录文本的标示是一对多的关系。将索引单词排序,根据排序后的单词定位包含该单词的文本。

    上面这个感觉介绍的不是特别好,可以看高性能mysql的第299页到第301页


    展开全文
  • 触发器

    2009-11-11 22:28:00
    触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块或对过程的调用 触发器的限制条件,通过where子句实现类型: 应用程序触发器,前台开发工具提供的; 数据库触发器...

     DML触发器有三类:

    1, insert触发器;

    2, update触发器;

    3, delete触发器;

    触发器的组成部分:

           触发器的声明,指定触发器定时,事件,表名以类型

           触发器的执行,PL/SQL块或对过程的调用

           触发器的限制条件,通过where子句实现

    类型:

           应用程序触发器,前台开发工具提供的;

           数据库触发器,定义在数据库内部由某种条件引发;分为:

                         DML触发器;

                         数据库级触发器;

                         替代触发器;

    DML触发器组件:

    1,触发器定时

    2,触发器事件

    3,表名

    4, 触发器类型

    5, When子句

    6, 触发器主体

    可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例

    创建DML触发器:

           Create [or replace] trigger [模式.]触发器名

           Before| after   insert|delete|(update of 列名)

    On 表名

    [for each row]

    When 条件

    PL/SQL块

    For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;

    When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;

    Insert触发器的创建:

    create or replace trigger tg_insert

    before insert on student

    begin

           dbms_output.put_line('insert trigger is chufa le .....');

    end;

    /

    执行的效果:

    SQL> insert into student

    2 values(202,'dongqian','f');

    insert trigger is chufa le .....

    update表级触发器的例子:

    create or replace trigger tg_updatestudent

    after update on student

    begin

       dbms_output.put_line('update trigger is chufale .....');

    end;

    /

    运行效果:

    SQL> update student set se='f';

    update trigger is chufale .....

    已更新8行;

    可见,表级触发器在更新了多行的情况下,只触发了一次;

    如果在after update on student后加上

    For each row的话就成为行级触发器,运行效果:

    SQL> update student set se='m';

    update trigger is chufale .....

    update trigger is chufale .....

    update trigger is chufale .....

    update trigger is chufale .....

    update trigger is chufale .....

    update trigger is chufale .....

    update trigger is chufale .....

    update trigger is chufale .....

    已更新8行;

    :new 与: old:必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row

    这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;

    使用insert的时候只有:new里有值;

    使用delete的时候只有:old里有值;

    使用update的时候:new和:old里都有值;

    可以这样使用: dbms_output.put_line('insert trigger is chufa

                               dbms_output.put_line('new id is : '||:new.stui

                               dbms_output.put_line('new name is : '||:new.st

                               dbms_output.put_line('new se is : '||:new.se);

    可以这样从数据字典中查看一个表上有哪几个触发器:

    SQL> select trigger_name from user_triggers

    2 where table_name=upper('student');

    TRIGGER_NAME

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

    TG_INSERT

    TG_UPDATESTUDENT

    带有:old变量的行级delete触发器:

    create or replace trigger tg_deletestudent

    before delete on student

    for each row

    begin

       dbms_output.put_line('old is: '||:old.stuid);

       dbms_output.put_line('old name: '||:old.stuname);

    end;

    /

    运行效果:

    SQL> delete from student;

    old is: 202

    old name: dongqian

    old is: 101

    old name: liudehua

    old is: 102

    old name: lingqingxia

    old is: 103

    old name: lichanggong

    old is: 104

    old name: zhenxiuwen

    old is: 1001

    old name: lilianjie

    old is: 1009

    old name: tongleifuck

    old is: 203

    old name: kfdj

    old is: 209

    old name: fuck

    已删除9行

    When的使用:如果在begin也就是说触发器的PL/SQL主体块执行前加上when(old.se=’f’)的话,DML操作照做不误,但是只会在删除

    Se=’f’的那行的时候才会执行触发器的主体动作,执行效果:

    SQL> delete from student;

    old is: 209

    old name: fuck

    已删除9行; 这里虽然删了9行,但是只执行了一次触发器的主体,做为一个行级触发器;

    混合类型触发器:

    Inserting,deleting,updating三个谓词可以分别指示当前操作到底是哪个;

    create or replace trigger hunhetrigger

    before insert or update or delete on student

    for each row

    begin

        if inserting then

                  dbms_output.put_line('insert le.........');

        end if;

        if deleting then

                  dbms_output.put_line('delete le .......');

        end if;

    end;

    /

    插入的时候就自动判断当前动作为插入:

    SQL> insert into student values(303,'me','f');

    insert le.........

    删除的时候就自动判断当前动作为删除:

    SQL> delete from student;

    delete le .......

    注意,既然触发器内部的主体PL/SQL是语句,那么它同样也可以是插入删除操作而不一定只是dbms_output打印一些信息;

    这正是日志表的原理:在用户执行了DML语句的时候触发主体为插入日志表以记录操作轨迹的触发器;

    为什么用触发器? 当我们有两个表用来记录商品的出库入库情况,good_store用来记录库存的产品类别和数量,

    而good_out用来记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在good_out中插入该产品的类别和

    出库数量,而同时也应该在good_store表中用update来更新库存的相应类别的产品的数量;这就交给了我们两个必须完成的任务:插入good_out

    表后更新good_store表,这样的手工过程使得我们觉得非常ugly,如果只做其中一个那造成数据的不一致;所以现在我们可以用触发器,在

    Good_out表的插入操作上绑定一个对good_store进行更新的触发器;当然这个过程应该是一个事务,你不必担心插入good_out表执行了,而绑定在这个动作上的触发器操作不会执行,相信Oracle设计为原子性了;

    注意:触发器会使得原来的SQL语句速度变慢;

    替代触发器:

    创建在视图上的触发器,就是替代触发器,只能是行级触发器;

    为什么要用替代触发器?

    假如你有一个视图是基于多个表的字段连接查询得到的;现在如果你想直接对着这个视图insert;那你一定在想,我对视图的插入操作

    怎么来反应到组成这个视图的各个表中呢?事实上,除了定义一个触发器来绑定在对视图上的插入动作上外,你没有别的办法通过系统的报错而直接向视图中插入数据;这就是我们用替代触发器的原因;替换的意思实际上是触发器的主体部分把对视图的插入操作转换成详细的对各个表的插入;

    变异表:变异表就是当前SQL语句正在修改的表,所以在一个变异表上绑定的触发器不可以使用cout()函数,原因很简单:SQL语句刚刚修改了表,你怎么统计??

    约束表:

    维护:

                                Alter trigger …..disenable;    使得触发器不可用;

                                Alter trigger ……enable;     开启触发器;

    Oracle的内置程序包

    扩展数据库的功能;

    为PL/SQL提供对SQL功能的访问;

    一般具有sys权限的高级管理人员使用;

    一个典型的程序包就是dbms_output,你老是用它的过程put_line();

    Dbms_standard 提供语言工具;

    Dbms_lob操作Oracle LOB;就是针对大型数据的操作设计的;

    Dbms_lock用户定义的锁;

    Dbms_job 允许对PL/SQL过程进行调度;

    Dbms_alert 支持数据库事件的异步通知;

    1,dbms_output的一些过程:

                     a):enable

                     b):disable

                     c):put只是把数据放到缓存(SQL-Plus的缓存,实际就是整个窗口)中,无输出功能;

                     d):put_line可以使得以前放在缓存中所有数据输出;并且换到下一行;

                     e):new_line

                     f):get_line

                     g):get_lines

    2,dmbs_lob   ,这个包只能是由系统管理员来操作;

                     Clob以字符数据存储可达2G;

                     Blob以二进制数据存储可达4G;

                     Nclob以unicode字符存储;

    一个文件下载列表的例子:

    创建下载目录表:

    create table downfilelist

    (

         id varchar(20) not null primary key,

         name varchar(40) not null,

         filelocation bfile,

         description clob

    )

    /

    创建目录:

    create or replace directory filedir as 'f:/oracle'

    /只是向Oralce注册了目录,实际上并不会真的建立目录在磁盘上;Oracle无权管理和锁定操作系统的文件系统;

    向目录表中插入数据:

    insert into downfilelist

    values('10001','oracle plsal编程指南',bfilename(upper('filedir'),'demo.mp3'),'this is a mp3 music')

    insert into downfilelist

    values('10002','java 大权', bfilename(upper('filedir'),'x.jpg'),'good super girl')

    /在filedir的目录f:/oracle下实际存储着demo.mp3 ,x.jpg;

    注意,如果你试图查询,效果是 :

    sys>select * from downfilelist;

    SP2-0678: 列或属性类型无法通过 SQL*Plus 显示

    因为第三列是无法显示的,是一个二进制的;

    下面使用dbms_lob的一些过程来进行操作:

    1,read过程

    declare

    tempdesc clob;

    ireadcount int;

    istart int;

    soutputdesc varchar(100);

    begin

    ireadcount:=5;

    istart:=1;

    select description into tempdesc from downfilelist where id='10001';

    dbms_lob.read(tempdesc,ireadcount,istart,soutputdesc); 把clob类型的tempdesc中的数据读到字符类型的soutputdesc里;

    dbms_output.put_line('Top 5 character is: '||soutputdesc);

    end;

    /注意,对unicode来说,汉字和字母所占的位数是一样的;

    2,getlength函数

    select description into tempclob from downfilelist where id=‘10001’;

    ilen:=dbms_lob.GetLength(tempclob);

    append,copy……..

    发现这样的现象:select x into y的时候,y并不是独立于x的拷贝,因为当修改y的时候x也被修改了;

    3, fileexists函数

                     select id ,dbms_lob.fileexists(filelocation) from downfilelist;

    如果在bfile类型字段filelocation指定的系统下的目录中存在filelocation指定的系统文件,则返回int 1,否则返回0;

    这说明Oracle还是可以检测到系统的文件情况的,如同java.io包里的类一样;

    对bfile类型数据的操作函数有fileisopen,fileopen,fileclose等等;

    展开全文
  • MySQL触发器

    2019-09-25 14:05:31
    业务需要,要同步两个数据库的用户信息,因此用到了触发器触发器是纯数据库操作,与项目代码无关。 触发器是数据库表的属性,是一个特殊的存储过程,触发器是个特殊的存储过程,但是触发器不需要CALL语句调用...
  • 触发器 MySQL

    2019-01-24 21:29:00
    create trigger 触发器名 after insert on 表名 for each row#在表插入一条记录后触发的(insert 插入 updata修改 delete删除) begin if new.字段名 = 'xx' then  insert into '专门记录日志的表' ...
  • 1、普通的触发器绑定对象为表,它定义了当一个表发生了【增】、【删】、【改】的DML语句时,默认执行的sql语句。 这里我们称之为表触发器,表触发器的用途很多,可以用作维持数据一致性的级联同步,和数据一致性...
  • 触发器可以与表进行绑定,当表做出Delete、Update、Insert这些对表进行改动的操作时,会触发触发器内的逻辑,常用有打日志输出等。。 PGSQL在创建的触发器的方式与Oracle有些不同(查阅文档未找到更快捷的方式); ...
  • oracle触发器

    2011-03-22 15:30:30
    触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:...4、 提供审计和日志记录 5、 防止无效的事务处理 6、 启用复杂的业务逻辑 触发器触发时间有两种:after和be...
  • MySQL好像从5.0.2版本就开始支持触发器的功能了,5.7版本以上支持建立一个事件绑定多个触发器,本次博客就来介绍一下触发器,首先还是谈下概念性的东西吧: 什么是触发器 触发器是与表有关的数据库对象,在满足...
  • ORACLE 触发器

    2009-09-10 08:44:00
    [size=medium]DML触发器有三类: 1, insert触发器; 2, update触发器; 3, delete触发器触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块或对...
  • 2010-03-24 16:19:07|分类: WPF相关 |标签: |字号大中小订阅 ...wpf中的触发器详解 ...7.1.2 简单逻辑的表示--触发器(1) ...在本章的多处介绍中都会涉及触发器的使用。顾名思义,触发器(Trigger)就是...
  • MySQL触发器怎么使用

    2019-11-28 14:42:25
    触发器:是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行。也就是当表里面发生增删改的操作的时候,可以运行我们自己写的SQL。 二、创建触发器 1、基本语法...
  • 异步触发器

    千次阅读 2011-07-18 10:41:04
    --1. 数据库配置-- 允许Service BrokerALTER DATABASE testDB SETENABLE_BROKERGO--2. 构建异步触发器相关的对象-- =======================================-- 异步触发器对象--
  • oracle的触发器

    2014-06-03 14:34:00
    oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类:1, insert触发器;2, update触发器;3, delete触发器触发器的组成部分: 触发器的声明,指定触发器...
  • 触发器的组成部分:触发器的声明,指定触发器定时,事件,表名以类型触发器的执行,PL/SQL块或对过程的调用触发器的限制条件,通过where子句实现类型:应用程序触发器,前台开发工具提供的;数据库触发器,定义在...
  • Oracle触发器类型

    千次阅读 2011-10-10 13:38:47
    DML触发器有三类: 1, insert触发器; 2, update触发器; 3, delete触发器触发器的组成部分:  触发器的声明,指定触发器定时,事件,表名以类型  触发器的执行,PL/SQL块或对过程的调用
  • 触发器是mysql数据库针对某张表发生增删改操时自动执行的一段语句集合,它是跟某张表关联绑定的,不像存储过程那种需要被动调用。触发器可以用来检验数据完整性,日志跟踪记录等。注意:不能在mysql本身系统数据库的...
  • 触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块或对过程的调用 触发器的限制条件,通过where子句实现 类型: 应用程序触发器,前台开发工具提供的; 数据库触发器,...
  • 触发器总结

    2010-08-27 16:25:07
    建一个日志记录表,用来存放操作的日志 use mydb go create table Roc (  id int identity not null primary key,  op_name varchar(20),  op_des varchar(40),  op_user varchar(20) ) create ...
  • 触发器包含:dml触发器和ddl触发器。 dml触发器包含了用于对表或视图的insert、update、delete操作做出响应的T-SQL代码,而ddl触发器对服务器或数据库事件做出响应而不是数据修改。 触发器能够自动响应某种行为,...
  • Oracle 触发器应用

    2008-11-06 15:37:37
    触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。 功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 ...
  • 目录 1.触发器工作原理 2.触发器语法结构 ...(2)设计ATri_Log日志表 (3)创建触发器 (4)验证触发器 1.触发器工作原理 触发器的原理涉及两张虚拟的表,这两张虚拟的表分别是INSERTED表和DELETED表。 I...
  •   触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作...
  • 详解oracle中通过触发器记录每个语句影响总行数需求产生:业务系统中,有一步“抽数”流程,就是把一些数据从其它服务器同步到本库的目标表。这个过程有可能 多人同时抽数,互相影响。有测试人员反应,原来抽过的数...
  • mysql触发器与存储过程

    千次阅读 2016-05-04 20:26:20
    -- 关闭事务:选择性的将日志文件中操作的结果保存到数据表,或者直接清空事务日志,即某一个步骤操作失败,此时真正的表数据是不会发生改变的。 -- (a):提交事务:同步数据表(操作成功):commit (b):回滚事务:...
  • SQL Server(八)-触发器

    2019-04-13 10:22:16
    1 认识触发器 触发器是由一系列的T-SQL编写完成的,和存储过程类似。也可以说它是一种特殊的存储过程。在数据库中,触发器有着和“约束条件”类似的功能,利用它可以解决常规“约束条件”解决不了的问题。1.1 什么是...
  • SQL-必知必会-触发器

    2020-09-14 15:55:08
    触发器 触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、UPDATE和DELETE操作(或组合)相关联。 与存储过程不一样(存储过程只是简单的存储 SQL 语句),触发器与单个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,091
精华内容 4,036
关键字:

触发器绑定日志