SQL Server 数据库原理与应用

1. 数据库概述

  1. 名词解释:

    • DB:数据库
    • DBMS:数据库管理系统
    • DBS:数据库系统
    • DBA:数据库管理员
    • DBAS:数据库应用系统
  2. 数据管理的三个阶段:人工管理文件系统阶段数据库系统阶段
  3. 三级模式:

    • 外模式:也称子模式或用户模式,它是对数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述。一个数据库可以有多个外模式,但一个应用程序只能使用同一个外模式。外模式与视图对应。
    • 模式:也称概念模式或逻辑模式,是对数据库中全部数据的逻辑结构和特征的描述,是所有用户的公共数据视图。一个数据库只有一个模式。模式与基本表对应。
    • 内模式:内模式也称存储模式或物理模式,是对数据物理结构和存储方式的描述,是数据在数据库内部的表示方式,一个数据库只有一个内模式。内模式与索引对应。
  4. 两级映像与数据独立性的关系:

    • 外模式/模式映像:当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,因而应用程序不必修改,保证数据与程序的逻辑独立性
    • 模式/内模式映像:当数据库的存储结构改变了,由数据库管理员对模式/内模式映像作相应改变,可以保证模式保持小变,因而应用程序也不必改变。保证数据与程序的物理独立性
  5. 概念模型三种联系的类型:

    • 一对一联系(1:1)
    • 一对多联系(1:M)
    • 多对多联系(M:N)
  6. 实体-联系(Entity-Relationship)模型通用表示方式:

    • 用矩形表示实体,在框内写上实体名。
    • 用椭圆形表示实体的属性,并用无向边把实体和属性连接起来。
    • 用菱形表示实体间的联系,在菱形框内写上联系名,用无向边分别把菱形框与有关实体连接起来,在无向边旁注明联系的类型。联系可以有属性
    • 学生实体和班级实体的联系的 E-R 图如下 :

      图片描述

2. 关系数据库

  1. 关系完整性是指关系模型数据正确性一致性
  2. 关系模型三类完整性规则:

    • 实体完整性:实体完整性要求关系的主码具有唯一性且不能取空值。
    • 参照完整性:外键的取值只能等于空值或所参照的主键的取值。
    • 用户自定义完整性:是由用户根据实际情况对数据库中数据的内容进行的规定,也称为域完整性规则。
  3. 关系代数:是以关系为运算对象的一组高级运算的集合。关系代数是一种抽象的查询语句,是关系数据操纵语言的一种传统表达方式,即代数方式的数据查询过程。关系代数的运算对象是关系,运算结果也是关系。

    • 笛卡儿积

      • A×B={(x,y)|x∈A∧y∈B}
      • 例如,A={a,b}, B={0,1,2},则
      • A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

        B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

    • 选择运算

      • 在关系 R 中选择满足给定条件的诸元组,记作: σF(R)={t | t∈R^ F(t)='真'}
      • 其中, F 表示选择条件,它是一个逻辑表达式,取逻辑值“真”或“假”。
        图片描述
    • 投影运算

      • 在关系 R 上从中选择出若干属性列组成新的关系。记作: πA(R)={t[A]|t∈R}
      • 其中,A 为 R 中的属性列。
        图片描述
  4. 关系模式是一个五元组,可以表示为 R(U,D,dom,F)

    • R 是关系名
    • U 是该关系的属性名集合
    • D 是属性组 U 种属性所来自的域
    • dom 是属性向域的映像集合
    • F 是属性间的数据依赖关系集合
    • 例如:学生情况表的关系模式可以描述为学生情况表(学号,姓名,性别,年龄,所在系)
  5. 关系模式中常见的问题:数据冗余、更新异常、插入异常、删除异常。
  6. 范式是符合某一种级别的关系模式的集合

    • 1NF:任何关系模式都是第一范式。

      • S(学号,姓名,性别,课程号,学分)
    • 2NF:不存在非主属性部分函数依赖于码

      • S(学号,姓名,性别,课程号,学分)存在对码的部分函数依赖,需要先分解才能满足 2NF
      • 分解后:S1(学号,姓名,性别),S2(学号,课程号,学分)
    • 3NF:非主属性既不部分也不传递函数依赖与码

      • ST(学号、楼号、收费),学号→楼号,楼号→收费,存在传递函数依赖,需要先分解才能满足 3 NF
      • 分解后:ST1(学号,楼号),ST2(楼号,收费)

3. 数据库设计

  1. 数据库系统设计分为 6 个阶段:

    • 需求分析:调查用户需求,数据流图和数据字典
    • 概念结构设计:设计局部 E-R 模型,再将局部 E-R 模型集成
    • 逻辑结构设计:将 E-R 模型转换为关系数据模型,包括实体的转换联系的转换
    • 物理结构设计:确定数据库的物理结构、数据的存储结构,谁数据的存取路径和存放位置等。
    • 数据库实施阶段、运行和维护:建立实际的数据库结构、数据的加载、试运行和评估等。
  2. E-R 模型转换关系数据模型

    • 实体的转换:

      • 实体集对应于一个关系
      • 关系名:与实体集同名
      • 属性:实体集的所有属性
      • 主码:实体集的主码
    • 联系的转换:内容较多,建议参考书籍第 42 页,题目参考 52 页第 8 题

5. 数据库的概念和操作

  1. SQL Server 中数据文件的类型

    • 主数据文件:有且只有一个 .mdf
    • 辅助数据文件:可有可无 .ndf
    • 事务日志文件:至少有一个 .ldf (事务日志文件不分组管理,即不属于任何文件组)
  2. 数据文件组:为了便于管理和分配数据而将文件组织在一起,通常可以为一个数据库创建多个文件组(File Group),将多个数据库文件分配在不同的文件组内分组管理。
  3. 逻辑数据库:

    • master 数据库:是最重要的系统数据库,记录系统中所有系统级信息。
    • model 数据库:为用户新创建的数据库提供模板,它包含了用户数据库中应该包含的所有系统表结构。
    • msdb 数据库:记录备份及还原的历史信息、维护计划信息、作业信息、异常信息以及操作者信息等。
    • tempdb 数据库:tempdb 数据库保存所有的临时表和临时存储过程。

6. 表的操作

  1. 创建表格 / 修改表结构 / 删除表格

    -- 创建表格
    CREATE TABLE student
    (
      cno char(4) PRIMARY KEY,
      cname nvarchar(20) NOT NULL,
      sex nvarchar(4),
      birthday date
    )
    -- 修改表格只需要将 CREATE 改为 ALTER
    -- 删除表格 DROP TABLE [TABLE_NAME]
  2. 约束:约束是通过限制列中数据、行中数据和表之间数据来保证数据完整性的非常有效的方法。约束可以确保把 有效数据 输入到列中及维护表和表之间的特定关系

    -- 在创建表的同时创建约束
    CREATE TABLE student
    (
      cno char(4) PRIMARY KEY, /*Primary Key*/
      sex nvarchar(4) DEFAULT '男' CHECK(sex IN ('男','女')), /*Default+Check*/
      birthday date DEAFAULT date(getdate()), /*Default*/
      IDCardNUM char(18) UNIQUE, /*Unique 约束*/
      class char(10) Foreign KEY Reference classes(class_num)/*foreing key*/
      ……
    )
    -- 在创建表之后添加约束
    ALTER TALBE [表名]
    ADD CONSTRAINT [约束名] [约束类型] (列名)
    ALTER TALBE student
    ADD CONSTRAINT pk_st PRIMARY KEY (cno)
    ALTER TALBE student
    ADD CONSTRAINT cj_sex CHECK(sex in ('男', '女')) /*性别只能为男或女*/

7. 数据库查询

  • 简单查询:
-- 单表查询
SELECT * FROM 表名
-- 多表查询
SELECT rdID, rdName FROM Reader;
-- DISTINCT 关键字
SELECT DISTINCT specialty FROM student; /*查询学生表中的专业名称,过滤重复行*/
-- AS 关键字
SELECT DISTINCT specialty AS 专业名称 FROM student;/*将查询结果中 specialty 取一个列别名*/
  • 选择查询:
-- 比较运算符 =、>、<、>=、<=、!=、<>、!>、!<
SELECT * FROM sc WHERE score >= 60
-- 逻辑表达式 AND、OR、NOT
SELECT * FROM student WHERE specialty = '计算机' AND ssex = '男'
-- 确定范围的关键字 BETWEEN AND、NOT BETWEEN AND
SELECT * FROM sc WHERE score BETWEEN 80 AND 90
-- 确定集合的关键字 IN、NOT IN
SELECT * FROM student WHERE specialty IN ('计算机','通信')
-- 字符匹配关键字 LIKE、NOT LIKE
SELECT * FROM student WHERE sname LIKE '张%' /*查找姓张的学生*/
SELECT * FROM student WHERE sname LIKE '张_' /*查找姓张且姓字为两个字的学生*/
-- 空值判断关键字 IS NULL、IS NOT NULL
SELECT * FROM sc WHERE score IS NULL
-- 复合条件查询
SELECT * FROM student WHERE sex = '女' AND (specialty = '计算机' OR specialty = '通信')
  • 分组查询
-- 简单分组
SELECT * FROM student GROUP BY ssex
-- HAVING 关键字:选修了两门及以上课程的学生
SELECT * FROM student GROUP BY ssex HAVING COUNT(cno) >= 2
-- 聚合函数
count()、sum()、avg()、min()、max()
  • 连接查询
-------------------------------------------------
a表     id   name     b表     id   job   parent_id
        1    张三             1    23    1
        2    李四             2    34    2
        3    王武             3    34    4
a.id 同 parent_id 存在关系
--------------------------------------------------
-- 内连接
select a.*,b.* from a inner join b on a.id = b.parent_id
结果是:
1   张三       1     23     1
2   李四       2     34     2
-- 左外连接
select a.*,b.* from a left join b on a.id = b.parent_id
结果是:
1   张三       1     23     1
2   李四       2     34     2
3   王武       null
-- 右外连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是:
1   张三       1     23     1
2   李四       2     34     2
null           3     34     4
  • 子查询
-- 查询与连晓燕在同一个单位的读者;
SELECT rdName FROM Reader WHERE rdDept = (SELECT rdDept FROM Reader 
  WHERE rdName = '连小燕');
  • 集合运算查询
-- UNION(并集):查询选修了课程 C001 和 课程 C004 的学生的姓名
SELECT sname FROM sc,student
WHERE cno = 'C001' AND sc.sno = student.sno
UNION
SELECT sname FROM sc,student
WHERE cno = 'C004' AND sc.sno = student.sno
-- EXCEPT(差集):查询没有选课的学生的学号
SELECT sno FROM student
EXCEPT
SELECT sno FROM sc
-- INTERSECT(交集):查询即选修了课程 C001 又选修了课程 C004 的学生的姓名
SELECT sname FROM sc,student
WHERE cno = 'C001' AND sc.sno = student.sno
INTERSECT
SELECT sname FROM sc,student
WHERE cno = 'C004' AND sc.sno = student.sno
  • 对查询结果进行排序
-- 默认升序 ASC
SELECT * FROM SC ORDER BY sname ASC
-- 降序排序 DESC(按成绩降序,成绩相同的话按学号升序排)
SELECT sno,score FROM SC ORDER BY score DESC,sno ASC

8. 视图和索引

  1. 视图并不是以一组数据的形式存储在数据库中,数据库中只存储视图的定义,不存储视图对应的数据,这些数据仍存储在导出视图的基本表中,视图实际上是一个查询结果。

    -- 创建视图
    CREATE VIEW view_name AS
    SELECT column_name(s)
    FROM table_name
    WHERE condition
    -- 查看视图
    SELECT * FROM view_name
    -- 删除视图
    DROP VIEW view_name
  2. 索引概述:索引(Index)是对数据库表中一个或多个列的值进行排序的结构,其主要目的是提高SQL Server系统的性能,加快数据的查询速度和减少系统的响应时间。
  3. 索引的类型

    • 聚集索引:

      • 在表和视图中只能有一个聚集索引。
      • 当建立主键约束时,若表中没有聚集索引,会用主键列作为聚集索引键。
      • 实际应用中一般为定义成主键约束的列建立聚集索引。
      • 聚集索引会对表和视图进行物理排序,对查询非常有效。
    • 非聚集索引:

      • 非聚集索引不对表和视图进行物理排序。
      • 若表中不存在聚集索引,则表是未排序的。
      • 在表或视图中,最多可以建立250个非聚集索引,或者249个非聚集索引和1个聚集索引。
    • 聚集索引和非聚集索引都可以是唯一的索引。因此,只要列中数据是唯一的,就可在同一个表上创建一个唯一的聚集索引。如果必须实施唯一性以确保数据的完整性,则应在列上创建UNIQUE或PRIMARY KEY约束,而不要创建唯一索引。
  4. 创建索引:CREATE INDEX index_name ON table_name(col_name)

9. T-SQL 编程

  1. 变量的声明:DECLARE @var_name VARCHAR(20)DECLARE @MyCounter INT
  2. 变量的分类:“@”开头为局部变量,“@@”开头为全局变量。
  3. 变量的赋值:SET @var_name = GETDATA()SELECT COUNT(sno)=@MyCounter from student
  4. 显示变量的值:PRINT @var_name,@MyCounter
  5. 批出理语句使用

    /* 多行注释 */
    -- 单行注释
    SELECT sno,sname FROM student
    GO -- 此处 GO 为批处理语句
  6. 流程控制语句

    -- SET 语句
    DECLARE @myvar char(20);
    SET @myvar = 'This is a test';
    SELECT @myvar;
    GO
    
    -- BEGIN END 语句(用于将多个 SQL 语句合并为一个语句块)
    BEGIN
      { sql_statement|statement_block }
    END
    
    -- IF……ELSE 语句:
    -- 如果 C001 号课的平均成绩高于 80 分,则显示“平均成绩还不错”,否则显示“平均成绩一般”
    IF ( SELECT AVG(score) FROM sc WHERE cno = 'coo1') > 80
      PRINT 'C001 号课的平均成绩还不错'
    ELSE
      PRINT 'C001 号课的平均成绩一般'
    
    -- CASE 语句:以搜索 CASE 格式查询所有学生的考试等级,包括学号、课程号和成绩级别
    SELECT sno,cno,
      CASE
        WHEN score >= 90 then 'a'
        WHEN score >= 80 then 'b'
        WHEN score >= 70 then 'c'
        WHEN score >= 60 then 'd'
        WHEN score < 60 then 'e'
      END AS score_level
    FROM sc
    
    -- WHILE 语句:求 1 到 100 的累加和,当和超过 1000 时停止累加,显示累加和以及累加到的位置。
    -- 结果:a=1035,i=45
    DECLARE @i int,@a int
    SET @i = 1, @a = 0
    WHILE @i <= 100
      BEGIN
        SET @a = @a + @i
        IF @a >= 1000 BREAK
        SET @i = @i + 1
      END
    SELECT @a AS 'a',@i AS 'i'
  7. 函数

    -- 聚合函数
    ADD(),AVG(),SUM()……
    -- 日期函数
    GETDATE():返回系统当前的日期和时间
    DAY():返回日期表达式中的日
    MOUTH():返回日期表达式中的月
    YEAR():返回日期表达式中的年
    -- 自定义函数:求选课表中某门课的平均成绩
    CREATE FUNCTION average(@cn char(4)) RETURNS float
    AS
      BEGIN
        DECLARE @aver float
        SELECT @aver = (SELECT avg(score) FROM sc WHERE cno = @cn)
        RETURN @aver
      END
  8. 游标(定义、打开、读取、关闭、释放)

    -- 利用游标将sc表中选课成绩小于50分的成绩提高30%,将大于等于50分的成绩提高50%
    -- 定义游标
    DECLARE SC_Cursor CURSOR
    DYNAMIC FOR SELECT Grade FROM SC FOR UPDATE OF Grade
    -- 打开游标
    OPEN SC_Cursor
    -- 读取游标
    DECLARE @Grade INT
    FETCH NEXT FROM SC_Cursor INTO @Grade
    --假如检索到了数据,才处理
    WHILE @@FETCH_STATUS = 0
    BEGIN
        -- 填充数据
        IF @Grade < 50
            UPDATE SC SET Grade = @Grade * 1.3 WHERE CURRENT OF SC_Cursor
        ELSE
            UPDATE SC SET Grade = @Grade * 1.5 WHERE CURRENT OF SC_Cursor
        -- 填充下一条数据
        FETCH NEXT FROM SC_Cursor INTO @Grade
    END
    -- 关闭游标
    CLOSE SC_Cursor
    -- 释放游标
    DEALLOCATE SC_Cursor
    GO

10. 存储过程和触发器

  1. 创建存储过程(修改存储过程只要将 CREATE 替换为 ALTER)

    -- 不带参数的存储过程
    CREATE PROCEDURE students_avg
    AS
    SELECT sno,avg(score) AS 'avgscore' FROM sc
    GROUP BY sno
    GO
    -- 带参数存储过程
    CREATE PROCEDURE usp_rdName
        @rdID CHAR(9),
        @rdName VARCHAR(20) OUTPUT
    AS
    SELECT @rdName = rdName
    FROM Reader
    WHERE rdID = @rdID
    GO
    -- 存储过程中可以使用 raiserror 抛出异常
  2. 调用存储过程

    -- 执行不带参数的存储过程
    EXECUTE students_avg
    -- 执行带参数的存储过程
    DECLARE @Result VARCHAR(20)
    EXEC usp_rdName 'rd2017001',@Result OUTPUT
    PRINT @Result
  3. 删除存储过程

    DROP PROCEDURE students_avg
  4. 触发器

    • DML 触发器:当对表或视图进行修改、插入、删除这些操作时,会自动执行触发器所定义的 SQL 语句。
    • DDL 触发器:当添加、修改、或删除数据库对象时,会自动执行触发器所定义的 SQL 语句。
  5. 创建触发器、激发触发器、删除触发器(删除触发器所在的表,系统会自动删除与该表相关的触发器)。

    -- 创建 DML 触发器:
    GO
    CREATE TRIGGER DML_Limited ON student
    FOR DELETE
    AS
      DECLARE @count varchar(50)
      SET @count = STR(@@ROWCOUNT)+'个学生被删除'
      SELECT @count
    RETURN
    -- 执行 DML 触发器(查询结果为:5个学生被删除)
    DELETE FROM student WHERE specialty = '计算机'
    -- 删除 DML 触发器
    DROP TRIGGER DML_Limited
    -- 禁止在 student 表上的所有触发器
    ALTER TABLE student
    DISABLE TRIGGER ALL
    
    -- 创建 DDL 触发器:禁止用户修改 BooksDB 数据库中的表;
    GO
    CREATE TRIGGER DDL_Limited ON DATABASE
    FOR DROP_TABLE,ALTER_TABLE
    AS
      PRINT '名为 DDL_Limited 的触发器禁止您修改 BooksDB 数据库中的表'
      ROLLBACK
    -- 执行 DDL 触发器
    DROP TABLE Borrow
    -- 删除 DDL 触发器
    DROP TRIGGER DDL_Limited
    
    -- 测试 AFTER 触发器,理解 INSERTED 表和 DELETED 表的作用;
    GO
    CREATE TRIGGER tri_InsDelOnReader ON Reader for INSERT, DELETE
    AS
    SELECT *
    FROM inserted
    SELECT *
    FROM deleted
    PRINT 'Reader 表上的 AFTER 触发器已执行!'
    GO
    -- 激发触发器执行
    INSERT INTO  Reader
    VALUES('rd2017008', 3, '孙星', '计算机科学学院', '66666666', 0);
    -- 激发触发器执行
    DELETE FROM Reader WHERE rdID = 'rd2017008'

11. 事务与并发控制

  1. 事务要求处理时必须满足 4 个原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
  2. 根据运行模式分类,事务分为 4 种类型:

    • 自动提交事务:每条单独的 T-SQL 语句都是一个事务。如果没有通过任何语句设置事务,一条 T-SQL 语句就是一个事务,语句执行完事务就结束。
    • 显式事务:每个事务均以 BEGIN TRANSACTION 语句、COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句明确的定义了什么时候开始、什么时候结束的事务。
    • 隐式事务:前一个事务完成时新事务隐式开始,但每个事务仍以 COMMIT COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句显示结束。
    • 批处理级事务:该事务只能应用于多个活动结果集(MARS),在 MARS 会话中启动 T-SQL 显式或隐式事务变为批处理级事务。当批处理完成时,没有回滚或提交的批处理级事务自动由 SQL Server 语句集合分组后形成单个的逻辑工作单元。
  3. 如果多个用户同时访问一个数据库没有加以控制,就可能发生问题,这些问题包括:

    • 丢失修改:事务 T1 和事务 T2 同时读取一个数据,T1 修改了这个数据后,T2 也修改了这个数据,那么 T1 的修改结果就丢失了,因此称为丢失修改。
    • 脏读:当一个事务正在访问数据并且对数据进行了修改,而修改还没有提交到数据库,这时另一个事务也访问这个数据,然后使用了这个数据。因为这个数据时还没有提交的数据,那么另一个事务读取到的数据就是脏数据。
    • 不可重复读:在一个事务内多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,第一个事务两次读到数据可能是不一样的。这就发生了在一个事务内,两次读取的数据不一样的情况,因此称为不可重复读。
    • 幻读:一个事务对一个表中的数据进行了修改,这种修改涉及表中全部数据行。同时第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后操作第一个事务的用户会发现表中还有没有修改的数据行,就像发生了幻觉。
  4. 锁的类型

    • 共享锁(Shared Lock,简称 S 锁):允许并发事务读取一个资源。当资源上存在共享 S 锁时,任何其他事务都不能修改数据。一旦读取成功,立即释放资源上的共享 S 锁。
    • 排它锁(eXClusive Lock,简称 X 锁):防止并发事务对资源进行访问,其他事务不能读取或修改 X 锁锁定的数据。在执行数据更新命令(插入、修改、删除)时,SQL Server 会自动上 X 锁。
    • 更新锁(Update Lock,简称 U 锁):当 SQL Server 准备更新数据时,它首先对数据对象加更新锁,锁定的数据将不能被修改,但可以读取。当等到 SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为排它锁,但当数据对象上有其他更新锁存在时无法对其做更新锁锁定。
    • 意向锁(Intent Lock,简称 I 锁):则说明该资源的下层资源正在被加锁(S 锁或 X 锁);在对任一资源加锁时,必须先对它的上层资源加意向锁。
    • 模式锁(Schema Lock):保证当表或者索引被另外一个会话参考时不能被删除或者修改其结构模式。
    • 大容量更新锁(Bulk Update Lock,简称 BU 锁):允许进程将数据并发地大容量复制到同一表,同时防止其他不进行大容量复制数据的进程访问该表。
  • 自动提交事务:
INSERT INTO  Reader
VALUES('rd2017008', 3, '孙星', '计算机科学学院', '66666666', 0);
  • 显式事务:
CREATE TABLE Account(
  cardID  CHAR(4) NOT NULL PRIMARY KEY,
  Name CHAR(6),
  Balance INT CHECK(Balance > = 1)        
) 
GO 
INSERT INTO Account VALUES('6666', '张三', 1000)
INSERT INTO Account VALUES('8888', '李四', 1) 
--使用事务实现转账:捕获到异常就回滚
BEGIN TRAN
  BEGIN TRY    
    UPDATE account SET balance = balance + 1000 WHERE cardID = '8888'
    UPDATE account SET balance = balance - 1000 WHERE cardID = '6666'
    COMMIT
  END TRY
  BEGIN CATCH   
    ROLLBACK
  END CATCH
  • 隐式事务:
-- 执行以下代码打开隐式事务:
SET IMPLICIT_TRANSACTIONS ON
-- 创建一个数据表,开始一个新的事务
CREATE TABLE T1 (i INT PRIMARY KEY)
GO
-- 查询表(查询成功)
SELECT *
FROM T1
-- 取消事务后再查询表中的数据(由于表不复存在,所以会得到一个错误信息。)
ROLLBACK
SELECT *
FROM T1
-- 执行以下代码关闭隐式事务:
SET IMPLICIT_TRANSACTIONS OFF;

12. 数据库的安全管理

  1. SQL Server 身份验证分为 Windows 身份验证模式混合验证模式
  2. 权限管理基本语法 GRANT|REVOKE|DENY ALL ON 安全对象 TO 用户
  3. 不推荐使用 ALL,仅保留此选项用于向后兼容,它不会授予所有可能的权限。
安全对象ALL 对应的权限
数据库CREATE DATABASE, CREATE PROCEDURE, CREATE VIEW, CREATE TABLE, CREATE RULE 等
标量函数EXECUTE, REFERENCES
表值函数SELECT, DELETE, INSERT, UPDATE, REFERENCES
存储过程EXECUTE, SYNONYM
SELECT, DELETE, INSERT, UPDATE, REFERENCES
视图SELECT, DELETE, INSERT, UPDATE, REFERENCES
-- 创建登陆账户、创建数据库账户、授予权限、拒绝权限实例
CREATE LOGIN wtq WITH PASSWORD = 'wtq888',DEFAULT_DATABASE = BooksDB
GO
CREATE LOGIN test WITH PASSWORD = 'test888',DEFAULT_DATABASE = BooksDB
GO
CREATE USER wtq FROM LOGIN wtq
GO
CREATE USER test FROM LOGIN test
GO
GRANT SELECT,INSERT ON ReaderType TO wtq
DENY DELETE,UPDATE ON ReaderType TO wtq
DENY DELETE,INSERT,REFERENCES,SELECT,UPDATE ON ReaderType TO test

13. 数据库的备份和还原

-- teaching 的完整备份(差异备份只需要将 WITH 后面的 Format 改为 Differential )
BACKUP DATABASE teaching
TO DISK = 'F:\BACKUP\teaching.Bak'
WITH FORMAT
NAME = 'teaching 的完整备份'
-- teaching 的完整数据库备份进行还原(差异还原使用 WITH RECOVERY)
RESTORE DATABASE teaching
TO DISK = 'F:\BACKUP\teaching.Bak'
WITH REPLACE,NORECOVERY

14. 基于 C# .NET 的数据库系统开发

  1. 利用 Connection、Command、DataReader 对象访问数据库只能从数据库读取数据。只进行查询,该方式更高效
  2. 利用 Connection、DataAdapter、DataSet 对象的方式比较灵活,增删改查都可以。
  3. 利用 ADO.NET 访问数据库的基本步骤:
// 引入 数据命名空间 和 SQL 命名空间
using System.Data
using System.Data.SqlClient
// 创建连接对象并实例化,例如连接一个名为 School 的 SQL Server 数据库
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source = .\SQLEXPRESS; AttachDbFilename = E:\data\ school_Data.MDF;Integrated Security = True;Connect Timeout = 30;User Instance = True";
// 打开数据库连接
con.Open();
// 读取数据
SqlCommand cmd = con.CreateCommand();     // 创建命令对象并实例化
cmd.CommandText = "SELECT * FROM student";// SqlCommand 的属性 CommandText 是一条 SQL 语句
SqlDataReader dr = cmd.ExecuteReader();   // 建立DataReader对象迅速获取查询结果
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值