首先建立数据库Test,建立两个表,我们命名为grades和audit,利用audit实现对grades的审计功能,其中grades用于存放学生的成绩,包括“sdudentID,courseID,grade”三个字段,主键为sdudentID,courseID;audit仅仅比表grades增加了两个字段:changeType,changTime,用于记录grades表被修改的类型和修改时间。

建立2个表格的sql语句如下:

create  table grades(

studentID   int,

courseID    int,

grade  int,

primary key(studentID,courseID)

);

create table audit(

changeType   char(15),

changeTime   datetime,

studentID   int,

courseID    int,

grade  int,

primary key(changeType,changeTime,studentID,courseID,grade)

)

然后在表grades上建立触发器,如果对grades表进行“insert”,"delete","update"操作,在audit表中分别记录这些操作的类型(update(old,new),insert或者delete),操作的时间,操作影响的数据(比如被删除的数据,插入的数据,修改前的数据,修改后的数据)。

建立触发器的sql语言如下:

/*the beginning of the trigger definition*/

create trigger tr_GradesChanged  on grades  for delete,insert,update

as

declare @insertedCount int

declare @deletedCount int

declare @changeType char(10)

declare @changeTime datetime

declare @updateType char(4)

/*在ms sql server中有两个临时表保存着被删除和被插入的记录,分别叫“deleted”,“inserted”。update可以看作一次删除和一次添加*/

select @insertedCount=count(*) from inserted

select @deletedCount=count(*) from deleted

select @changeType=

case

when @insertedCount>0 and @deletedCount>0

then 'update'

when @insertedCount=0 and @deletedCount>0

then 'delete'

else 'insert'

end

select @changeTime=getdate()

select @updateType=''

if @changeType='update'  select @updateType=' old'

insert into audit(changeType,changeTime,studentID,courseID,grade) select @changeType+@updateType, @changeTime,studentID,courseID,grade  from deleted

if @changeType='update'  select @updateType=' new'

insert into audit(changeType,changeTime,studentID,courseID,grade) select @changeType+@updateType, @changeTime,studentID,courseID,grade  from inserted

/*the end of the trigger definition*/

至此,整个触发器就建立好了,我们可以对此触发器进行测试

运行以下语句:

delete from grades

delete from audit

insert into grades values (19224,002,90)

update grades set grade=100 where studentID =19224

delete from grades where studentID=19224

select * from audit order by changeTime asc

将得到以下结果:

可见,audit表对grades表的操作进行了监控,记载了其变化情况。由于上面的几条测试语句运行的时间间隔太短,所以changetime相同,查询结果首先按changtime升序排列,然后按changtype升序(默认)排列,所以和实际结果有点差别,理论上应该是:

changType      changeTime   studentID      courseID     grade

1   insert            -----------      19224               2               90

2   update old      -----------     19224              2               90

3   update new    -----------     19224               2              100

4   delete            ----------        19224              2              100

mysql触发器中访问mssql数据表_[数据库]一个利用触发器(trigger)实现数据库表的审计功能(audit)的例子--针对ms sql实现...相关推荐

  1. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

  2. mysql删除十天前数据脚本_前几天手工删除测试数据库并重建的脚本

    原来的dwtest测试库坏掉了,因为是测试库,也懒得去研究如何修复了,征求了几个DBA的意见,干脆重建好了. 首先删除原来的数据库: 删除原来的数据文件.控制文件.密码文件.日志文件等等,目录都保留 ...

  3. python中打开文件时只允许写入的模式是_在open函数中访问模式参数使用()表示打开一个文件只用于写入。(4.0分)_学小易找答案...

    [单选题]溢流坝属于( ) [单选题]在重力坝的底部沿坝轴线方向设置大尺寸的空腔,即为( ) [单选题]模式()的用途是打开一个文件用于追加.如果该文件已存在,文件指针将会放在文件的结尾.(4.0分) ...

  4. arraycopy方法(将数组中指定的数据拷贝到另一个数组)

    public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将数组中指定的数据 ...

  5. Java黑皮书课后题第5章:*5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从‘!‘到‘~‘的字符。每行打印10个字符。ASCII码表如附录B所示。数字之间用一个空格字符隔开

    *5.15(显示ASCII码字符表)编写一个程序,打印ASCII字符表从'!'到'~'的字符.每行打印10个字符.ASCII码表如附录B所示.数字之间用一个空格字符隔开 题目 题目概述 '!'到'~' ...

  6. mysql在视图中增加新数据_怎么向Mysql视图中增加新数据

    本篇文章主要给大家介绍mysql数据表中视图是怎么新增数据的. mysql视图的相关知识在我们之前的文章中,都已经给大家详细介绍过了,相信大家对视图肯定有了更深一步的了解. 从前面文章的介绍中,大家应 ...

  7. mysql视图中可以删除数据吗_sql問題 删除视图中的数据,表中的数据会删除吗?

    如果你那个视图,是 单表的, 没写 触发器的. 那么 如果 删除视图中的数据 成功了,那么 表中的数据 就被删除了. 如果那个视图, 写了个 INSTEAD OF 触发器. 但是里面没有任何删除的动作 ...

  8. 如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV

    文章目录 本教程将详细讲解 1. MySQL / MariaDB 数据库数据「导出」 2. MySQL / MariaDB 数据库数据「导入」 3. 使用「卡拉云」一键导入导出 MySQL / Mar ...

  9. vb mysql ado_VB中的ADO数据对象编程详解

    ADO是ActiveX Data Objects 的缩写,是一项新的数据库的存取技术 那天听到一位同学说他的女朋友是学新闻的可也学会了数据库,可学计算机的自己却还是不会,总觉得有点汗颜.在各网站的论坛 ...

最新文章

  1. js转换html为pdf文件怎么打开方式,pdf.js实现在HTML下直接浏览pdf文档,无需插件即可实现...
  2. Security Wheel 安全环
  3. 02-java常量变量数据类型
  4. 网络故障排除连载之七:设备兼容性故障排除
  5. 《C++ Primer 5th》笔记(4 / 19):表达式
  6. 最大规模线上新基建项目拉开大幕!第127届广交会今天正式开展
  7. python中startswith()函数的用法
  8. mysql数据库sql注入原理_如何SQL注入的原理和SQL注入的基础
  9. 拓端tecdat|R语言广义线性模型GLM、多项式回归和广义可加模型GAM预测泰坦尼克号幸存者
  10. windows 进程学习
  11. 华为手机左侧快捷方式,手机桌面太复杂?华为手机自动对齐整理桌面图标方法!...
  12. jq-ui-multiselect插件的使用
  13. 超级电容怎么才能把内阻做小_超级电容器内阻测定方法
  14. win10计算机管理界面模糊,Win10电脑屏幕显示模糊
  15. k8s pv与pvc
  16. 一闪一闪亮晶晶,满天都是小星星
  17. 车载滤波器组件焊锡开裂失效分析
  18. 虹科技术 | 终端入侵防御 | 在重大攻击中发现新的Babuk勒索软件
  19. spring mvc处理异常
  20. 极光尔沃A6-3d打印机体验

热门文章

  1. git clone出现fatal: HTTP request failed --git版本问题
  2. .net core中使用autofac进行IOC
  3. 解决Office 365应用程序无法正常启动(0X0000142)
  4. javascript 模拟滚动 隐藏滚动条
  5. logback日志框架的简单使用
  6. Java中的try/catch/finally
  7. javascript简单性能问题及学习笔记
  8. DatePicker 和 DatePickerDialog的基本使用方法
  9. 读书笔记-《JavaScript高级程序设计》-第2章 在HTML中使用JavaScript
  10. 好程序员分享如何看待CSS中BEM的命名方式?