(笔记)第7章 SQL Server 2012高级应用

第七章 SQL Server 2012高级应用(T-SQL)

本人所发此系列皆为不收费的个人笔记,若读者在别的地方发现有同样的文章进行敛财收费的行为,勿信

7.1 Transact-SQL程序设计

T-SQL的主要用途是设计服务器端能够在后台执行的程序块,如存储过程、触发器等

7.1.1 变量

  1. 全局变量

    • 全局变量格式:以@@开头

    • 特点:全局变量不由用户的程序定义的,而是由系统定义和维护的,且是只读的

      全局变量名称 功能
      @@connections 服务器启动以来已经创建的连接数
      @@ERROR 最后一个T-SQL错误的错误号
      @@IDENITY 最后一次插入的标识符
      @@SERVERNAME 本机服务器名称
      @@ROWCOUNT 上一个执行SQL语句映像的行数
  2. 局部变量

    • 声明方式:DECLARE @变量名 变量类型[, @变量名 变量类型…]
    • 作用域:仅在声明的批处理、存储过程和触发器中
    • 赋值方式:
      • select @变量名1=变量值1,@变量名2=变量值2…
      • set @变量名=变量值,set @变量名2=变量值
      • 注意要对多个变量赋值时两种方式的区别,select出现一次即可,而set需要出现多次
  3. 注释符:-- 单行注释;/**/多行注释;

7.1.2 运算符

  1. 算术运算符

    运算符 含 义
    +
    -
    *
    /
    % 求余数
  2. 赋值运算符:等号(=)是唯一的Transact-SQL赋值运算符

  3. 字符串连接运算符:加号(+)

  4. 比较运算符

    运算符 含 义
    = 等于
    > 大于
    < 小于
    >= 大于或等于
    <= 小于或等于
    <> 不等于
    != 不等于(非SQL-92标准)
    !< 不小于(非SQL-92标准)
    !> 不大于(非SQL-92标准)
  5. 逻辑运算符

    运算符 含 义
    ALL 如果一组比较中都为TRUE,运算结果就为TRUE
    AND 如果两个表达式都为TRUE,运算结果就为TRUE
    ANY 如果一组的比较中任何一个为TRUE,运算结果就为TRUE
    BETWEEN 如果操作数在某个范围内,运算结果就为TRUE
    EXISTS 如果子查询包含一些行,运算结果就为TRUE
    IN 如果操作数等于表达式列表中的一个,运算结果就为TRUE
    LIKE 如果操作数与一种模式相匹配,运算结果就为TRUE
    NOT 对逻辑值取反,即如果操作数的值为TRUE,运算结果就为FALSE,否则为TRUE
    OR 如果两个布尔表达式的一个为TRUE,运算结果就为TRUE
    SOME 如果一系列操作数中有些值为TRUE,运算结果就为TRUE
  6. 按位运算符

    运算符 含 义 运算规则
    & 按位与 两个数对应的二进制位上都为1时,该位上的运算结果为1,否则为0
    | 按位或 两个数对应的二进制位上有一个为1是,该位上的运算结果为1,否则为0
    ^ 按位异或 两个数对应的二进制位上不同时,该位上的运算结果为1,否则为0
  7. 一元运算符

    运算符 含 义
    + 正号,数值为正
    - 负号,数值为负
    ~ 按位取反
  8. 运算符优先级和结合性

    优先级
    (从高到低)
    运算符 说明
    1 () 小括号
    2 +、-、~ 正、负、按位取反
    3 *、/、% 乘、除、求余数
    4 +、-、+ 加、减、字符串连接
    5 =、>、<、>=、<=、<>、!=、!>、!< 各种比较运算符
    6 ^、&、| 位运算符
    7 NOT 逻辑非
    8 AND 逻辑与
    9 ALL、ANY、BETWEEN、IN、LIKE、OR、SOME 逻辑运算符
    10 = 赋值运算符

7.1.3 批处理

  1. 批处理:是包含一个或多个T-SQL语句的组,批处理的所有语句被整合成一个执行计划。所有语句要么一起通过解析,要么没有一句能够执行
  2. 格式:Go … GO;两个GO之间的SQL语句就是一个批处理单元

7.1.4 流程控制语句

  1. BEGIN……END:类似一个函数的大括号,意思是设定一个程序块,将在BEGIN……END内的所有程序视为一个单元执行

  2. IF……ELSE

    IF <条件表达式>
       <命令行或程序块>
    [ELSE
       <命令行或程序块>]
    
    • 如果不使用程序块,IF和ELSE只能执行一条语句
    • 在T-SQL中IF…ELSE最多嵌套32层
  3. IF [NOT] EXISTS

    IF [NOT] EXISTS (SELECT 子查询)
       <命令行或程序块>
    [ELSE
       <命令行或程序块>]
    
    • IF EXISTS语句用来检测数据(子查询内结果)是否存在
  4. CASE

    格式1:
    CASE <表达式>
       WHEN <表达式> THEN <表达式>
       ……
       WHEN <表达式> THEN <表达式>
       [ELSE <表达式>]
    END
    
    例:
    GO
    SELECT SNo,
        SEX=
        CASE SEX
           WHEN '男' THEN 'M'
           WHEN '女' THEN 'F'
        END
    FROM S
    GO
    
    格式2:
    CASE
       WHEN <表达式> THEN <表达式>
       ……
       WHEN <表达式> THEN <表达式>
       [ELSE <表达式>]
    END
    
    例:
    GO
    SELECT SNo,CNo,Score=
        CASE
           WHEN Score IS NULL THEN '未考'
           WHEN Score < 60 THEN '不及格'
        END
    FROM S
    GO
    
    
    • 当CASE语句中不包含ELSE子句时,如果所有比较都失败,CASE将返回NULL
    • CASE命令可以嵌套到SQL命令中
  5. WHILE…CONTINUE…BREAK

       WHILE <条件表达式>
       BEGIN
          <命令行或程序块>
          [BREAK]
          [CONTINUE]
          [命令行或程序块]
       END
    
    • 标准的循环结构,与程序设计语言规则一样
  6. WAITFOR

    WAITFOR {DELAY <'时间'> | TIME <'时间'> | ERROREXIT | PROCESSEXIT | MIRROREXIT}
    
    • WAITFOR命令用来暂时停止程序执行,直到所设定的等待时间已过或所设定的时间已到才继续往下执行。其中“时间”必须为DATETIME类型的数据,但不能包括日期
    • DELAY:设定等待时间,最多24小时
    • TIME:设定等待结束的时间点
    • ERROREXIT:直到处理非正常终端
    • PROCESSEXIT:直到处理正常或非正常中断
    • MIRROREXIT:知道镜像设备失败
  7. GOTO

    GOTO 标识符
    
    例:
    DECLARE @s SMALLINT,@i SMALLINT
    SET @i=1
    SET @s=0
    BEG:
    IF (@i<=10)
    BEGIN
       SET @s=@s+@i
       Set @i=@i+1
       GOTO BEG      /*使程序跳转到标号为BEG的地方执行*/
    END
    PRINT @s
    
  8. RETURN

    RETURN ([整数值])
    
    • RETURN语句用于使程序从一个查询、存储过程或批处理中无条件返回,其后面的语句不在执行。若括号内没有指定整数值,默认返回0
    返回值 含义
    0 程序执行成功
    -1 找不到对象
    -2 数据类型错误
    -3 死锁错误
    -4 违反权限原则
    -5 语法错误
    -6 用户造成的一般错误
    -7 资源错误
    -8 非致命的内部错误
    -9 达到系统配置参数极限
    -10 内部一致性致命错误
    -11 内部一致性致命错误
    -12 表或索引崩坏
    -13 数据库破坏
    -14 硬件错误

7.1.5 常用命令

  1. BACKUP:将数据库内容和事务处理日志备份到存储介质上

  2. CHECKPOINT:用于将当前工作的数据库中被更改过的数据页或日志页从缓冲区中强制写入硬盘。格式如CHECKPOINT [checkpoint_duration]

    • checkpoint_duration是个int类型整数且必须大于0,单位是秒,若省略该参数,将自动调整检查点持续时间
  3. DBCC:(Database Consistency Checker)数据库一致性检查程序,用于验证数据库完整性、查找错误、分析系统使用情况等

  4. DECLARE:用于声明局部变量、游标变量或表变量

    • 格式:DECLARE {{ @local_variable data_type } | { @cursor_variable_name CURSOR } | { table_type_definition } }[, …n]
    • 在用DECLARE声明之后,所有变量都被赋予NULL
    • 不能声明TEXT、NTEXT、IMAGE类型
    • 如果变量为字符型,应该指明其最大长度,否则系统默认长度为1
  5. EXECUTE:用来执行存储过程,可用缩写EXEC

  6. KILL:终止某一过程的执行

  7. PRINT:向客户端返回一个用户自定义的信息,如字符串、局部变量、全局变量等

    • 格式:PRINT ‘any ASCII text’ | @local_variable | @@FUNCTION | string_expression
    • 如果变量值不是字符串的话,必须向用数据转换类型转换函数CONVERT()将其转换为字符串
    • 表达式长度可以超过8000个字符,但超过8000的字符将不会显示
  8. RAISERROR:在SQL Server系统返回错误信息是,同时返回用户指定的信息

  9. RESTORE:将数据库或其事务处理日志备份文件由存储介质存储到SQL Server系统中

  10. SELECT:给局部变量赋值

    • 格式:SELECT {@local_variable = expression } [, …n]
    • SELECT 命令可以给多个局部变量赋值。
    • 如果expression为列名,变量中保存的是其返回的最后一个值
    • 如果SELECT没有返回值,则变量名仍为原来的值
    • 如果expression是一个子查询,如果子查询没有返回值,则变量被设为NULL
  11. SET

    用法一:用于给局部变量赋值
    SET { { @local_variable cursor_name } | { @cursor_variable =
       { @cursor_variable1 cursor_name | 
          { CURSOR [FORWARD_ONLY |SCROLL]
             [STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
             [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
             [TYPE_WARNING]
             FOR select_statement
             [FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
          }
       }
    } }
    
    用法二:用于用户执行SQL命令时,SQL Server处理选项的设定
    SET:选项ON
    SET:选项OFF
    SET:选项值
    
    • 与SELECT不同,SET只能给一个变量赋值
  12. SHUTDOWN:用于停止SQL Server的执行

    • 当使用NOWAIT参数时,使用SHUTDOWN命令立即停止SQL Server,并终止所有用户过程并对每一个现行的事务发生一个回滚后,退出SQL Server
  13. USE:指定当前使用的数据库

7.1.6 常用函数

  1. 统计函数

    1. STDEV(expression):返回表达式中所有数据的标准差。
      • 表达式通常为表中某一数据类型为NUMERIC的列,或近似NUMERIC类型的列,如MONEY类型,但BIT除外。表达式中NULL值江北忽略,其返回值为FLOAT类型
    2. STDEVP(expression):返回表达式中所有数据的总体标准差。返回值为FLOAT类型
    3. VAR(expression):返回表达式中所有数据的统计变异数。返回值为FLOAT类型
    4. VARP(expression):返回表达式中所有数据的总体变异数。返回值为FLOAT类型
  2. 算术函数

    函数类别 函数名 功能 示例
    三角函数 SIN(表达式)
    COS(表达式)
    TAN(表达式)
    COT(表达式)
    返回以弧度表示的表达式的正弦
    返回以弧度表示的表达式的余弦
    返回以弧度表示的表达式的正切
    返回以弧度表示的表达式的余弦
    SIN(0)的值为0
    COS(0)的值为1
    TAN(3.14159/4)的值为0.999998
    SELECT COT(1) 的值为0.642092
    反三角函数 ASIN(表达式)
    ACOS(表达式)
    ATAN(表达式)
    返回以表达式的值为正弦值的角(弧度)
    返回以表达式的值为余弦值的角(弧度)
    返回以表达式的值为正切值的角(弧度)
    ASIN(0)的值为0
    ACON(1)的值为0
    ATAN(0)的值为0
    角度弧度转换 DEGREES(表达式)
    RADIANS(表达式)
    把弧度转换为角度
    把角度转换为弧度
    DEGREES(1)的值为57
    RADIANS(90.0)的值为1.570796
    指数函数 EXP(表达式) 返回以e为底、以表达式为指数的幂值 EXP(1)的值为2.718282
    对数函数 LOG(表达式)
    LOG10(表达式)
    返回表达式的以e为底的自然对数值
    返回表达式的以10为底的自然对数值
    LOG(1)的值为0
    LOG10(10)的值为1
    平方根函数 SQRT(表达式) 返回表达式的平方根 SQRT(1)的值为1
    取近似值函数 CEILING(表达式)
    FLOOR(表达式)
    ROUND(表达式,n)
    返回大于等于表达式的最小整数
    返回小于等于表达式的最大整数
    将表达式四舍五入为指定的精度n
    CEILING(-5.6)的值为-5
    FLOOR(-5.2)的值为-6
    ROUND(5.6782,2)的值为5.6800
    符号函数 ABS(表达式)
    SIGN(表达式)
    返回表达式的绝对值
    测试表达式的正负号,返回0、1、-1
    ABS(-3.4)的值为3.4
    SIGN(-3.4)的值为-1
    其他函数 PI()
    RAND
    返回值为π
    返回0~1之间的随机浮点数
  3. 字符串函数

    1. 字符串转换函数
      • ASCII(character_expression):返回字符表达式最左端的ASCII码值
      • CHAR(integer_expression):将ASCII码转换为对应的字符,弱超出0~255的整数值则返回NULL
      • LOWER(character_expression):把字符串转换为小写,非字母的保持不变
      • UPPER(characrer_expression):把字符串转换为大写,非字母的保持不变
      • STR(float_expression [, length[ , ] ] ):把数值型数据转换为字符型数据,默认length值为10,decimal值为0 。如果小数点钱的位数超过了指定长度,则返回指定长度的’*’
    2. 去空格函数
      • LTRIM(character_expression):把字符串头部的空格去掉
      • RTRIM(charater_expression):把字符串尾部的空格去掉
    3. 取子串函数
      • LEFT(character_expression , integer_expression):返回部分字符串,从字符串最左边到底integer_expression个字符的部分。若integer_expression为负值,返回NULL
      • RIGHT(character_expression, integer_expression):函数返回部分字符串,从字符串右边第integer_expression个字符到最后一个字符的部分
      • SUBSTRING(expression, starting_position, length):返回部分字符串,从字符串左边第starting_position个字符到length个字符的部分。表达式可为字符串或二进制串货含字段名的表达式。SUBSTRING函数不能用于TEXT和IMAGE数据类型
    4. 字符串比较函数
      • CHARINDEX(substring_expression, expression):返回字符串中某个指定的子串出现的开始位置,若没发现子串返回0。此函数不能用于TEXT和IMAGE数据类型
      • PATINDEX(’%substring_expression%’, expression):返回字符串中某个指定子串出现的开始位置,子串前后必须有百分号,否则返回0。与CHARINDEX函数不同的是PATINDEX函数的子串可以使用通配符,且词函数可用于CHAR、VARCHAR和TEXT数据类型
    5. 字符串操作函数
      • QUOTENAME(character_expression [, quote_character]):返回被特定字符括起来的字符串,如“ ’ ”、“ 、 ”、“ ( ”、“ [ ”等,默认值为“ [ ”。
      • REPLICATE(character_expression, integer_expression):返回一个重复指定次数的由character_expression指定的字符串。如果integer_expression为负数,则返回NULL值
      • REVERSE(character_expression):指定的字符串的字符排列顺序颠倒。
      • REPLACE(string_expression1, string_expression2,string_expression3):用3替换1中的子串2。
      • SPACE(integer_expression):返回一个由参数integer_expression所指定长度的空格字符串。若参数为负值,则返回NULL串
      • STUFF(character_expression1, start_position, length, character_expression2):用另一个子串替换字符串中指定位置长度的子串。1为源串,start为替换的起始位置,length为被替换的字符串长度,2为目标字符串。
  4. 数据类型转换函数

    1. CAST( AS <data_type>[ length ]):将表达式转换类型
    2. CONVERT(<data_type>[ (length)], [, style]):data_type为系统定义的数据类型,length指定数据长度,默认为30;style将DATATIME和SMALLDATETIME数据转换为字符串时所选用的格式。
  5. 日期函数

    1. DAY(<date_expression>):返回表达式中的日期值
    2. MONTH(<date_expression>):返回表达式中的月份值
    3. YEAR(<date_expression>):返回表达式中的年份值
    4. DATEADD(, , ):返回指定日期date加上指定额外日期间隔number产生的新日期。
    5. DATEDIFF(, , ):返回两个指定日期在datepart方面的差距值。
    6. DATENAME(, ):以字符串形式返回日期的指定部分。
    7. DATEPART(, ):以整数值返回日期的指定部分
    8. GETDATE():以DATETIME的默认格式返回系统当前的日期和时间,常作为其他函数的参数或命令的参数使用
  6. 用户自定义函数

使用T-SQL命令来操作自定义函数:创建(CREATE FUNCTION)、修改(ALTER FUNCTION)和删除(DROP FUNCTION)。根据返回值类型分为标量值函数(数值函数)和表值函数(内联表值函数和多语句表值函数)。数值函数返回单个数据值,表值函数返回结果集(table数据类型)

  1. 创建标量值函数
CREATE FUNCTION function_name
([ { @parameter_name [AS] parameter_data_type [= default] [ READONLY ] }
 [ ,...n]
])
RETURNS return_data_type
[ WITH ENCRYPTION ]
[ AS ]
BEGIN
function_body
Return scalar_expression
END

例:判断一个素是否为素数
CREATE FUNCTION dbo.Fun1(@n AS INT)
RETURNS INT
AS
BEGIN
   DECLARE @i INT
   DECLARE @sign INT
   SET @sign=1
   SET @i=2
   WHILE @i<=SQRT(@n)
      BEGIN
         IF @n % @i=0
            BEGIN
               SET @sign=0
               BREAK
            END
         SET @i=@i+1
      END
   RETURN @sign
END
可以执行命令SELECT dbo.FUN1(13)调用函数

7.2 存储过程

7.2.1 存储过程的概念、优点及分类

  1. 存储过程的产生原因(造成T-SQL语句执行效率低下的原因):
    1. 应用程序中存储T-SQL语句,SQL server服务器被动执行T-SQL语句,每次都进行编译,然后执行
    2. 应用程序执行T-SQL语句只能是逐句执行,有较复杂的T-SQL程序时网络上会产生大量的流量
  2. 存储过程的概念:存储过程(Stored Procedure),是村粗在SQL Server数据库中的一种编译对象。它是一组SQL语句集,经编译后存储在数据库中
  3. 存储过程的优点:
    1. 模块化的程序设计
    2. 高效率的执行
    3. 减少网络流量
    4. 可以作为安全机制使用
  4. 存储过程的分类
    1. 系统存储过程:主要存储在master数据库并以sp_为命名前缀
    2. 用户自定义存储过程
    3. 扩展存储过程:主要以xp_为命名前缀

7.2.2 创建存储过程

创建存储过程需要确定三个组成部分

(1)所有输入参数、传给调用者的输出参数

(2)被执行的针对数据库的操作语句,包括调用其他存储过程的语句

(3)返回的状态值、指明调用成功还是失败

  1. 用CREATE PROCEDURE命令创建存储过程

    注意以下几个问题!

    (1)在一个批处理中,CREATE PROCEDURE语句不能和其他SQL语句合并在一起

    (2)数据库所有者具有默认的创建存储过程的权限,他可以把权限传递给其他用户

    (3)存储过程作为数据库对象,命名需符合标识符命名规则

    (4)只能在当前数据库中创建属于当前数据库的存储过程

CREATE PROCEDURE procedure_name [ ; number]
  [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
  ] [, ...n]
[ WITH 
  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [, ...n]

参数含义:
procedure_name:是要创建的存储过程的名字
@parameter:是存储过程的参数
data_type:是参数的数据类型
VARYING:指定由OUTPUT参数支持的结果集,仅应用于游标型参数
default:参数的默认值
OUTPUT:表面该参数是一个返回参数
RECOMPILE:指明SQL Server并不保存该存储过程的执行计划,该存储过程每执行一次偶要重新编译
ENCRYPTION:表面SQL Server加密了syscomments表。使用该关键字无法通过查看syscomments表来查看存储过程内容
FOR REPLICATION:指明为复制创建的存储过程不能再订阅服务器上执行,只有在创建过滤存储过程时,
                才使用该选项。与WITH RECOMPILE选项互不兼容
AS:指明该存储过程将要执行的动作

一个存储过程的最大尺寸为128MB,用户定义的存储过程必须创建在当前数据库中

例子1,没有参数的存储过程:
GO
CREATE PROCEDURE MyProc AS 
SELECT * FROM S WHERE Sex='男'

例子2,有参数的存储过程:
GO
CREATE PROCEDURE InsertRecord
(
  @sno VARCHAR(6),
  @sn NVARCHAR(10),
  @sex NCHAR(1),
  @age INT,
  @dept NVARCHAR(20)
)
AS
INSERT INTO S VALUES(@sno,@sn,@sex,@age,@dept)

例子3,具有参数默认值的存储过程:
GO
CREATE PROCEDURE InsertRecordDefa
(
  @sno VARCHAR(6),
  @sn NVARCHAR(10),
  @sex NCHAR(1),
  @age INT,
  @dept NVARCHAR(20)='无'
)
AS
INSERT INTO S VALUES(@sno,@sn,@sex,@age,@dept)

例子4:定义能够返回值的存储过程:
GO
CREATE PROCEDURE QueryTeach
(
  @sno VARCHAR(6),
  @sn NVARCHAR(10) OUTPUT,
  @dept NVARCHAR(20) OUTPUT
)
AS
SELECT @Sn=SN,@dept=Dept FROM S WHERE SNo=@sno

7.2.3 查看存储过程

  1. 利用系统存储过程sp_helptext查看存储过程
EXEC sp_helptext 存储过程名称

7.2.5 删除存储过程

  1. 利用DROP PROCEDURE命令删除存储过程
DROP PROCEDURE 存储过程名1,存储过程名2...

7.2.6 执行存储过程

EXECUTE {
    [@return_status=]
    {procedure_name[;number] | @produre_name_var}
    [[@parameter=] {value | @variable [OUTPUT} | [DEFAULT]}][,...n]
    [WITH RECOMPILE]
}

@return_status是可选的整型变量,用来保存存储过程向调用者返回的值。
@procedure_name_var是一变量名,用来代表存储过程的名字

7.2.7 修改存储过程

  1. 利用ALTER PROCEDURE命令修改存储过程
/*与创建存储过程一样,只需把CREATE改成ALTER即可*/
ALTER PROCEDURE procedure_name [ ; number]
  [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
  ] [, ...n]
[ WITH 
  { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [, ...n]

7.3 触发器

7.3.1 触发器概述

  1. 触发器概念:触发器是特殊的存储过程,它与存储过程的区别是,能够自动执行并且不含有参数
  2. 优点:
    1. 触发器是在某个事件发生后自动激活而执行的。
    2. 触发器可以实现比约束更为复杂的完整性要求。
    3. 触发器可以防止恶意的或错误的INSERT、UPDATE和DELETE操作
  3. 触发器种类
    1. DML触发器:对增删改事件而激活自动执行的触发器
      • After触发器:事件执行后触发
      • Instead of触发器:事件执行前触发
    2. DDL触发器:各种DDL数据定义语言事件执行的存储过程
    3. 登陆触发器:登陆事件触发

7.3.2 触发器工作原理

  1. SQL Server为每个触发器创建了两个特殊的表:插入表(Inserted表)和删除表(Deleted表)
    • 这两个表示系统在线生成的、动态驻留在内存中的临时表,触发器工作完成后系统自动删除这两个表
    • 是由系统管理的逻辑表,不允许用户直接对其修改
    • 这两个表的结构总是与被该触发器作用的表的结构相同
对表的操作 Inserted表 Deleted表
增加记录(INSERT) 存放增加的记录
删除记录(DELETE) 存放被删除的记录
修改记录(UPDATE) 存放更新后的记录 存放更新前的记录
  1. INSERT触发器的工作原理
graph TD
A[监视INSERT]-->B[将数据插入表中]
B-->C[生成Inserted表]
C-->D[执行触发器中语句]
  1. DELETE触发器的工作原理
graph TD
A[监视DELETE]-->B[删除表中的内容]
B-->C[生成Deleted表]
C-->D[执行触发器中语句]
  1. INSERT触发器的工作原理
graph TD
A[监视UPDATE]-->B[删除表中内容]
B-->C[生成Deleted表]
C-->D[向表中插入内容]
D-->E[生成Inserted表]
E-->F[执行触发器中语句]

7.3.3 创建触发器

  1. 创建DML触发器
使用CREATE TRIGGER创建DML触发器

CREATE TRIGGER trigger_name
ON {table | view}
[With Encryption]
{For | After | Instead OF}
{ [INSERT] [,] [UPDATE] [,] [DELETE] }
AS sql_statement [;]

参数说明
trigger_name:触发器名称,不能以#或##开头,要符合命名规则
table | view:对其执行触发器的表或视图,
   视图上不能定义FOR和AFTER触发器,只能定义INSTEAD OF触发器
WITH ENCRYPTION:指定对触发器进行加密处理
FOR | AFTER:指定触发器中在对应的DML操作成功执行后才触发
Instead Of:指定执行DML触发器而不是INSERT、UPDATE、DELETE语句。
   在使用了With Check Option语句的视图上不能定义Instead of触发器
[INSERT][,][UPDATE][,][DELETE]:指定能够激活触发器的操作
   必须至少指定一个操作
sql_statement:触发器代码,根据数据修改或定义语句来检查或更改数据,
   通常包含流程控制语句,一般不应向应用程序返回结果
  1. 创建DDL触发器
CREATE TRIGGER trigger_name
ON {ALL Server | Database}
[With Encryption]
{For | After} {event_type | enent_group} [,...n]
AS sql_statement [;]

参数说明
trigger_name:触发器名称,要符合命名规则
ALL Server:指定DDL触发器的作用域为当前服务器。
   指定此参数,只要服务器中任何位置出现event_type或event_group
   就会激活触发器
DATABASE:指定DDL触发器的作用域为当前数据库。
WITH ENCRYPTION:指定对触发器进行加密处理
FOR | AFTER:指定DDL触发器仅在触发SQL语句中指定的所有操作
   都已成功执行时才被触发
event_type:将激活DDL触发器的T-SQL语言事件的名称,
   这些事件由SQL Server定义
event_group:预定义的T-SQL语言事件分组的名称。
   执行任何属于event_group的T-SQL语言事件后都将激活DDL触发器
sql_statement:触发器代码

7.3.4 查看触发器

  1. 查看表中触发器
EXEC sp_helptrigger 'table'[,'type']

table:是触发器所在表名
type:指定列出某一操作类型的触发器,如INSERT、DELETE、UPDATE,
   若不指定,则列出所有触发器
  1. 查看触发器定义文本
EXEC sp_helptext 'trigger_name'
  1. 查看触发器的所有者和创建时间
EXEC sp_help 'trigger_name'

7.3.5 修改触发器

  1. 使用ALTER Trigger语句修改触发器
(1)修改DML触发器的ALTER TRIGGER语句
本质把CREATE改成ALTER即可
ALTER TRIGGER schema_name.trigger_name
ON {table | view}
[With Encryption]
{For | After | Instead OF}
{ [INSERT] [,] [UPDATE] [,] [DELETE] }
AS sql_statement [;]

(2)修改DDL触发器的ALTER TRIGGER语句
本质把CREATE改成ALTER即可
ALTER TRIGGER trigger_name
ON {ALL Server | Database}
[With Encryption]
{For | After} {event_type | enent_group} [,...n]
AS sql_statement [;]

(3)使触发器无效
DISABLE TRIGGER { [schema.] trigger_name [,...n] | ALL }
ON object_name

(4)使触发器重新有效
ENABLE TRIGGER { [schema_name.] trigger_name [,...n] | ALL }
ON object_name

7.3.6 删除触发器

  1. 使用DROP TRIGGER 语句删除触发器
DROP TRIGGER trigger_name [,...n] [;]

7.4 备份和还原

数据库的备份和还原是数据库管理员维护数据库安全性和完整性必不可少的操作

7.4.1 备份和还原概述

  1. 备份过程中不允许执行以下操作
    1. 创建或删除数据库文件
    2. 创建索引
    3. 执行非日志操作
    4. 自动或手工缩小数据库或数据库文件的大小
  2. 数据库备份的类型
    1. 数据库完整备份:将数据库内所有对象都进行备份,包括事务日志
    2. 差异备份:只备份自从上次完整备份后数据库变动的部分
    3. 事务日志备份:值备份数据库事务日志的内容。
      • 与差异备份的区别:除了先要还原完整备份外,还要依次还原每个事务日志备份,而不是置换预案最后一个事务日志备份
    4. 文件及文件组备份:针对单一数据库文件或者是文件组做备份,还原时可以仅仅针对受损的数据库文件做还原
  3. 备份和还原策略
    1. 使用多个备份设备来同时进行备份处理。还原同理
    2. 综合使用数据库完整备份、差异备份或事务日志备份来建设每次需要备份的数据量
    3. 使用文件或文件组备份和事务日志备份
  4. 三种数据库还原模式
    1. 简单还原(Simple Recovery):指在进行数据库还原是仅使用了完整数据库完整备份和差异备份,而不涉及事务日志完整备份
    2. 完全还原(Full Recovery):通过使用数据库王铮备份和事务日志备份,将数据库还原到发生失败的时刻。在此模式下数据库几乎不造成任何数据丢失
    3. 批日志还原(Bulk-logged Recovery):性能上优于简单还原和完全荒原模式,它能尽最大努力建设批操作所需要的存储空间

7.4.2 创建备份设备

备份设备可采用物理设备名称和逻辑设备名称两种方式

物理设备名称:指操作系统文件名,就是路径

逻辑设备名称:为物理备份设备指定的可选的逻辑别名

  1. 使用系统存储过程sp_addumpdevice创建备份设备
sp_addumpdevice [@devtype = ] 'device_type' , 
[@logicalname = ] ' logical_name',
[@physicalname = ] 'physical_name'

参数说明
[@devtype = ] 'device_type':备份设备的类型,可以是disk或tape
[@logicalname = ] ' logical_name':备份设备的逻辑名称
[@physicalname = ] 'physical_name':备份设备的物理名称。
   物理名称必须遵从操作系统文件名规则或网络设备的通用命名规则,
   并且必须包含完整路径
   
例1,创建一个磁盘备份设备:
GO
EXEC sp_addumpdevice 'disk','pubss','c:\backdev\backdevpubs.bak'

例2,创建远程磁盘备份设备:
GO
EXEC sp_addumpdevice 'disk','networkdevice','\\servername\sharename\path\filename.ext'
  1. 使用sp_dropdevice删除备份设备
sp_dropdevice [@logicalname = ] 'device' [, [@delfile = ] 'delfile']

@logicalname:表示备份设备逻辑名
@delfile:表示相对应的实体文件

当执行该存储过程时,@delfile选项值必须给出,否则实体文件依旧存在

7.4.3 备份数据库

  1. 使用T-SQL语句备份数据库
    1. 完整备份和差异备份
    BACKUP DATABASE { database_name | @database_name_var }
    TO <backup_device> [,...n]
    [ WITH {Differential | <general_WITH_options> [,...n]}][;]
    
    1. 事务日志备份
    BACKUP LOG { database_name | @database_name_var }
    TO <backup_device> [,...n]
    [ WITH <general_WITH_options> ][;]
    
    1. 文件和文件组备份
    BACKUP DATABASE { database_name | @database_name_var }
    <file_or_filegroup>[,...n]
    TO <backup_device> [,...n]
    [ WITH {Differential | <general_WITH_options> [,...n]}][;]
    
发布了4 篇原创文章 · 获赞 6 · 访问量 8936

猜你喜欢

转载自blog.csdn.net/q556672239/article/details/104995347