小知识分享4

发布时间:2024年01月21日

1.写出创建触发器的一般语法并说明其含义

create trigger <触发器名> {before | after} <触发事件> on <表名>
for each {row | statement} [when <触发条件>]
as begin
<触发动作体>
end;
说明:

1、<触发事件>可以是insert、delete或update[of<列, …>]等数据更新操作。
2、before表示在操作执行前触发动作体,after则在操作执行后触发动作体。
3、for each row 为行级触发器,操作涉及多少行就会执行多少次触发动作体。
4、for each statement 为语句级触发器,事件发生时触发动作体只执行一次。
5、<触发条件>是一个布尔表达式,表示事件发生时是否触发动作执行的附加条件。
6、<触发动作体>为事件发生时执行的动作。可以是单个SQL语句或PL/SQL过程,也可以是存储过程调用。可以用NEW和OLD引用新值和原值。

2.权限概述

权限涉及5张表:
用户表、角色表、权限表(菜单表)、用户角色关联表、角色权限关联表,
当用户登录时,根据用户名和密码到用户表验证信息是否合法,如果合法则获取用户信息,之后根据用户id再到用户角色关联表中得到相关连的角色id集合,之后根据角色id再到角色权限关联表中获取该角色所拥有的权限id集合,然后再根据权限id集合到权限表(菜单表)中获取具体的菜单,展现给当前登录用户,从而达到不同用户看到不同的菜单权限。

我们通过ZTree来给角色赋权并且通过ZTree来展示菜单,以及通过ZTree来管理菜单即增加和编辑菜单。
我们做的权限控制到url级别,为了防止用户不登录直接输入url访问的这个弊端,通过拦截器进行拦截验证。

3.数据库三范式是什么?

第一范式(1NF)
字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)
数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。
第二范式(2NF)
1、第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须满足第一范式(1NF)。
2、要求数据库表中的每个实例或行必须可以被唯一地区分。通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键。
第三范式的要求如下:
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其他表中已包含的非主关键字信息。
所以第三范式具有如下特性:
1、每一列只有一个值
2、每一行都能区分
3、每一个表都不包含其他表已经包含的非主关键字信息

4.数据库优化的思路

1.SQL语句优化
1)应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2)应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。
3)很多时候用exists代替in是一个好的选择
4)用Where子句替换HAVING子句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤。

5.存储过程与触发器的区别

触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性。触发器不同于存储过程,触发器主要是通过事件执行而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如updata、insert、delete这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

文章来源:https://blog.csdn.net/weixin_74242572/article/details/135725757
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。