5.24

今天实现数据库原理的实验三,

三、实验步骤:

1、 开始→程序→Microsoft SQL Server→SQL Server Management Stdio。

2、 在“连接到服务器”对话框中,选择“Windows 身份验证”,点击“连接”,进入

SQL Server Management Stdio 操作界面。

3、数据库的安全性实验:设置 SQL Server 的安全认证模式,实现对 SQL Server 的用户

和角色管理,设置和管理数据操作权限。

4、数据库的完整性实验:使用 Transact-SQL 设计规则、缺省、约束和触发器, 通过 SQL

Server 管理器定义它们。

创建 students 数据库。利用如下 sql 语句在 students 数据库中创建表(具体含义见课

本 P33 页)

CREATE TABLE Student (

Sno char ( 7 ) PRIMARY KEY,

Sname char ( 10 ) NOT NULL,

Ssex char (2),

Sage tinyint ,

Sdept char (20)

)

CREATE TABLE Course (

Cno char(10) NOT NULL,

Cname char(20) NOT NULL,

Ccredit tinyint ,

Semester tinyint,

PRIMARY KEY(Cno)

)

CREATE TABLE SC

(

Sno char(7) NOT NULL,

Cno char(10) NOT NULL,

Grade tinyint,

XKLB char(4) ,

PRIMARY KEY ( Sno, Cno )

)

完成如下操作:

(1)     在 SQL Server 管理器中, 创建一个新的 windows 登录名。

Ⅰ、

 

 

 

 

如果存在连接 可以新建一个电脑用户进行连接

(2)在 SQL Server 管理器中为自己建立一个 SQL SERVER 服务器登录名(自己学号)。

 

 

 

输入自己的学号以及设置的密码,同时在用户映射中

 

 

选择自己刚刚建立的数据库

 

 

分配数据库角色

(3)为所属的 SQL 服务器设置混合认证安全认证模式。

在自己连接的实例下新建查询,输入此语句。

-- 首先,检查当前的身份验证模式

SELECT authentication_mode FROM sys.server_principals WHERE principal_id = 1;

 

-- 如果需要更改,执行以下命令(需要sysadmin权限)

ALTER LOGIN sa ENABLE; -- 确保sa账户是启用状态

EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'LoginMode', REG_DWORD, 2;

刷新后,重启服务才能生效。

(4)用自己创建的登录名登录服务器。

 

配置SQL Server为混合模式身份验证后,你将有两种登录方式可选:

  1. Windows身份验证:这种方式下,SQL Server会使用你的Windows用户名和密码来验证身份。登录时,在SQL Server Management Studio (SSMS) 或其他客户端工具中,选择“Windows身份验证”或“Windows Authentication”选项,通常不需要手动输入用户名和密码,因为它们是从你的Windows会话中自动获取的。
  2. SQL Server身份验证:在这种模式下,你需要提供一个在SQL Server中预定义的用户名(例如,SA账户或其他自定义的登录名)及对应的密码。在SSMS或客户端工具的登录界面,选择“SQL Server 身份验证”或“SQL Server Authentication”选项,然后分别输入用户名和密码。

 

 

(5)在 SQL Server 管理器中为自己建立一个 students 数据库用户(自己学号-user) 和

角色(自己学号-role)。

USE students;

GO

CREATE USER [20220002-user] FOR LOGIN [20220002];

GO

CREATE ROLE [20220002-role];

GO

-- 允许查询

GRANT SELECT ON dbo.Student TO [20220002-role];

GRANT SELECT ON dbo.Course TO [20220002-role];

GRANT SELECT ON dbo.SC TO [20220002-role];

 

-- 拒绝对SC表中Grade列的更新权限

DENY UPDATE (Grade) ON dbo.SC TO [20220002-role];

-- 允许修改Student表中的某些列

GRANT UPDATE (Sname, Ssex, Sage) ON dbo.Student TO [20220002-user];

ALTER ROLE [20220002-role] ADD MEMBER [20220002-user];

GO

(6) 用管理器实现如下权限的分配:

① 将 student 表中“sname”、“ssex”、“sage” 的修改权限赋予自己创建的数据库用户。

GRANT UPDATE (Sname, Ssex, Sage) ON dbo.Student TO [20220002-user];

② 将 student 表、 course 表、 sc 表的查询权限授予自己创建的角色。

GRANT SELECT ON dbo.Student TO [20220002-role];

GRANT SELECT ON dbo.Course TO [20220002-role];

GRANT SELECT ON dbo.SC TO [20220002-role];

③ 拒绝自己创建的角色拥有 sc 表中 grade 的修改权限。

DENY UPDATE (Grade) ON dbo.SC TO [20220002-role];

④ 将自己创建的数据库用户添加为自己创建的角色成员。

ALTER ROLE [20220001-role] ADD MEMBER [20220002-user];

(7)用管理器创建触发器实现如下安全性和完整性:

①定义 course 表中 credit 属性为“3”的缺省。

ALTER TABLE Course ADD CONSTRAINT DF_Course_Credit DEFAULT 3 FOR Ccredit;

②建立 course 与 sc 表间来维护参照完整性而使用的一个级联删除触发器、 一个级

联修改触发器和一个受限插入触发器。

CREATE TRIGGER trg_CourseDelete_Cascade ON Course

INSTEAD OF DELETE

AS

BEGIN

    DELETE FROM SC WHERE Cno IN (SELECT Cno FROM deleted);

    DELETE FROM Course WHERE Cno IN (SELECT Cno FROM deleted);

END;

 

 

 

CREATE TRIGGER trg_SC_Insert_Restrict

ON SC

INSTEAD OF INSERT

AS

BEGIN

    INSERT INTO SC (Sno, Cno, Grade, XKLB)

    SELECT i.Sno, i.Cno, i.Grade, i.XKLB

    FROM inserted i

    WHERE EXISTS (SELECT 1 FROM Course c WHERE c.Cno = i.Cno);

END;

 

 

CREATE TRIGGER trg_SC_Insert_Restrict

ON SC

INSTEAD OF INSERT

AS

BEGIN

    INSERT INTO SC (Sno, Cno, Grade, XKLB)

    SELECT i.Sno, i.Cno, i.Grade, i.XKLB

    FROM inserted i

    WHERE EXISTS (SELECT 1 FROM Course c WHERE c.Cno = i.Cno);

END;

(8) 对“students 数据库”编写存储过程,完成下面功能:

① 统计成绩 60 分以下的人数;

 

 

CREATE PROCEDURE Proc_CountBelow60

AS

BEGIN

    SELECT COUNT(*) AS 'Below60Count' FROM SC WHERE Grade < 60;

END;

② 统计给定 cno 的课程的平均成绩,并返回平均成绩;

 

 

CREATE PROCEDURE Proc_AvgGradeByCno

    @Cno CHAR(10)

AS

BEGIN

    SELECT AVG(Grade) AS 'AverageGrade' FROM SC WHERE Cno = @Cno;

END;

③将 sc 表中 grade 从百分制改为等级制(5、 4、 3、 2、 1)。 即 0-20 分为 1, 21-40

为 2, 4 1-60 为 3, 61-80 为 4,81-100 为 5。

CREATE PROCEDURE Proc_ConvertGradeToLevel

AS

BEGIN

    UPDATE SC

    SET Grade = CASE

            WHEN Grade BETWEEN 0 AND 20 THEN 1

            WHEN Grade BETWEEN 21 AND 40 THEN 2

            WHEN Grade BETWEEN 41 AND 60 THEN 3

            WHEN Grade BETWEEN 61 AND 80 THEN 4

            ELSE 5

        END;

END;

posted @ 2024-05-24 15:27  七安。  阅读(13)  评论(0编辑  收藏  举报