數據庫安全及事務操作
一、目的與要求
- 掌握SQL安全機制
- 掌握服務器的安全性的管理
- 掌握數據庫用戶的管理
- 掌握權限的管理
二、實驗內容
1 設計安全機制使得用戶王明 只能查找財務部的職工
思路:創建登錄SQL賬戶王明,數據庫用戶王明DB,創建只包含財務部員工的視圖,授予王 查詢該視圖的權力
--創建SQL server 登錄賬戶 王明
use 實驗三
exec sp_addlogin '王明' ,'123456'
--創建數據庫用戶 王明DB
exec sp_grantdbaccess '王明','王明DB'
go
--創建只含有財務部員工信息的視圖
CREATE VIEW view_FinanceEmp as
SELECT *
from Employees
where Employees.dep_no =
(select dep_no from Department where dep_name='財務部')
go
--授予王明DB查看該視圖的權限
GRANT SELECT ON view_FinanceEmp to 王明DB
2 設計一個角色“role_Emp”,該角色可以查看僱員編號,姓名。並將王明作爲成員加入到該角色
思路:
1 創建角色:sp_addrole ‘role_Emp’,創建視圖
2 給該角色授權
3 將王明DB加入到該角色
--創建角色
exec sp_addrole 'role_Emp'
--創建只包含僱員編號,姓名的視圖
go
CREATE VIEW view_empId_Name as
select emp_no,emp_name
from Employees
go;
select * from view_empId_Name
go
--授予該角色查詢的權力
GRANT select
on view_empId_Name
to role_Emp
--將王明加入到該角色中
exec sp_addrolemember 'role_Emp','王明DB'
3 用戶張明擁有以下權限;他只能查進貨表中的信息,並擁有對自己進貨表的信息修改的權限,其他表的信息無權查看。
授予他 Purchase 表的查看權限
授予他 purchase表中的一部分(視圖)修改的權限
exec sp_addlogin '張明','123456'--創建sql登錄賬戶
exec sp_grantdbaccess '張明','張明DB'--創建數據庫用戶張明DB
go
create view view_zhangming
as
select * from Purchase
where Emp_no in(select Emp_no from Employees
where Emp_name='張明')
go
Grant select on Purchase to 張明DB --授予查詢進貨表的權限
Grant select,update on view_zahngming to 張明DB --授予修改自己進貨的信息的權限
4 如何使得采購部門的員工都具有這樣的權限:能查看進貨表的信息,並擁有對自己採購信息的修改
(編寫存儲過程Pro_purchase 作用:輸入參數爲員工姓名,從進貨表中查找該員工所進的產品,沒有則返回,有則相應的在login表中添加賬戶和密碼。並且,創建相應的登錄賬號和數據庫用戶)
5 銀行轉賬問題
CREATE TABLE bank --創建賬戶表,存放用戶的賬戶信息
(customerName CHAR(10), --顧客姓名
currentMoney MONEY --當前餘額
)
go
--添加約束:根據銀行規定,賬戶餘額不能少於1元,否則視爲銷戶
ALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney>=1)
go
--張紅開戶,開戶金額爲1000元;李明開戶,開戶金額1元
INSERT INTO bank(customerName,currentMoney) VALUES('張紅',1000)
INSERT INTO bank(customerName,currentMoney) VALUES('李明',1)
寫出用事務解決銀行轉賬的存儲過程:
測試數據:exec pro_bank ‘李明’,‘張紅’ ,500 exec pro_bank ‘張紅’ , ‘李明’,500
6 數據庫字段的加密和解密
(1)創建讀者表的空表名爲 reader_bak,增加一字段 :身份證號
(2)創建數據庫主密鑰
(3)建立證書一,該證書使用數據庫主密鑰來加密
(4)向reader_bak 插入一條數據,借書證號:210 身份證:123456789123456789,並對身份證加密
(5)將加密的身份證解密顯示處理
(6)總結對數據庫字段加密和解密的理解
7 給出一個用戶表,創建表的代碼如下
create table users(
Unumber INT IDENTITY(1,1),
Uname varchar(20),
sex char(2),
Upassword char(10),
CONSTRANIT PK_Unum PRIMARY KEY(Unumber),
CONSTRAINT CK_sex CHECK(sex='男' OR sex='女'),
CONSTRAINT CK_Upassword CHECK (LEN(Upassword)>=6)
)
要求創建一個存儲過程,實現插入用戶表數據時,插入的密碼自動轉換成明文(用SQL的內置函數實現MD5加密),在存儲過程中捕捉Check約束或觸發器約束中拋出異常。這樣可以比較方便的實現數據校驗,並且減少存儲過程中的多對多數據的判斷)
三、遇到的問題及解決方法
第三問中:
最後一個@dbname無法識別
猜測是因爲變量@dbname 字符串有引號
局部變量的作用域是其被聲明時所在批處理
四、實驗總結
1 SQL的三層安全機制
SQL運行安全防線 | 只有用戶登錄成功,才能與SQL server 建立一次連接 |
---|---|
SQL數據庫的安全防線 | 每個數據庫都有自己的用戶和角色,該數據庫只能由它的用戶和角色訪問,從而避免非法用戶對數據庫的訪問 |
SQL數據庫對象的安全防線 | 權限管理,合法用戶必須在自己的權力範圍內進行數據操作。 |
2 事務管理
事務控制語句
--#定義事務的開始
BEGIN TRANSACTION T1
--#提交事務,結束一個事務
COMMIT TRAN
--# 回滾事務到事務的開頭或一個保存點
ROLLBACK TRAN
--# 在事務中設置一個保存點,是一個事務內的部分操作回滾
SAVE TRAN save_name
--# @@ERROR 記錄數據庫最新錯誤的消息
--#@@TRANSCTION 初始值爲0 每次BEGIN TRAN 則加1,commit 時減1,rollback則直接回到0
封鎖機制 sp_lock
事務日誌
3 三層安全機制 存儲過程總結
添加SQL server服務器登錄帳戶 | exec sp_addlogin ‘wmy’ ,‘123456’ sp_droplogin |
---|---|
添加某數據庫的訪問用戶 | exec sp_grantdbaccess ‘wmy’,‘wmyDB’ |
刪除某數據庫的用戶 | exec sp_revokedbaccess ‘wmyDB’ |
對SQL server服務器擁有所有操作權sysadmin | exec sp_addsrvrolemember ‘wmy’ ,‘sysadmin’ |
取消某用戶的對SQL server服務器擁有的所有操作權 | exec sp_dropsrvrolemember ‘wmy’,‘sysadmin’ |
對某數據庫有任意操作權限db_owner | exec sp_addrolemenber ‘db_owner’,‘wmyDB’ |
授予某數據庫用戶某種權力 | GRANT SELECT ON TABLE1 TO wmyDB DENY INSER ,UPDATE ,DELETE ON TABLE1 TO wmyDB |
數據庫創建角色 | exec sp_addrole ‘moniter_role’(角色名稱) |
爲某用戶賦予某角色 | exec sp_addrolemember ‘monitor_role’,‘wmy’ |
| exec sp_addrole 'moniter_role'(角色名稱) |
| 爲某用戶賦予某角色 | exec sp_addrolemember ‘monitor_role’,‘wmy’ |