T-SQL基础(SQL高级编程语言)(二)

news2024/11/24 22:35:44

一、常量、变量

1. 常量

  1. 又称为字面值或标量值,程序运行过程中值不变
  2. ’O’'Bbaar’,如果单引号中的字符串包含引号,可以使用两个单引号表示嵌入的单引号。
    在这里插入图片描述
    2.变量

​ 变量名不能与系统变量相同://img-blog.csdnimg.cn/75b50604013c4e74ae050dfe3531441d.png)
变量的声明赋值与使用
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

case※※
​ case语句上边通常为半句话

​ ※※※※使用case语句给变量赋值

--查询05880101学生选课的平均成绩,并根据平均成绩的范围输出等级ABCDE五个字母
use demo
go
declare @avg int,@flag varchar(20)
select @avg=avg(grade)
from sc
where sno='05880101'
select @flag=
case  
     when @avg>=90 and @avg<=100 then 'A'
     when @avg>=80 and @avg<90   then 'B'
     when @avg>=70 and @avg<80   then 'C'
     when @avg>=60 and @avg<70   then 'D'
     when @avg<60 then 'E'
     else 'No such grade'
end
select @flag as '等级'

在这里插入图片描述
在这里插入图片描述
5.语句格式
daclare 游标名 cursor
for select * from student where dept=‘系名’
open 游标名
fetch (next|prior|frist|last|absosute|relative) from 游标名/into@t
close 游标名
deallocate 游标名

6.游标基础代码

declare c1 cursor for select/*update/delete*/
open c1
fetch next from c1
	while @@fetch_status=0
		begin
			fetch next from c1
			/*游标遍历结果集全部输出*/
			
			/*delete/update where current of c1当前行的数据*/
		end
close c1
deallocate c1

7.全局游标变量(选择)
@@cursor_rows:返回最后打开的游标中当前存在的满足条件的行数。

返回0:表示游标未打开;

返回**-1**:表示游标为动态游标;

返回值(n):是游标中的总行数。

@@fetch_status:返回fetch语句执行后游标的状态。

返回0:表示fetch语句执行成功;

返回**-1**:表示fetch语句执行失败;

返回**-2**:表示被读取的记录不存在。

8.声明游标

declare c1 cursor
[ local | global ]                  /*游标作用域*/
[ forward_only | scroll ]           /*游标移动方向*/
[dynamic |static | fast_forward ]	/*游标类型*/
[ read_only]                        /*访问属性*/
for select                       	 /*SELECT查询语句*/
for update of 列名					/*可修改的列*/

(1)游标作用域

  • scroll:说明所声明的游标可以前滚、后滚,可使用所有的提取选项(frist、last、prior、next)。
    (2)游标移动方向
  • forward_only:表示游标只能从第一行滚动到最后一行,即该游标只能支持fetch的next提取选项。
    (3)游标类型
  • dynamic:为动态游标。它能够反映对结果集中所做的更改(update、delete),并且如果使用 where current of子句通过游标进行更新,则它们也立即在游标中反映出来。
  • static:为静态游标。数据库中所做的任何影响结果集成员的更改(增加、修改或删除数据),都不会反映到游标中,新的数据值不会显示在静态游标中。
  • fast_forward:为只进游标。只支持游标从头到尾顺序提取数据。在结果集行提取后对行所做的更改对游标是不可见的。
    (4)访问属性
  • read_only:说明游标为只读的,不能通过该游标更新数据库中的数据。
    (5)目的
  • for update of 某一列:指出游标中可以更新的列。
    (6)游标类型与移动方向之间的关系
  • fast_forward不能与scroll一起使用,且fast_forward与forward_only只能选用一个。
  • 若指定了移动方向为forward_only,而没有用static或dynamic关键字指定游标类型,则默认所定义的游标为动态游标。
  • 若移动方向forward_only和scroll都没有指定,那么移动方向关键字的默认由以下条件决定:
  • 如果指定了游标移动类型为static或dynamic,则移动方向默认为scroll;
  • 如果没有用static或dynamic关键字指定游标类型,则移动方向默认值为forward_only。

9.打开游标
global说明打开的是全局游标,否则打开局部游标。游标变量名可以引用要进行提取操作的已打开的游标。

10.读取数据
打开游标后,可以使用fetch语句从中读取数据说明读取数据的位置

fetch [next,prior,first,last,absosute,relative] ⟶ \longrightarrow⟶说明读取数据的位置

from (global) 游标名/@<游标变量名>

into @<游标变量名> (n)

  • next
    紧跟当前行返回结果行,并且当前行递增为返回行。 如果fetch next 为对游标的第一次提取操作,则返回结果集中的第一行。 next 为默认的游标提取选项。

  • prior
    返回紧邻当前行前面的结果行,并且当前行递减为返回行。 如果 fetch prior 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。

  • frist
    返回游标中的第一行并将其作为当前行。

  • last
    返回游标中的最后一行并将其作为当前行。

  • absosute

​ n为正数读取从游标头开始的后第n行,并且使其位置为当前行。

​ n为负数读取从游标尾开始的前第n行,并且使其位置为当前行。

  • relative

​ n为正数读取从当前行之后的第n行,并且使其位置为当前行。

​ n为负数读取从当前行之前的第n行,并且使其位置为当前行。

11.关闭游标
​ 游标使用完以后,要及时关闭。关闭游标使用close语句

​ close (global) 游标名/@<游标变量名>

12.删除游标
游标关闭后,其定义仍在,需要时可用open语句打开,再次使用。若确认游标不再需要,就要释放其定义占用的系统空间,即删除游标。删除游标使用deallocate语句

deallocate (global) 游标名/@<游标变量名>

四、函数
1.函数分类

函数分为系统函数和用户自定义函数
在这里插入图片描述
3.用户定义函数

  • 标量函数:只能返回单个确定类型的标量值。
  • 内嵌表值函数:以表的形式返回一个返回值,即返回的是一个表,相当于一个参数化的视图。
  • 多语句表值函数:可以看作标量型和内嵌表值型函数的结合体。返回值是一个表,但它和标量型函数一样,有一个begin⋯ \cdots⋯end语句括起来的函数体,该函数体包含插入语句,向返回表中插入数据。

1.标量函数的定义
语法格式:

  • create function 架构名.函数名⟶ \longrightarrow⟶函数名部分(demo数据库中架构名为dbo)

  • (@参数名 as 数据类型 =default readonly) ⟶ \longrightarrow⟶形参定义部分

  • returns 返回值类型⟶ \longrightarrow⟶返回参数的类型

  • as

  • begin
    函数体 ⟶ \longrightarrow⟶函数体部分
    return 标量表达式 ⟶ \longrightarrow⟶返回语句
    end

说明:参数和返回值的数据类型可以是任何有效的SQL标量数据类型,不能是用户自定义的数据类型、timestamp或cursor游标。

/*使用标量函数average实现以下功能:
1.查询全体学生选修某门课程(课程号)的平均成绩。
2.调用上述函数,输出选修“c2”课程的平均成绩。*/
create function average(@cno char(8))
returns int
as
begin
   declare @avg int
   select @avg=avg(grade)
   from sc
   where cno=@cno
   return @avg
End
/*函数调用*/
declare @aver int
select @aver=dbo.average('c2')
print 'c2号课程的平均分为:'+ltrim(@aver)
print 'c2号课程的平均分为:'+ltrim(dbo.average('c2'))

2.标量函数的调用
当调用用户定义的标量函数时,必须提供至少由两部分组成的名称(架构名.函数名)。
可以在select、set 和print语句中调用标量函数。

3.表值函数
在这里插入图片描述
内嵌函数可用于实现参数化视图。例如,视图如下:

create view view1
as
select sno,sname
from student where dept='计算机系'

3.1 内嵌表值函数的定义

  • create function (架构名.) 函数名⟶ \longrightarrow⟶函数名部分
  • (@参数名 as 数据类型=(default)) readonly⟶ \longrightarrow⟶形参定义部分
  • returns table⟶ \longrightarrow⟶返回值为表类型
  • as
  • return select语句⟶ \longrightarrow⟶通过select语句返回内嵌表
    说明:在内嵌表值函数中,通过单个select语句定义table返回值,因此内联函数没有相关联的返回变量。
create function getinfo(@dept varchar(15))
returns table
as
  return
     (
        select sno,sname
        from student
        where dept=@dept
    )
select * from getinfo('计算机系')

3.2 内嵌表值函数的调用

  • 内嵌表值函数只能通过select语句调用
  • select * from 函数名(实参)内嵌表值函数调用时,可以仅使用函数名。
/*创建内嵌表值函数Course_Student完成以下功能:
(1)查询student表中选修了某门课程(课程号)的所有学生的信息。
(2)调用上述函数,输出选修“c4”课程的所有学生的信息。*/
create function course_student1(@cno char(8))
returns table
as
  return 
        select * from student
        where sno in(select sno from sc
                     where cno=@cno)
select * from course_student1('c4')

create function course_student(@cno char(8))
returns table
as
  return 
        select student.* from student,sc
        where student.sno=sc.sno
              and cno=@cno
select * from course_student('c4')

3.3 多语句表值函数的定义
语法格式:

  • create function (架构名.) 函数名⟶ \longrightarrow⟶ 定义函数名部分

  • ( @参数名 as 数据类型 (=default) ) (n)) ⟶ \longrightarrow⟶形参定义部分

  • returns @return_variable table ⟶ \longrightarrow⟶返回值为表类型

  • (列名 数据类型 列选项(n) ) ⟶ \longrightarrow⟶定义表的内容

  • as

  • begin

  • insert @return_variable
    函数体 ⟶ \longrightarrow⟶ 定义函数体

  • return

  • end

3.4 多语句表值函数的调用。
多语句表值函数的调用与内嵌表值函数的调用方法相同。

select * from 函数名(实参)

/*在数据库中创建返回表的多语句表值函数,完成以下功能:
(1)显示某个学生的学号,姓名及其选修课程的名称,学分和成绩。
(2)通过以学号“05880103”作为实参,调用该函数输出*/
create function score_table(@sno char(8))
returns @score table
(
 s_sno char(8),
 s_sname char(20),
 c_cname char(20),
 c_grade int,
 c_credit int)
as
 begin 
     insert @score
         select student.sno,sname,cname,grade,credit
         from student,course,sc
         where student.sno=sc.sno and course.cno=sc.cno
               and student.sno=@sno
         return
end

4.内嵌表值函数和多语句表值函数不同之处

  • 内嵌表值函数没有函数主体,返回的表是单个SELECT语句的结果集;
  • 而多语句表值函数在begin⋯ \cdots⋯end块中定义的函数主体包含T-SQL语句,这些语句可生成行并将行插入到表中,最后返回表。

5形式参数为空的函数定义和调用

/*使用多语句表值函数返回“计算机系”和“信息系”学生的学号、姓名和院系。*/
create function dept_table()
returns @dept table
(
  s_sno char(8),
  s_sname char(20),
  d_dept varchar(15)
)
as
begin
   insert @dept
     select sno,sname,dept
     from student
     where dept='计算机系' or dept='信息系'
  return
end
select * from dept_table()
/*内嵌表值函数:*/
create function dept_table1()
returns table
as
return
    select sno,sname,dept
     from student
     where dept='计算机系' or dept='信息系'  
select * from dept_table1()

6.用户定义函数的删除
使用界面方式定义与修改用户自定义函数。

对于一个已创建的用户定义函数,可有2种方法删除:

  • 通过对象资源管理器删除,此方法非常简单。

  • 利用T-SQL语句drop function删除,语法格式:
    drop function (架构名.) 函数名(n))

五、存储过程和触发器

  • 存储过程和触发器都是SQL Server的数据库对象。
  • 存储过程由一组预先编译好的SQL语句组成。存储过程的存在独立于表,存放在服务器上,供客户端调用。
  • 触发器是一种特殊类型的存储过程,他不是由用户直接调用的,而是当用户对数据进行某种操作(包括数据的insert、update或delete操作)时自动执行。因此触发器的使用和表的更新操作紧密结合。
  • 使用触发器可以大大提高数据库应用程序的灵活性和健壮性,可以利用触发器来实现复杂的业务规则,更有效地实施数据完整性。

1.存储过程

可以接受输入参数、返回表格或标量结果和消息,调用“数据定义语言(DDL)”和“数据操作语言(DML)”语句,然后返回输出参数。

1.1存储过程的类型

  • 系统存储过程→系统存储过程是由SQL Server提供的存储过程,可以作为命令执行。
  • 扩展存储过程→扩展存储过程是指在SQL Server环境之外,使用编程语言(例如C#语言)创建的外部例程形成的动态链接库(DLL)。
  • 用户存储过程→是用户根据需要,在自己的普通数据库中创建的存储过程,用户的存储过程可以使用T−SQL语言编写。

​1.2存储过程的创建
基本语法:

  • create proc/procedure 存储过程名
  • @参数名 数据类型⟶ \longrightarrow⟶定义参数的类型
  • varying (=default) (out/out put)⟶ \longrightarrow⟶定义参数的属性
  • (with encryption)⟶ \longrightarrow⟶对语句文本加密
  • as{T-SQL语句执行的操作}⟶ \longrightarrow⟶执行的操作

说明

  • 不要以sp_为前缀创建任何存储过程。sp_前缀是SQL Server用来命名系统存储过程的,使用这样的名称可能会与以后的某些系统存储过程发生冲突。
  • varying:指定作为输出参数支持的结果集。该参数由存储过程动态构造,其内容可能发生改变,仅适用于定义cursor输出参数。
  • default: 指定存储过程输入参数的默认值,默认值必须是常量或NULL。如果定义了默认值,执行存储过程时可以不提供实参。
  • 如果希望其他用户无法查看存储过程的定义,则可以使用WITH ENCRYPTION子句创建存储过程。这样,存储过程定义将以不可读的形式存储。
  • out 或 output:指定参数为输出参数类型,用于从存储过程返回结果。

1.3存储过程的执行
通过execute或exec命令可以执行一个已定义的存储过程,exec是execute的简写。

语法格式:

  • exec

  • @return_status = 存储过程名

  • @参数名=值/变量名 output/default (n)

  • 设计简单的存储过程,不带任何参数的存储过程。

/*返回05880101号学生的成绩情况,该存储过程不使用任何参数。
存储过程定义后,执行存储过程student_info:
EXECUTE   student_info 或者Exec  student_info
*/
create procedure student_info
as
  select *
  from student
  where sno='05880101'
  /*执行存储过程student_info*/
  execute student_info
  • 使用带输入参数的存储过程
/*从学生选课数据库的三个表中查询某人指定课程的成绩和学分。(该存储过程接收与传递参数精确匹配的值)*/
create proc student_info1 @sname char(20),@cname char(20)
as
  select student.sno,sname,cname,grade,credit
  from student,course,sc
  where student.sno=sc.sno and course.cno=sc.cno
        and sname=@sname and cname=@cname
/*执行存储过程student_info1*/        
exec student_info1'周一','java'
  • 使用带输入和输出(OUTPUT)参数的存储过程。
/*创建一个存储过程do_action,根据条件处理相应数据,处理后输出相应的信息。*/
create proc do_action @flag bit,@str char(8) output
as
  if @flag=0
     begin
          update student
          set sname='qqq'
          where sno='05880105'
          set @str='修改成功'
        end
     else
         if @flag=1
              begin
                  delete from student
                  where sno='05880105'
                  set @str='删除成功'
              end
   /* 执行存储过程do_action,并查看结果*/
  declare @s_str char(8)
  exec do_action 0,@s_str output
  print @s_str 
  • 使用带有通配符参数的存储过程,实现模糊查询
/*从三个表的连接中返回指定学生、指定课程的成绩。若没有传递输入参数的值,姓名默认为“周%”,课程默认为“java”(该存储过程在参数中使用了模式匹配,如果没有提供参数,则使用预设的默认值。 )*/
create proc st_info @sname varchar(20)='周%',@cname char(20)='java'   
as
  begin
       select grade
       from student,course,sc
       where student.sno=sc.sno and course.cno=sc.cno
             and sname like @sname and cname=@cname
end  

exec st_info '张%'

  • 使用output游标参数的存储过程。output游标用于返回存储过程的局部游标。游标类型只能用于定义输出参数
/*创建一个带有OUTPUT游标参数的存储过程,在student表中声明一个scroll类型的游标并打开。*/create proc p13(@stu_cur cursor varying output)
as
  begin
       declare stu_cur1 cursor
       scroll
       for
       select * from student
       set @stu_cur=stu_cur1
       open @stu_cur
  end
/*声明一个局部游标变量,执行上述存储过程,并将执行结果中返回的游标赋值给该局部游标变量,然后通过该局部游标变量读取student中最后一行记录。 */
declare @my_cur cursor
exec p13 @my_cur output
fetch last from @my_cur
close @my_cur
deallocate @my_cur

1.4存储过程的创建与执行

使用界面方式定义与修改存储过程。对于一个已创建的存储过程,可有2种方法删除:

  • 通过对象资源管理器删除,此方法非常简单,请读者自己练习。
  • 利用T-SQL语句drop proc删除
  • 语法格式:drop proc 存储过程名

2.触发器

  • 触发器是一类特殊的存储过程,与表的关系密切,用于保护表中的数据。
  • 触发器是一个被指定关联到一个表的数据对象,触发器是不需要调用的,当对一个表的特别事件出现时,如对表执行插入、更新或删除操作时,它就会被激活。
  • 触发器代码也是由T-SQL语句组成的,因此用在存储过程中的语句也可以在触发器的定义中。

2.1触发器作用

  • 触发器的主要作用是能实现由主键和外键所不能保证的、复杂的参照完整性和数据的一致性,除此之外,触发器还有其他许多不同的功能。
  • 跟踪变化
  • 触发器可以侦测数据库内的操作,从而禁止了数据库未经许可的更新和变化,使数据库的修改、更新操作更安全,数据库运行更稳定。
    可以强化数据条件约束
  • 触发器能够实现比check语句更为复杂的约束,更适合在大型数据库管理系统中用来约束数据的完整性。(rollback回滚)
    级联和并行运行
  • 触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表的触发器中包含有对另外一个表的数据操作,如删除、更新、插入,而该操作又导致该表上的触发器被触发。
  • 由此可见,触发器可以实现高级形式的业务规则、复杂行为限制和定制记录等功能。

2.触发器的类型

  • DML触发器。当数据库中发生数据操纵语言(DML)事件时将调用(激活)DML触发器。DML事件包括对表或视图的insert语句、update语句和delete语句,因而DML触发器可分为3种类型:insert、update和delete。
  • DDL触发器。DDL触发器是SQL Server 2005新增的功能,也是由相应的事件触发,但DDL触发器触发的事件是数据定义语句(DDL)。这些语句主要是以create、alter、drop等关键字开头的语句。

2.2 创建DML触发器(编程题只出DML)
语法格式:

  • create trigger (架构名.)触发器名
  • on 表名或视图名⟶ \longrightarrow⟶指定操作对象
  • (with encryption)⟶ \longrightarrow⟶说明是否采用加密方式
  • after|instead of
  • insert|update|delete
  • as
  • begin
  • <T-SQL语句>
  • end

说明:

  • after:用于说明触发器在指定操作成功执行后触发,如after Insert表示向表中插入数据时激活触发器。
  • Instead of:指定用DML触发器中的T-SQL语句代替触发语句。
  • nsert|Update|Delete:指定激活触发器的语句类型,必须至少指定一个选项。在触发器定义中允许使用上述选项的任意顺序组合。
  • 如果触发器表存在约束,则在after触发器执行之前检查这些约束。如果违反了约束,则不执行after触发器。

2.2.1 对student表创建一个insert触发器

/*对student表创建一个insert触发器。*/
create trigger tg_insert
on student after insert
as
begin
print 'insert student...'
end
insert into student
values('05880209','刘同学','',23,'计算机系')

2.2.2 对SC表创建一个delete触发器

/*对SC表创建一个DELETE触发器。*/
create trigger tg_delete
on sc after delete
as
begin
print 'delete sc _'
end
delete from sc
where grade<70

2.2.3 对course表创建一个update触发器

/*对course表创建一个update触发器*/
create trigger tg_delete
on sc after delete
as
begin
print 'delete sc _'
end

delete from sc
where grade<70

2.3 创建DML触发器时通常使用的两个特殊表
在执行触发器时,系统创建了两个特殊的临时表inserted表和deleted表,这两个表的内容如下

  • Inserted表:当向表中插入数据时,INSERT触发器触发执行,新的记录插入到触发器表和inserted表中
  • Deleted表:用于保存已从表中删除的记录,当触发一个DELETED触发器时,被删除的记录存放到deleted表中。
  • 修改一条记录等于插入一条新记录,同时删除旧记录。当对定义了update触发器的表记录修改时,表中原记录移到deleted表中,而修改过的新记录插入到inserted表
  • 对行影响

注意:由于inserted表和deleted表都是临时表,它们在触发器执行时被创建,触发器执行完后就消失了,所以只可以在本触发器的语句中使用SELECT语句查询这两个表。

/*对student表创建一个UPDATE触发器,并输出某个学生修改前与修改后的年龄值。*/
create trigger tg_update
on student after update
as
begin
declare @name char(8),@oldage int,@newage int
select @name=sname,@oldage=age from deleted
select @newage=age from inserted
print @name
print @oldage
print @newage
end

update student
set age=20
where sno='05880102'

2.4 Update(column)函数

​ Update()函数返回一个布尔值,指示是否对表的指定列进行了insert或update操作。其中insert操作可是看做是把原来的null值修改成了新值。

​ 例:在student表中创建update和delete触发器,当修改或删除student表中的学号时,同时修改或删除sc表中的该学号。

/*在course表中创建update和delete触发器,当修改或删除course表中的课程号时,同时修改或删除sc表中的该课程号。*/
create trigger tg_course
on course after update,delete
as 
  begin
  if update(cno) 
      update sc 
      set cno=(select cno from inserted)
      where cno=(select cno from deleted)
  else 
      delete from sc
      where cno=(select cno from deleted)
   end
Delete from course
Where cname='java‘

update course 
set cno='c1new'
where cno='c1'

2.5 Instead of 触发器

  • After触发器是在触发语句执行后触发的。与after触发器不同的是,instead of 触发器触发时只执行触发器内部的SQL语句,而不执行激活该触发器的SQL语句

  • 在一个表或视图上,每个insert、update或delete语句最多可以定义一个instead of触发器。

/*创建表table_2,属性只有一个a,整数类型,在表中创建instead of insert触发器,当向表中插入记录时显示相应消息。*/
create trigger table_insert
on table_2 instead of insert
as
  begin
     print 'instead of trigger is working'
  end

2.5.1 Instead of 触发器的主要作用

是用于不可更新的视图,支持更新。如果视图不可更新,则必须使用instead of触发器支持基表中数据的插入、更新和删除操作。

  • 视图更新操作的限制

  • 如果视图是从多个基本表使用连接操作导出的,则不允许更新。

  • 如果定义视图的select语句包含group by、distinct、聚组函数(虚列),则不允许更新。

  • 如果建立视图时带with read only选项,则不能对该视图进行任何插入、更新和删除操作。

/*创建一个基于多表的视图,通过instead of触发器来实现对视图的更新操作。*/
create view stu_sc
as
  select student.sno,dept,cno,grade
  from student,sc
  where student.sno=sc.sno

insert into stu_sc
values('05880909','英语系','c2',79)

2.6 创建DDL触发器
语法格式:

  • create trigger 触发器名
  • on all server|database
  • (with encryption)
  • after event_group |event_type
  • as
  • begin
  • T-SQL语句
  • end

DDL触发要用于:防止对数据库架构进行某些修改;希望数据库中发生某些变化以利于相应数据库架构中的更改;记录数据库架构中的更改或事件。

DDL触发器只在响应由T-SQL语法所指定的DDL事件时才会触发。

all server |database:all server是指当前DDL触发器的作用于当前服务器。database指DDL触发器作用于当前数据库。

event_type: on关键字后面为database,此选项包括create_table、alter_table、drop_table、create_view等。

event_group: on关键字后面为all server,此选项包括create_database、alter_database、drop_database 等。

2.6.1 创建数据库作用域的DDL触发器

/*创建数据库作用域的DDL触发器,当删除一个表时,提示禁止该操作,然后回滚删除表的操作。*/
create trigger satety
on database after drop_table
as
  begin
       print '不能删除表'
       rollback
  end

2.6.2 创建服务器作用域的DDL触发器

/*创建服务器作用域的DDL触发器,当删除一个数据库时,提示禁止该操作并回滚删除数据库的操作。	*/
create trigger satety_server
on all server after drop_database
as
  begin
       print '不能删除该数据库'
       rollback
  end

2.6.3 删除触发器

  • 使用界面方式可以定义、修改、查看和删除DML触发器,但是对于DDL触发器,则只能查看和删除。
  • 触发器本身是存在表中的,因此,当表被删除时,表中的触发器也将被删除。删除触发器使用drop trigger语句。
  • 语法格式:
    drop trigger 架构名.触发器名⟶删除DML触发器
    drop trigger 触发器名 on all server |database⟶ 删除DDL触发器

注意:
如果是删除DDL触发器,则要使用on关键字指定在数据库作域还是服务器作用域。
事件时才会触发。

all server |database:all server是指当前DDL触发器的作用于当前服务器。database指DDL触发器作用于当前数据库。

event_type: on关键字后面为database,此选项包括create_table、alter_table、drop_table、create_view等。

event_group: on关键字后面为all server,此选项包括create_database、alter_database、drop_database 等。

2.6.1 创建数据库作用域的DDL触发器

/*创建数据库作用域的DDL触发器,当删除一个表时,提示禁止该操作,然后回滚删除表的操作。*/
create trigger satety
on database after drop_table
as
  begin
       print '不能删除表'
       rollback
  end

2.6.2 创建服务器作用域的DDL触发器

/*创建服务器作用域的DDL触发器,当删除一个数据库时,提示禁止该操作并回滚删除数据库的操作。	*/
create trigger satety_server
on all server after drop_database
as
  begin
       print '不能删除该数据库'
       rollback
  end

2.6.3 删除触发器

  • 使用界面方式可以定义、修改、查看和删除DML触发器,但是对于DDL触发器,则只能查看和删除。
  • 触发器本身是存在表中的,因此,当表被删除时,表中的触发器也将被删除。删除触发器使用drop trigger语句。
  • 语法格式:
    drop trigger 架构名.触发器名⟶ 删除DML触发器
    drop trigger 触发器名 on all server |database⟶ 删除DDL触发器

注意:
如果是删除DDL触发器,则要使用on关键字指定在数据库作域还是服务器作用域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实例一:MATLAB APP design- 简单的函数表达式运算(Y=X1^3+X2^2+X3)

一、APP 界面设计展示注&#xff1a;在自变量框输入自变量&#xff0c;点击计算按钮&#xff0c;结果就会显示在因变量输出框。二、APP设计界面运行结果展示该APP界面设计包括表达式运算显示框&#xff0c;自变量输入框&#xff0c;计算按钮&#xff0c;因变量输出框。注&#…

正大数据抢先看 祝各位情人节快乐

美国1月消费者物价指数 (CPI)周二 21:30&#xff0c;估6.2%&#xff0c;前值 6.5%。 周三12:00达拉斯FED总裁、03:00纽约FED总裁发表演说、和欧洲 央行 (ECB)总裁拉加德22:00演说。 日本政府预定周二向国会提出日本银行 (央行&#xff0c;BOJ) 总裁黑田东彦的继任人选。 市场高…

【服务器数据恢复】Hyper-V虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; WinServer操作系统服务器&#xff0c;部署Hyper-V虚拟机环境&#xff1b; 虚拟机的硬盘文件和配置文件存储在一台存储设备中&#xff1b; 该存储设备配置&#xff1a;一组4盘raid5阵列存放虚拟机数据单块盘存放虚拟机数据备份。 服务器故障&am…

附录1-pytorch目标检测

源码来自作者Bubbliiiing&#xff0c;我对参考链接的代码略有修改&#xff0c;网盘地址 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;bfvs 目录 1 参考 2 环境 3 数据集准备 3.1 VOCdevkit/VOC2007 3.2 model_data/voc_classes.txt 3.3 voc_annota…

【Java|多线程与高并发】进程与线程的区别与联系

文章目录什么是进程什么是线程上下文切换多线程一定比串行执行快吗进程与线程的区别与联系什么是进程 进程的定义:进程是正在运行的程序实体&#xff0c;并且包括这个运行的程序中占据的所有系统资源&#xff0c;比如说CPU&#xff08;寄存器&#xff09;&#xff0c;IO,内存&a…

自学前端最容易犯的10个的错误,入门学前端快来看看

在前端学习过程中&#xff0c;有很多常见的误区&#xff0c;包括过度关注框架和库、缺乏实践、忽视算法和数据结构、忽视浏览器兼容性、缺乏团队合作经验、忽视可访问性、重构次数过多、没有关注性能、缺乏设计知识以及没有持续学习等。要避免这些误区&#xff0c;应该注重基础…

Lambda表达式详细操作

一、基础语法 形态一&#xff1a;匿名内部类 Runnable runnable new Runnable() {Overridepublic void run() {System.out.println(Thread.currentThread().getName());} };runnable.run();形态二&#xff1a;完整的Lambda表达式 口诀&#xff1a;复制小括号&#xff0c;写…

消息中间件----内存数据库 Redis7(第1章 Redis 概述)

第1章 Redis 概述1.1 Redis 简介Redis&#xff0c;Remote Dictionary Server&#xff0c;远程字典服务&#xff0c;由意大利人 Salvatore Sanfilippo&#xff08;又名Antirez&#xff09;开发&#xff0c;是一个使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、…

【路径规划】基于Dijkstra算法及Floyd算法的通信与网络路径规划(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Dubbo相关问题合集

Dubbo相关问题合集 java.io.StreamCorruptedException: invalid stream header: 77D30000 ; Decode rpc invocation failed 现象 2023-02-14 09:49:32.251 [NettyServerWorker-4-2] [] [WARN] o.a.d.r.exchange.codec.ExchangeCodec-130 [DUBBO] Skip input stream 634, du…

go gin学习记录2

环境 环境&#xff1a;mac m1&#xff0c;go version 1.17.2&#xff0c; goland&#xff0c; mysql 昨天学习了安装和基本的参数&#xff0c;路由使用&#xff0c;今天接着学习一下数据库的操作。 建立数据库 测试数据库操作&#xff0c;需要先准备一个测试用的数据库&…

【自适应软件开发过程思想】自适应软件开发 - 简介 Adaptive Software Development Introduction(中英文)

目录 ASWD 核心思想 什么是敏捷(Agile)? 敏捷宣言(Agile Manifesto) 敏捷的特征

微前端指北

微前端概述 Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently. – Micro Frontends 什么是微前端 微前端是一种类似于微服务的架构&#xff0c;它将微服务的理念应用于浏览器端&#xff0c;即将 …

GAN和CycleGAN

文章目录1. GAN 《Generative Adversarial Nets》1.1 相关概念1.2 公式理解1.3 图片理解1.4 熵、交叉熵、KL散度、JS散度1.5 其他相关&#xff08;正在补充&#xff01;&#xff09;2. Cycle GAN 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Ne…

Spring事务Spring整合MyBatis

Spring整合MyBatis 在整合之前需要保证mybatis、springframework、mybatis-spring、spring-jdbc的包都已经导入 并且要根据官网提示保证mybatis、springframework、mybatis-spring版本相对应&#xff0c;否则会产生冲突报错 maven依赖如下&#xff1a; <!-- Spring Web…

SAS应用入门学习笔记6

SQL (SAS): Features&#xff1a; 1&#xff09;不需要在每个query中重复调用每个SQL&#xff1b; 2&#xff09;每个statement都是独立去完成的&#xff1b; 3&#xff09;我们是没有proc print和proc sort语句的&#xff1b;&#xff08;order by&#xff09; key synta…

vue3的shallowReactive和shallowRef,readonly和shallowReadonly

shallowReactive&#xff1a;只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09; <template><span>姓名&#xff1a;{{name}}</span><span>年龄&#xff1a;{{age}}</span><span>职业&#xff1a;{{salary.job.num}}</spa…

JAVA SE复习(第5章 面向对象(上))

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用5.1 面向对象编程5.1.2 类和对象1、什么是类类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。属性&#xff1a;就是该事物的状态信息。行为&#xff1a;就是在你这个程序中&am…

springboot集成kafka

选择特定版本spring-kafka官方使用文档 进入官网&#xff1a;https://spring.io/ 选择自己使用版本 点进去后按照 /2.7.0/reference/html/ 路径点进去就能看到想要版本的文档了

C++实现线程池

C实现线程池一、前言二、线程池的接口设计2.1、类封装2.2、线程池的初始化2.3、线程池的启动2.4、线程池的停止2.5、线程的执行函数run()2.6、任务的运行函数2.7、等待所有线程结束三、测试线程池四、源码地址总结一、前言 C实现的线程池&#xff0c;可能涉及以下知识点&#…