SQL server笔记:事务与SQL Server安全性管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36027342/article/details/89307551

事物:一个事务由一个或者多个完成一组的一组相关行为的SQL语句,通过事务机制确保这一组SQL所执行的操作要么完全成功的执行,要么一点也不执行。

事务特性:ACID,即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)

在SQL server中:

  • 自动提交事务:每条单独的语句都是一个事务,如果成功执行,则自动提交;如果错误,则自动回滚,这是 SQL Server 的默认模式;
  • 隐式事务:不需要描述事务的开始,只需要提交或回滚事务;SQL Server 将在提交或回滚当前事务后自动启动新事务。
  • 显式事务:每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束;开始事务:BEGIN TRANSACTION;提交事务:COMMIT TRANSACTION;回滚(撤销)事务:ROLLBACK TRANSACTION;查阅 SQL Server 联机丛书,掌握 CREATE PROCEDURE、CREATE TRIGGER 等语句的语法及使用。

1.自动提交事务与隐式事务

--自动提交事务
 insert into Reader values('rd2018110',1,'邱二','计算机科学学院','9322666',default)

--隐式事务
 set implicit_transactions on
  insert into Reader values('rd2018111',1,'邱三','计算机科学学院','9322666',default)
 go

 select * from Reader

运行结果:

2.与存储过程结合,使用事务来保证数据的一致性

--存储过程,实现借书功能;
alter procedure usp_borrow
	@rdID char(9),
	@bkID char(9),
	@DateBorrow datetime,
	@DateLendPlan datetime
as
  begin tran
	print'begin tran'
	begin	try
	  --先判断图书状态
		declare @bkState int
		select @bkState=bkState from Book where bkID=@bkID
		if(@bkState!=1)
		  raiserror('借书失败!!该图书不在馆!',16,1)
		else
		  begin	
		--判断读者借书是否已满
			declare @rdBorrowQty int,@canLendQty int

			select @canLendQty=canLendQty,@rdBorrowQty=rdBorrowQty from Reader,ReaderType 
			where rdID=@rdID and Reader.rdType=ReaderType.rdType;

			if(@rdBorrowQty>=@canLendQty)
			   raiserror('借书失败!!该读者借书已达上限!',16,1)
		  else 
			    begin
				  insert into Borrow(rdID,bkID,DateBorrow,DateLendPlan) 
		      values(@rdID,@bkID,	@DateBorrow,@DateLendPlan);
			    --修改图书状态
					update Book set bkState=0 where bkID=@bkID;
					--修改借书数量
					update Reader set rdBorrowQty=rdBorrowQty+1 where rdID=@rdID;
					print @rdID+'借'+@bkID+'成功!!'
					commit
					print'commit'
		      end
		  end
	end try
	begin catch
	  DECLARE @ErrorMessage NVARCHAR(4000)
	  select @ErrorMessage = ERROR_MESSAGE()
	  raiserror(@ErrorMessage,16,1)
		rollback
		print'rollback'
	end catch

测试执行


--测试执行
declare @date datetime,@date_plan datetime
--获取当前时间为借书时间
set @date=GETDATE()
--计划还书时间为借书后的第十天
set @date_plan=GETDATE()+10 
exec usp_borrow'rd2018001','bk2018001',@date,@date_plan

运行结果:

第一次运行,借书成功:

第二次运行

测试代码2:

运行结果:

.SQL Server 身份验证模式、登录帐户、数据库帐户、权限管理

1.新建两个登录帐户(帐户名:wtq,密码 wtq888; 帐户名:test,密码:test888), 其中,帐户 wtq可对BooksDB数据库中的ReaderType表进行SELECT、 INSERT操作,但无权进行DELETE、 UPDATE 操作。帐户 test 无权访问 BooksDB 数据库。

运行结果:

2.分别使用SSMS与SQL命令实现此功能: 授予帐户wtq 对ReaderType表进行DELETE、 UPDATE 操作的权限

实现代码:

sql语句:

 

SSMS实现:

猜你喜欢

转载自blog.csdn.net/weixin_36027342/article/details/89307551
今日推荐