摘自《数据库系统概论》–王珊
2、REVOKE
授权用户的权限可以由数据库管理员或其他授权者用REVOKE语句收回,REVOKE的语句一般格式为
REVOKE <权限> on 对象类型 <对象名> from 【用户】

把用户 U4 修改学生学号的权限收回
		REVOKE UPDATE(Sno)ON Tbale Student from u4

		REVOKE SELECT ON school.Student from 'student'@'localhost' 
		收回学生本地select权限
		REVOKE SELECT on *.* from 'student'@'localhost';

		注意:如果student授权给其他用户,当管理员收回student的权限时,会级联(cascADE)收回student授权的用户
		,这里默认值是cascade,有的数据库管理系统默认为RESTRICT,将自动执行级联操作。如果u6或u7还从其他用户处
		获得权限,则他们任然具有此项权限,系统只收回直接或间接从u5处获得的权限。

3、创建数据库模式的权限
GRANT 和 REVOKE 语句向用户授权或收回对数据的操作权限。对创建数据库模式一类的数据库对象的授权则由数据库管理员
在创建用户时实现。
CREATE user语句一般如下。
CREATE user [WITH][DBA|RESOURCE|CONNECT]
**只有系统的超级用户才有权创建一个新的数据库用户。
**新创建的数据库用户有三种权限 DBA | RESOURCE | CONNECT。

**CREATE USER命令中如果没有指定创建新用户的权限,默认该用户拥有CONNECT权限。拥有CONNECT权限的用户不能创建新用户,
		 不能创建模式,不能创建基本表,只能登陆数据库。由管理员或其他用户授予他应有的权限,根据获得的授权情况,他可以对数据库进行
		 权限范围内的操作。

		 **拥有RESOURCE权限的用户能创建基本表和视图,成为所创建对象的属主,但不能创建新的用户。数据库对象的属主可以使用GRANT
		 语句把该对象身上的权限授予其他的用户

		 **拥有DBA权限的用户是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等;

		 不好使:grant dba to user1

#4.2.5 数据库角色
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。

1、角色的创建
		 	CREATE ROLE <角色名>
		 	创建的角色为空,没有任何内容,可以用GREANT为角色授权

		2、给角色授权
			GRANT <权限><权限> on 对象 to 角色

		3、将角色授予其他的用户
		GRANT <角色1><角色2> to <角色3>【<用户1>】with ADMIN OPTION
			该语句把角色授予某用户,或授予另一个角色,这样这个角色就拥有所有其他用户授予他的权限

		4、角色权限收回
		revoke <权限> on 对象 from 角色
		用户可以收回角色的权限,从而修改角色拥有的权限

		【例】通过角色来实现将一组权限授予一个用户,
			①先创建一个角色R1.
			create role R1
			②然后使用GRANT语句使角色R1拥有student表的select,insert,updata权限。
			GRANT select,INSERT,UPDATE on student to R1;
			③将这个角色授予user1,user2,user3,使他们具有角色R1所包含的全部权限。
			GRANT R1 to user1,user2,user3,
			④当然,也可以一次性的通过R1来收回 user1的三个权限
			REVOKE R1 from	user1,
			⑤角色权限修改。

##4.3视图机制
还可以为不同的用户定义不同的视图范围,把数据对象限制在一定的范围内,也就是说,通过视图吧要保密的数据
对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护

【例】建立计算机系学生的视图,把对该视图的select权限授予user1,把该视图上的所有操作授予张明
		/*先建立视图*/
		create view CS_student
		AS
		select * from student where Sdept ='cs';

		/*user1只能检索计算机系学生的信息*/
		GRant select from CS_student to user1

		/*系主任具有检索和增删改计算机系学生信息的所有权限*/
		grant all privileges on CS_student to 系主任

##4.4审计
任何的系统的安全都不是完美无缺的,蓄意盗取、破坏数据的人总是想办法打破控制。
审计功能把用户对数据库的所有操作自动记录下来放入审计日志。审计员可以利用
审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、
时间和内容等。可以对审计日志进行分析,对潜在的危险提前采取措施加以防范
1.审计事件
①、服务器事件
审计数据库服务器发生的时间,包含数据库服务的启动、停止、数据库服务器
配置文件的重新加载。
②、系统权限
对系统拥有的结构或模式对象进行操作审计,要求该操作的权限是通过系统权限获得的
③.语句事件
对sql语言的审计
④.模式对象事件
对特定模式对象上进行的select和DML操作的审计。模式对象包括表、视图、存储过程、
函数等。模式对象不包括依附于表的索引、约束、触发器、分区表等。

2、审计功能
			基本功能
			提供多套审计规则
			提供审计分析和报表功能
			审计日志管理功能
			
		3、AUDIT语句和NOAUDIT语句
		AUDIT语句用来设置审计功能,NOAUDIT用来取消审计功能。
		审计一般分为用户级审计和系统级审计,
			用户级审计,主要针对用户对自己创建的数据库表或视图
		进行审,记录所有用户对这些表的操作。
			系统级审计只能由数据库管理员设置,用以监测成功或者失败的登录要求、监测授权和收回操作以及
			其他数据库级权限下的操作
			【例】对修改SC表结构或修改SC表数据的操作进行审计
			AUDIT alter,updata on SC
			【例】取消对 SC的一切审计
			NOAUDIT alter,update on sc 

			审计设置以及审计日志一般都存储在数据字典中。必须把审计开关打开(即把系统参数
			audit_trail设为 true)才可以在系统表sys_AUDITTRAIL中看到审计信息。
			数据库安全审计系统提供了一种事后检查的安全机制
			MySQL 8 , 开启审计
			查看设置
			show global variables like 'log_timestamps';
			show global variables like '%general%'
			设置开启审计
			set GLOBAL general_log = OFF;
			set GLOBAL log_timestamps =system;