視圖、存儲過程以及權限控制練習

視圖、存儲過程以及權限控制

導讀:

該文章爲視圖、存儲過程、用戶權限練習;sql

若是有不對的地方歡迎指出與補充;數據庫

該基礎練習基於MySQL5.0以上;ide

語句格式:

1. 視圖格式:code

create view view_name[列名,列名.....] as select 子查詢 with check option

其中with check option 做用是:在視圖進行update\delete\insert操做時要保證更新、插入、刪除的行知足視圖定義中的謂詞公式(既子查詢中的條件表達式);排序

視圖操做如正常表同樣能夠增刪改查。權限控制

2.存儲過程格式:數學

create procedure pro_name(in 參數名 類型,out 參數名 類別)
begin
      過程體                     
end

3.用戶權限格式:it

create  user 用戶名 indentified by '密碼'
--設置權限
grant 權限 on 數據庫名.表名 to 用戶@登陸主機 identified by "用戶密碼";

視圖:

(1)創建視圖IS_STUDENT,視圖中包含信息系全體學生的基本信息。(要求限制更新)io

Create view IS_STUDENT as select * from student
Where sdept=’信息系’ with check option;

(2)創建視圖CJ_STUDENT,視圖中包含全部成績不及格的學生的學號,姓名,課程名,成績。class

Create view CJ_STUDENT as select student.sno,sname,cname,grade from student,sc,course

 Where student.sno=sc.sno and sc.cno=course.cno and (grade <60 or grade is null);

(3)創建視圖AVG_CJ,視圖包括學生的學號以及他們的平均成績,按成績降序排列。

Create view AVG_CJ as select sno ,avg(grade) 

from sc  where grade is null group by  sno  order by avg(grade) desc;

(4)根據視圖IS_STUDENT,修改該視圖中年齡都增長1。觀察基本表Student中相應的哪些數據發生了變化。

Update IS_STUDENT set sage=sage+1;

select * from IS_STUDENT;

(5)在視圖IS_STUDENT中插入新的記錄,學號爲9531103,姓名爲張玉,女,21歲,計算機系。(是否能執行?若不行,爲何?)

insert into IS_STUDENT values('9531103','張玉','女',21,'計算機系');

不能執行,由於,違反了視圖建立規則,計算機系不知足sdept中的信息系要求;

(6)根據視圖CJ_STUDENT建立視圖CJ_TJ,包含課程名,不及格人數,不及格人姓名列表,按照不及格人數降序排列。

Create view CJ_TJ as select cname,count(*),GROUP_CONSCAT(sname SEPARATOR ',')  from CJ_STUDENT  group by cname order by count(*) desc;

存儲過程:

(1)創建存儲過程course_grade:根據課程名參數,查詢該課程的成績表,包括學號,姓名,成績,按學號升序排序。

CREATE PROCEDURE course_grade (in course_name varchar(20))

SELECT student.sno,sname,grade from student,sc,course WHERE student.sno=sc.sno and sc.cno =course.cno and cname=course_name ORDER BY sno;

DROP PROCEDURE course_grade;

 

CALL course_grade("計算機導論");

img

(2)創建存儲過程search_grade:根據姓名和課程名參數,查詢該學生相應的課程成績,若存在成績,則返回成績值,不然返回NULL。

create procedure search_grade(in student_name char(10), in course_name varchar(20), out re_grade smallint, out rname char(10)) 
	Begin 
	If( not exists
			(
				select * from student, sc, course
				where student.sno = sc.sno
				and sc.cno = course.cno
				and sname = student_name
				and cname = course_name) )
then set re_grade = null;
	else 
		select grade into re_grade from student, sc, course
		where student.sno = sc.sno
		and sc.cno = course.cno
		and sname = student_name
		and cname = course_name ;
	end if;
end ;
#建立成功
-- 執行存儲過程
call search_grade('王大力','數據庫原理',@grade, @rname);
select @grade, @rname;
call search_grade('王大力','高等數學',@grade, @rname);
select @grade, @rname;

(3)建立存儲過程take_course:根據參數學號和課程號,完成選課功能(要求可以根據選課人數加以限制)。

要求:

§ 檢查該學生選課門數是否超過3門,若超過,不插入記錄;

§ 檢查該課程選課人數是否已滿(在course表裏添加一個屬性列,記錄課程人數限制);

ü 選課人數已滿:不插入記錄;

ü 選課人數未滿且未插入過:完成數據插入操做;

ü 選課人數未滿,已插入過:不插入記錄

§ 最後返回執行結果信息,例如:

ü 超過3門,返回-1;

ü 選課人數已滿。返回0;

ü 選課人數未滿且未插入過:返回1;

ü 選課人數未滿已插入過:返回2

create procedure take_course (in student_no char(7), in course_no char(3), out i tinyint )
begin 
	if(select count(*) from sc where sno= student_no) >= 3 
		then set i = 1;
	else 
		if(select count(*) from sc where cno = course_no) >= 5 
		then set i= 0;
		else 
				if exists (select * from sc where sno = student_no and cno = course_no) 
				then set i = 2;
				else 
					insert into sc(sno, cno) values(student_no, course_no);
					set i = 1;
				end if ;
		end if ;
	end if ;
end ;

權限控制:

(1)建立超級用戶admin,具備對全部數據庫的全部訪問權限,僅限本機鏈接(密碼自行設置),並驗證用戶和權限設置是否正確。

CREATE user admin @localhost

IDENTIFIED by '123';

(2)建立管理員teacher_liu,具備對SC表、IS_STUDENT視圖(實驗5建立)的增刪改查權限,而且具備受權的權限,容許從任意位置鏈接(密碼自行設置),並驗證用戶和權限設置是否正確。

CREATE USER teacher_liu @'%' IDENTIFIED by '123456';

GRANT SELECT ,INSERT, UPDATE, DELETE on studentTable.sc TO teacher_liu @'%' WITH GRANT OPTION;

總結:

期末考試結束,開始陸續更新。。。

以上練習若是有不對的地方歡迎指正。。。。

相關文章
相關標籤/搜索