数据库完整性,触发器

项目7总结:创建与使用触发器 项目7总结:创建与使用触发器的总结 阅读详情

  本章主要介绍一下数据库完整性:实体,参照,用户自定义完整性

  数据库的完整性是指数据的正确性和相容性。数据库的正确性是指数据是符合现实世界语义、反映当前实际情况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。

一般数据库管理系统必须能够实现如下功能:

1.提供定义完整性约束条件的机制

2.提供完整性检查的方法

3.进行违约处理

一、实体完整性

1.定义实体完整性

【例 5.1】将Student表中的Sno属性定义为主码。

create table Student
	(
	Sno    char(9)  primary key,
	Sname  char(20) not null,     
	Ssex   char(2),
	Sage   smallint,
	Sdept  char(20)
	);
--或者
create table Student
	(
     Sno    char(9),  
	 Sname  char(20) not null,
	 Ssex   char(2),
	 Sage   smallint,
	 Sdept  char(20),
	 primary key(Sno)
	);

在这里插入图片描述

【例 5.2】 将SC表中的Sno,Cno属性组定义为码。

create table SC
	(
	Sno   char(9)  not null, 
	Cno   char(4)  not null,  
	Grade smallint,
	primary key(Sno,Cno)    
	); 

在这里插入图片描述
2.实体完整性检查和违约处理

  用primary key短语定义了关系的主码后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统将按照实体完整性规则自动进行检查。包括:

(1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。

(2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。,从而保证了实体完整性。

insert 
into Student
values('201912121','李刚','男',20,'CS');

在这里插入图片描述
简单验证啦一下,没什么问题,SC表同理。

 
二、参照完整性

1.定义参照完整性

  关系模型的参照完整性create table中用foreign key短语定义哪些列为外码,用references短语指明这些外码参照哪些表的主码。

   例:关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)为主码,Sno、Cno分别参照引用Student表的主码和Course表的主码。定义SC表中的参照完整性

【例 5.3】定义SC中的参照完整性。

drop table if exists SC;
create table SC
	(
	Sno    char(9)  not null, 
	Cno    char(4)  not null,  
	Grade  smallint,
	primary key (Sno, Cno),						/*在表级定义实体完整性*/
	foreign key (Sno) references Student(Sno),  /*在表级定义参照完整性*/
	foreign key (Cno) references Course(Cno)   	/*在表级定义参照完整性*/
	);

2.参照完整性检查和违约处理。

  当对照表和参照表进行增,删,改操作时有可能破坏参照完整性。

  一般的,当对表的操作违反啦参照完整性,系统会默认策略,即拒绝执行。但是也可以让系统采取其他策略,在创建参照表的时候显式地说明。

【例 5.4】显式说明参照完整性的违约处理示例。

CREATE TABLE SC
        (Sno   CHAR(9)  NOT NULL,
         Cno   CHAR(4)  NOT NULL,
         Grade SMALLINT,
         PRIMARY KEY(Sno,Cno), 			
         FOREIGN KEY (Sno) REFERENCES Student(Sno) 
		     ON DELETE CASCADE        /*级联删除SC表中相应的元组*/
             ON UPDATE CASCADE,      /*级联更新SC表中相应的元组*/
         FOREIGN KEY (Cno) REFERENCES Course(Cno)	                    
             ON DELETE NO ACTION 	
          /*当删除Course 表中的元组造成了与SC表不一致时拒绝删除*/
             ON UPDATE CASCADE   
      	  /*当更新Course表中的Cno时,级联更新SC表中相应的元组*/
        );

 
三、用户自定义完整性

1.属性上约束条件的定义

  create table中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值限制,如:

(1)不允许取空值 (2)列值唯一 (3)用CHECK短语指定列值应该满足的条件

(1)不允许取空值

【例 5.5】在定义SC表时,说明Sno、Cno、Grade属性不允许取空值。

create table SC
	(
	Sno char(9)  not null,	/*Sno属性不能取空值*/
	Cno char(4)  not null,	
	Grade smallint not null,	
	primary key(Sno, Cno),  /* 在表级定义实体完整性,隐含了Sno,Cno不允许取空值,则在列级不允许取空值的定义可不写 */
		...		
	); 

(2)列值唯一

【例 5.6】建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码。

create table DEPT
	(
	Deptno  numeric(2),
	Dname  vhar(9)  unique not null, /*要求Dname列值唯一, 并且不能取空值*/
	Location  char(10),
	primary key (Deptno)
	); 

(3)用CHECK短语指定列值应该满足的条件

【例 5.7】Student表的Ssex只允许取“男”或“女”。

create table Student
	(
	Sno   char(9) primary key,
	Sname char(8) not null,                     
	Ssex  char(2)  check(Ssex in ('男','女')), /*性别属性Ssex只允许取'男'或'女' */
	Sage  smallint,
	Sdept  char(20)
	);

【例 5.8】 SC表的Grade的值应该在0和100之间。

create table  SC
	(
	Sno    char(9),
	Cno    char(4),
	Grade  smallint check(Grade>=0 and Grade <=100),/*Grade取值范围是0到100*/
	primary key (Sno,Cno),
	foreign key (Sno) references Student(Sno),
	foreign key (Cno) references Course(Cno)
	);

2.属性列约束条件的检查和违约处理

当往表中插入元组或者修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,若不满足则操作拒绝执行。

二,元祖上的约束条件

1.元祖上约束条件的定义

元组级的限制可以设置不同属性之间的取值的相互约束条件

【例 5.9】当学生的性别是男时,其名字不能以Ms.打头。

create table Student
	(
	Sno    char(9), 
	Sname  char(8) not null,
	Ssex   char(2),
	Sage   smallint,
	Sdept  char(20),
	primary key (Sno),
	check (Ssex='女' or Sname not like 'Ms.%')/*定义了元组中Sname和 Ssex两个属性值之间的约束条件*/
	);

2.元祖上约束条件的检查和违约处理

当往表中插入元组或者修改属性的值时,关系数据库管理系统将检查属性上的约束条件是否被满足,若不满足则操作拒绝执行。

 
四、完整性约束命名子句

  SQL还在CREATE TABLE 语句中提供拉完整性约束命名子句 CONSTRAINT ,用来对完整性约束条件命名,灵活地增加,删除一个完整性约束条件。

1.完整性约束命名子句

constraint <完整性约束条件名> <完整性约束条件>

<完整性约束条件>名包括:not null, unique, primary key, foreign key, check短语等。

【例 5.10】建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。

create table Student
	(
	Sno  numeric(6)
	constraint C1 check (Sno between 90000 and 99999),
	Sname  char(20)  
	constraint C2 NOT NULL,
	Sage  numeric(3)
	constraint C3 check (Sage < 30),
	Ssex  char(2)
	constraint C4 check(Ssex in( '男','女')),
	constraint StudentKey primary key(Sno)
	);

【例 5.11】 建立教师表TEACHER,要求每个教师的应发工资不低于3000元。

create table TEACHER
	(
	Eno    numeric(4)  primary key,   /*在列级定义主码*/
	Ename  char(10),
	Job    char(8),
	Sal    numeric(7,2),
	Deduct numeric(7,2),
	Deptno numeric(2),
	constraint TEACHERFKry foreign key (Deptno) 	references DEPT(Deptno),
	constraint C1 check(Sal + Deduct >= 3000) /*应发工资是工资列Sal与扣除项Deduct之和。*/
	);

2.修改表中的完整性限制

【例 5.12】去掉例5.10 Student表中对性别的限制。

alter table Student 
     drop constraint C4;

【例5.13】修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40。

alter table Student
	drop constraint C1;
alter table Student
	add constraint C1 check(Sno between 900000 and 999999),
alter table Student
	drop constraint C3;
alter table Student
	add constraint C3 check(Sage < 40);

 
七、触发器

  触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器中。任何用户对表的赠,删,该操作均由服务器自动激活。

1.定义触发器

触发器又叫事件-条件-动作规则。

一般格式为:

create trigger <触发器名>  
{before | after} <触发事件> on <表名>
referencing new|old row as<变量>
for each  {row | statement}
[when<触发条件>]<触发动作体>

  嗯,第一行的内容为创建一个触发器并起个名字,第二行说明触发事件,并且指出触发时机,第三行为给新旧变量起个别名,嗯至少我是这么理解的,哈哈,第四行表明是行级触发器还是语句级触发器,第五行表明触发条件,并且指出执行动作。嗯,差不多就是这样。看下面例子来理解吧!!!

【例 5.21】 当对表SC的Grade属性进行修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(Sno,Cno,Oldgrade,Newgrade)中,其中Oldgrade是修改前的分数,Newgrade是修改后的分数。

首先,我们建立一个这个SC_U基本表,用之前学过的SQL语句,应该不难哈

create table SC_U
		(
		Sno char(15),
		Cno char(10),
		Old int,
		New int
		);

然后,就建立题目中所说的触发器。

create trigger  SC_T		
after update of Grade on SC
referencing
	 old row  as  OldTuple,
	 new row  as  NewTuple
for each row
when(NewTuple.Grade >= 1.1 * OldTuple.Grade)
	 insert into SC_U(Sno,Cno,OldGrade,NewGrade) 				
	 values(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade);

在这里插入图片描述
很显然,是要出错的,早在意料之中,因为这是在TSQL中,上课老师也讲啦。

直接百度,看啦很多,总之要用 if 和 begin等控制,另外声明变量要用declare@加上名字,然后在用select进行变量赋值:

create trigger SC_T
on SC
after update
as
begin 
	declare @old int,@new int,@sno char(15),@cno char(10)--声明变量
	if(update(Grade))
	begin
	select @old=Grade from deleted
	select @new=Grade from inserted
	select @sno=Sno from inserted
	select @cno=Cno from inserted   --给变量赋值
	if(@new>=1.1*@old)
		insert into SC_U(Sno,Cno,Old,New)  --执行语句,嗯,就是前面学的insert语句
		values(@sno,@cno,@old,@new)
	end
end;

  使用select给自己建立的变量赋值,嗯,这个 if 控制很容易理解,多加上个end就可以啦,标准SQL里面是REFERENCING类似这里面的declare的使用,差不多就是这么个理。

实践一下

update SC
set Grade=100
where Sno='201215121' and Cno='2';

在这里插入图片描述
在这里插入图片描述
原本成绩是85,改为100,查看SC_U表,成功啦,good。

【例 5.22】将每次对表Student的插入操作所增加的学生个数记录到表StudentInsertLog中。

首先新建表StudentInsertLog和表StudentInsertLogUser。

CREATE TABLE StudentInsertLog
(
Numbers INT
)
CREATE TABLE StudentInsertLogUser
(
  UserName nchar(10),
  DateAndTime datetime
)

然后:

--新建触发器Student_Count
create trigger Student_Count
on Student  	         
after
insert
as 
    insert into StudentInsertLog(Numbers)
	select count(*) from Student;

-- 新建触发器Student_Time
create trigger Student_Time
on Student
after
insert
as 
	declare @UserName nchar(10)
	declare @DateTime datetime

	select @UserName = system_user
	select @DateTime = convert(datetime,getdate(),120)

	insert into StudentInsertLogUser(UserName,DateAndTime)
	values(@UserName,@DateTime);

发现一个问题,不能同时创建这两个触发器,必须一个一个弄,amazing!!!

create trigger Student_Count
after update on Student  	         
referencing
 	new table as DELTA
for each statement 
    insert into StudentInsertLog (Numbers)
	select count(*) from DELTA

这个是标准SQL,肯定也是要报错的,参考老师给的T-SQL语句:

测试一下:

INSERT
INTO  Student
VALUES ('201215135','王五','男',18,'CS');
SELECT * FROM Student
SELECT * FROM StudentInsertLog
SELECT * FROM StudentInsertLogUser

在这里插入图片描述
测试成功

【例 5.23】 定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元。

先建一个Teacher表:

create table Teacher
	(
	Tno char(15) primary key, 
	Tname char(10), 
    Job char(8), 
 	Sal int, 
	);

标准SQL语句如下:

create trigger Insert_Or_Update_Sal 
before  insert or update on Teacher  /*触发事件是插入或更新操作*/
for each row        /*行级触发器*/
begin               /*定义触发动作体,是PL/SQL过程块*/
  if(new.Job = '教授') and (new.Sal < 4000) 
     then  new.Sal := 4000;                
   	 end if;
end; 

这个是标准SQL,肯定也是要报错的,我们看T-SQL语句:

create trigger Insert_Or_Update_Sal
on Teacher
for update,insert
as
begin
	declare @job char(8)
	declare @sal int
	if update(Sal)
	begin	
	select @sal = Sal from inserted
	select @job = Job from inserted
	if(@sal < 4000 and @job = '教授')
		update Teacher
		set Sal = 4000
		where Sal < 4000 and Job = '教授'
	end
end;

在这里插入图片描述
测试一下:

insert 
into Teacher(Tno,Tname,Job,Sal)
values('201215121','张三','教授','3500');

在这里插入图片描述

在这里插入图片描述

2.激活触发器

  触发器的执行是由触发事件激活,并由数据库服务器自动执行的。一个数据表上可能定义了多个触发器,如多个BEFORE触发器,多个AFTER触发器等,同一个表的多个触发器遵循如下的执行顺序。

(1)执行该表上的 BEFORE 触发器

(2)激活触发器的 SQL 语句

(3)执行该表上的 AFTER 触发器

3.删除触发器

删除触发器的SQL语句如下:

drop trigger <触发器名> on <表名>;

注意,该触发器必须存在哦!!!

 
8.3 存储过程和函数

  过程化SQL块主要有两种类型,即命名块和匿名块,之前学的都是匿名块,匿名块每次执行时都要进行编译,它不能被存储到数据库中,也不能在其他过程化SQL块中调用。过程和函数是命名块,它们被编译后保存在数据库中,称为持久性存储模块,可以被反复调用,运行速度较快。

2.存储过程的用户接口

格式如下:

CREATE OR REPLACE PROCEDURE 过程名([参数1,参数2,…])
AS <过程化SQL块>;

【例 8.9】从账户1转指定数额的款项到账户2中。假设账户关系表Account(Accountnum,Tatal)。

先创建一个Account表:

create table Account(
	accountnum char(3),-- 编号
	total float -- 余额
);
insert into Account
values('101',50),('102',100);--插入两个数据
select * from Account;

然后开始建立对应的存储过程:

if (exists (select * from sys.objects where name = 'Proc_TRANSFER'))
    drop procedure Proc_TRANSFER
go
create procedure Proc_TRANSFER 
@inAccount int,@outAccount int,@amount float
 /*定义存储过程TRANSFER,参数为转入账户、转出账户、转账额度*/
as
begin transaction TRANS   
   	declare	/*定义变量*/
	@totalDepositOut float,
	@totalDepositIn float,
	@inAccountnum int;
	 /*检查转出账户的余额 */     
	select @totalDepositOut = total from Account where accountnum = @outAccount;
	/*如果转出账户不存在或账户中没有存款*/
	if @totalDepositOut is null               	   
		begin
			print '转出账户不存在或账户中没有存款'
			rollback transaction TRANS; 	   /*回滚事务*/
			return;
		end;
	/*如果账户存款不足*/
	if @totalDepositOut < @amount     	
		begin
			print '账户存款不足'
			rollback transaction TRANS; 				/*回滚事务*/
			return;
		end
	/*检查转入账户的状态 */  
	select @inAccountnum = accountnum  from Account	where accountnum = @inAccount;
	/*如果转入账户不存在*/ 
	if @inAccountnum is null   		                       
		begin
			print '转入账户不存在'
		    rollback transaction TRANS; 	         	 		/*回滚事务*/
			return;
		end;
	/*如果条件都没有异常,开始转账。*/ 
	begin
		update Account set total = total - @amount where accountnum = @outAccount; /* 修改转出账户余额,减去转出额 */
		update Account set total = total + @amount where accountnum = @inAccount; /* 修改转入账户余额,增加转入额 */
		print '转账完成,请取走银行卡'
		commit transaction TRANS;                       	/* 提交转账事务 */
		return;
	end

然后进行转账等操作,进行验证:

select * from Account;
exec Proc_TRANSFER
	@inAccount = 102, --转入账户
	@outAccount = 101, --转出账户
	@amount = 50 --转出金额
select * from Account;

我们在开始和结束都进行一次查询,进行验证,这里调用存储过程用exec,后面再加上对应的参数就行啦。

在这里插入图片描述
ok,成功!!!

(3)修改存储过程

格式如下:

alter procedure 过程1 rename to 过程2;

(4)删除存储过程

drop procedure 过程名();

 
8.3.2函数

  这章的函数也称为自定义函数。因为是用户自己使用过程化SQL设计定义的。函数和存储过程类似,都是持久性存储模块。不同之处是函数必须指定返回的类型。

1.函数的定义语句格式:

CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,…]) RETURNS <类型> 
AS <过程化SQL块>;

2.函数的执行格式语句

CALL/SELECT 函数名 ([参数1,参数2,…]);

3.修改函数

可以使用 alter function 重命名一个自定义函数:

ALTER FUNCTION 过程名1 RENAME TO 过程名2;

可以使用 alter function 重新编译一个函数:

ALTER FUNCTION 过程名 COMPILE;

嗯,查看啦其他博主关于T-SQL里面的一些函数相关定义,基本格式为:

格式语句为:

create   function   [ owner_name ]  function_name 
( [ {@parameter_name [as ]  scalar_parameter_data_type [ =default ] }  [ ,n ] ])
 returns  scalar_return_data_type
 [ with <function_option> [,n ] ]
 [ as ] 
 begin 
function_body
 return   [ scalar_expression ] 
 end 

举个例子:

create function Greatest(@v1 float,@v2 float,@v3 float)
RETURNS float
AS
BEGIN	
	declare @ret float;
	set @ret=@v1;
	if @ret<@v2 
	begin 
		set @ret=@v2 
	end 
	if @ret<@v3
	begin 
	   set @ret=@v3
	end
	return @ret
END

(1)调用语句:

select dbo.Greatest(1.36,10.56,8.366);

(2)exec 直接执行

exec dbo.Greatest1.36,10.56,8.366;

 
四,感悟

  嗯,有些时候,坚持或许很难,不仅仅是学习,生活上也是。但当我们坚持下去,尽管我们最后没有在顶峰相见,但是我们回头望去,我们不是在前行吗?正如刚火的一篇中科院博士的论文中提到:“信念很简单,把书念下去,然后走出去,不枉活一生”,读完很是感动,我试想过,我若是那般处境,我可能都没那般毅力,但幸运的是,我很幸运,所以我们更应该努力,加油吧。

【实验九】【使用触发器实现数据完整性】 文章目录触发器一、实现域完整性二、实现参照完整性三、比较约束与触发器的执行顺序Reference 触发器 触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。 触发器又叫做事件-条件-动作(event-condition-action)规则。 触发器功能很多,因为触发器规则中的动作体可以很复杂。通常是一段SQL存储过程。 触发器不仅可以用于数据库完整性检查,也可以用来实现数据库系统的其他功能,包括数据库安全性以及更加广泛的应用系统的一些业务流程和控制流程,基于规则的数据和业务控制功能等。 阅读详情

相关推荐

《数据库原理》实验报告DB5——触发器与存储过程(函数)

一. 实验内容、步骤以及结果 1. 针对SPJ_MNG数据库,创建并执行如下存储过程。(共计40分) (1) 创建一个没有参数的存储过程—jsearch1。该存储过程的作用是:当执行该存储过程时,将返回S表中北京供应商的所有信息。调用该存储过程并验证结果。(5分) 创建: DELIMITER $$ USE `spj_ming`$$ CREATE PROCEDURE `jsearch1` () BEGIN select * from s where city = '北京'; END$$ 验证: Ca

CityBoySHU的博客 4730

Sql Server 11 第五章例题

5.1 实体完整性 关系模型的实体完整性 CREATE TABLE中用PRIMARY KEY定义 [例5.1] 将Student表中的Sno属性定义为码 --列级定义主码 create table Student (Sno char(9) primary key, Sname char(20) not null, Ssex char(2), Sage smallint, Sdept char(20) ); --表级定义主码 create table Student2 (Sno ..

bibiobi的博客 2595

数据库系统学习笔记(数据库安全、完整性、断言、触发器)

一、数据库安全 1、权限控制 GRANT REVOKE CASCADE级联回收表示将该用户授予其他用户的权限一并回收 2、数据库角色 即对属于同一角色的用户授予相同权限 3、强制存取控制(MAC) 表的存取有权限控制,但是数据没有权限控制,因此当授权人员获取数据后,该部分数据即有可能被传播。 这样做目的是为了防止主体从客体中读取高等级数据,再恶意写入至低等级客体中,造成数据泄露。 强制存取控制是对数据本身进行密级标记,数据与标记是不可分的整体 4、视图机制的应用 通过视图机制授予用

qq_39416397的博客 542

【数据库作业13】SQL练习8 - CHECK / CONSTRAINT / TRIGGER / PROCEDURE/ FUNCTION

数据的完整性:防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。 防范对象:不合语义的、不正确的数据。 数据的安全性:保护数据库 防止恶意的破坏和非法的存取。 防范对象:非法用户和非法操作。 实体完整性:主码唯一,不能为空 关系模型的实体完整性: CREATE TABLE中用PRIMARY KEY定义 主属性只有一个时可以使用列级完整性,将条件直接写在数据类型后面,也可以使用表...

weixin_45871977的博客 2002

Oracle数据库触发器:确保数据库完整性

本章深入探讨了在Oracle数据库中如何使用触发器来自动维护数据完整性。介绍了创建、编辑和删除触发器的方法,并展示了如何在PL/SQL和Java中创建触发器。触发器可以在表中插入、更新或删除数据时自动执行操作,如更新引用完整性、执行级联删除、存档内容以及处理正在修改的表的特殊情况。但创建触发器时需注意其对数据库性能的潜在影响。

weixin_32921023的博客 404

别再只盯着DDR5了!聊聊3D DRAM:它凭什么能解决AI算力的内存墙难题?

本文深入探讨了3D DRAM技术如何突破AI算力的内存墙限制。通过立体堆叠架构,3D DRAM在存储密度、带宽和延迟方面实现显著提升,有效解决AI训练和推理中的内存瓶颈问题。文章还分析了三星、SK海力士等巨头的技术路线图,并指出商业化面临的挑战与机遇。

weixin_42685438的博客 188

数据库的完整性约束及触发器

数据库完整性约束 1.约束(列级约束)   主键   外键   不为空   唯一   Default   Check(不支持) 2.触发器(行级约束)  在对某些表执行更新操作(insert,update,delete)时同时触发一些其他动作,对于查询操作不会触发任何动作   #查询系统中的触发器 select trigger_schema,trigger_name fr

mr_tangshuai的博客 3413

AI辅助游戏开发实战:Kimi K3提升Unity开发效率与代码质量

在游戏开发领域,有限状态机(FSM)是构建角色AI行为逻辑的核心设计模式,它通过定义明确的状态和转换条件,使游戏实体能够智能地响应环境变化。其原理在于将复杂的行为分解为离散的状态节点,并通过事件驱动状态切换,从而实现清晰、可维护的AI架构。这项技术的价值在于显著提升了游戏角色的行为真实感和开发效率,被广泛应用于NPC行为控制、角色动画管理、UI流程等场景。随着AI编程助手的兴起,开发者现在可以借助如Kimi K3这类工具,通过自然语言指令快速生成和优化FSM等复杂系统的代码框架,将更多精力投入到核心玩法与性

weixin_30430677的博客 407

【数据库系统概论】第5章 数据库完整性【!触发器】

针对某一具体应用的数据必须满足的语义要求触发器又叫做事件-条件-动作(event-condition-action)规则当特定的系统事件发生时,对规则的条件进行检查,如果条件成立则执 行规则中的动作,否则不执行该动作。触发器是一个能自动执行的特殊的存储过程CREATE TRIGGER {BEFORE | AFTER} ON REFERENCING NEW | OLD ROW AS [WHEN ];:用来定义一个新的触发器。

学习中 1221

Linux下离线安装Google Chrome

目录背景一、下载并安装Google Chrome二、下载并安装依赖包1.libvulkan.so.1()(64bit)2.读入数据总结 背景 项目中服务器被要求不能连接外网,不能直接联网安装,所以需要下载Google Chrome安装包和依赖包,然后离线安装。 linux下步骤都一样,不管ubuntu还是centos只是需要下载对应系统的文件包即可。 本机系统:CentOS 7 一、下载并安装Google Chrome 官方下载地址http://www.google.cn/chrome/browser/d

ancientapesman的博客 1万+

Viobot使用教程总贴

使用教程总贴

weixin_66666206的博客 1408

数据库完整性之触发器

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程 触发器保存在数据库服务器中 任何用户对表的增、删、改操作均由服务器自动激活相应的触发器 触发器可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力 定义触发器 CREATE TRIGGER语法格式 CREATE TRIGGER <触发器名> {BEFORE | AFTER} <触发事件> ON <表名> REFERENCING NEW|OLD ROW AS<变量&

学习日常分享 2903

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

数据库 实验五 数据库的完整性约束与触发器实验

–1、创建、删除约束 –在选修数据库中,以Student(sno,sname,ssex,sage,sdept),Course(cno,cname,cpno,credit),SC(sno,cno,grade)表为基础完成下列完整性约束。 –(1)为数据库表Course创建check约束:当插入或修改一个记录时,确保学分为1-8之间。 alter table course add constraint c1 check(credit between 1 and 8 ); –(2)为数据库表Student创建c

weixin_45942124的博客 6517

【AIGC】COT思维链:让AI学会拆解问题,像人一样思考

COT思维链的出现,为AI的发展开辟了一条新的道路。它让AI学会了像人类一样思考,将复杂问题分解成简单的步骤,并逐步推理出最终答案。希望我的引导会对你产生启发。

智兔唯新的博客 9002

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(三)(含2022年和2023年)

此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章)A.错误B.正确参考答案:BA.getB.try_getC.peekD.put参考答案:B。

qq_42135020的博客 1913

数据库完整性--断言--触发器实验

一、实验目的: (1)理解和掌握数据库完整性–断言–触发器,能够使用SQL语句对数据库完整性–断言–触发器实验操作。 (2)掌握SQL语句常见语法错误的调试方法。 二、实验内容: 按照下列要求操作,并截取相应的结果图。要求设计测试数据进行实体完整性、参照完整性和用户定义完整性的检查和违约处理。 1、按照教材158页例5.1至例5.13、例5.18至例5.23的要求操作 5.1.1 定义实体完整性 关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义码。 对单属性构成的码的两种说明方法

weixin_45348240的博客 4298

【反蒸馏实战 00】AI抢不走的工作:一份针对30个“高危”职位的“反取代”实战手册(反蒸馏计划启动)

AI时代职场生存指南:30个技术岗位的“反蒸馏”实战策略 随着AI技术快速发展,职场正面临前所未有的结构性重构。本系列专栏聚焦30个技术岗位,深入分析AI对各职位的影响路径,并提供系统性的"反蒸馏"策略。通过5层分析框架(AI冲击现状、核心价值解构、AI天花板、能力升级路径、人机协作模式),帮助从业者识别可替代任务与核心价值,建立不可替代的专业优势。内容涵盖IT开发、数据分析、产品管理等技术领域,为职场人提供从“被AI替代”到“与AI协同”的转型路线图,守护职业价值。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1647

SQL Server触发器在保持数据库完整性中的应用

前言:此论文为我已经发表的一篇论文,说的好听点所谓"学术论文",何呵....发表在2007年第三期上,其实也没有什么特别的地方,只是一个触发器的小小应用而已,如果对大家有用,我将会感到非常的高兴.这篇论文也是当时在首次尝试自己用asp.net做一个论坛时用到的一些东西,当然这个技巧不算是我的独创了,只是我在应用中利用它解决了我的实际问题而已..呵呵..大家将就着看一下吧  [摘要] 触发器

J_JAKE(陆冷飞)的专栏 2112

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

数据库完整性(实体完整性、参照完整性、用户定义的完整性、完整性约束命名字句、断言、触发器)

数据库完整性:数据的正确性(是指数据是符合现实世界语义,反映了当前实际状况的)、数据的相容性(是指数据库同一对象在不同关系表中的数据是符合逻辑的) 数据的完整性 : 防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据 防范对象:不合语义的、不正确的数据 完整性检查:(数据库管理系统中检查数据是否满足完整性约束条件的机制称为完整性检查。) 一般在INSERT、UPDATE、DELETE语句执行后开始检查,也可以在事务提交时检查。 违约处理: 拒绝(NO ACTION)...

weixin_42492218的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数据库:实体完整性,参照完整性,断言,触发器

本文将简明介绍数据库中的实体完整性、参照完整性、断言和触发器四大关键概念。这些机制是确保数据一致性和系统稳健性的基础。通过学习这些内容,读者将理解如何设计和管理可靠的数据库结构,从而提高应用程序的稳定性与效率。

燕双嘤 6206

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Day07数据库完整性 *触发器

一、数据库完整性总结 二、简述触发器的使用 1、触发器是在级联更新和级联删除的基础上,为之更加复杂的一种完整性约束 2、创建触发器的语法:create trigger 触发器名 before/after insert/delete/update on 表名 for each row <触发体> 3、举例1:创建触发器del_tri 触发器,触发器将记录哪些用户删除了学生表的数据,以及删除的时间。 首先创建一个记录用户和删除时间的记录表merch_log表; create table me

m0_50036611的博客 414

【数据库系统概论】数据库完整性与触发器--复习

数据库完整性,实体完整性,列级完整性约束定义,表级完整性约束定义,实体完整性检查,实体完整性违约检查,参照完整性,参照完整性检查,参照完整性违约检查,用户定义完整性检查,用户定义的完整性违约检查,触发器,创建触发器,删除触发器

2302_80281315的博客 1454

【SQL Server系列】_06数据库完整性与触发器

文章目录一、数据库的安全性二、完整性控制1、数据库完整性的含义2、完整性规则的组成3、完整性约束条件的分类【1】值的约束【2】结构的约束【3】静态约束【4】动态约束4、数据库完整性的实施三、SQL的数据安全机制四、触发器1、触发器概述2、代码演示 一、数据库的安全性 数据库的安全性是指:保护数据库以防止非法使用所造成的数据泄露,更改或者破坏。 数据泄露-》数据被读取 更改-》增删改 破坏-》加密,删库 3A 【1】Authenticate:验证 【2】Authorize:授权 【3】Audit:审计——对

2148

SQL Server中的数据库完整性、触发器、存储过程和函数

数据库完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反映当前实际情况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。为维护数据库的完整性,数据库管理系统必须能够实现如下功能: 1.提供定义完整性约束条件的机制 2.提供完整性检查的方法 3.进行违约处理 实体完整性 定义实体完整性 关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只

MHCddt的博客 962

第五章 数据库的完整性(实体完整性、参照完整性、用户自定义完整性、断言、触发器)

数据库的完整性(实体完整性、参照完整性、用户自定义完整性、断言、触发器)

m0_60803455的博客 580
上一篇: 第四章习题作业
下一篇: 第五章课后习题(以及存储过程习题)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谁会没有丶遗憾呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值