如何限制单个用户访问存储过程?

简介:

由于有些存储过程涉及到很多表数据的更改,所以每次只能运行一个用户访问。如果多个用户访问的话就会造成数据的出现问题(比如存储过程使用一张中间表做数据存储,会用到删除更新,如果第一个用户正在更新的时候,第二个用户删除数据,那么第一个用户的数据就会丢失)。曾经看到有用控制板来控制存储过程的运行。运行存储过程之前先检查控制表的状态,如果发现有用户正在运行则返回错误结果。

 

其实不需要额外开发只需要调用系统存储过程sp_getapplock就可以实现相同的功能。使用sp_getapplock可以对应用程序资源设置锁。

 

--首先创建测试表并且插入数据:

CREATE TABLEperson(namevarchar(20),idint)

insert into person values ('kevin',1)

 

--创建自定义错误信息

EXECUTE sp_addmessage

  @msgnum  = 51005,

   @severity = 16,

   @msgtext  = N'Someone is running thisstored proc, please try later.',

   @lang     = 'us_english',

   @replace  = REPLACE

 

 

--创建存储过程在存储过程中使用sp_getapplock  

CREATE PROCEDUREusp_Test

  ( @ID   int,

      @Name     varchar(20)

   )

AS

   BEGIN

      SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

      BEGIN TRANSACTION

      DECLARE @LockResult int

      EXECUTE @LockResult = sp_getapplock

         @Resource   = 'testsp_getapplock',

         @LockMode    = 'Exclusive',

         @LockTimeout = 0

         IF @LockResult <> 0

           BEGIN

              ROLLBACK TRANSACTION

              RAISERROR (51005, 16, 1)

              RETURN

           END

         -- 获得独占所以后可以确保下面的语句只能有一个用户执行

          --   为了测试这里等待30S

         WAITFOR DELAY '00:00:20'

         UPDATE person    SET name= @Name      WHEREid = @ID

         EXECUTE sp_releaseapplock

            @Resource= 'testsp_getapplock'

      COMMIT TRANSACTION

   END

GO

 

 

打开一个查询界面执行下面的语句:

usp_Test 1,'allen'

  

在另外一个查询界面执行同样的语句会得到错误:

Msg 51005, Level 16, State 1,Procedure usp_Test, Line 21

Someone is running this stored proc,please try later.

 

等到第一个查询界面的语句执行成功后在执行第二个查询语句成功

 

另外sp_getapplock还可以用来解决多个用户同时获取最大值的问题。需要注意的是程序在调用存储过程的时候需要根据错误作出相应的处理,比如重拾等等。 

 

更多信息参考MSDN: http://msdn.microsoft.com/zh-cn/library/ms189823.aspx


本文转自 lzf328 51CTO博客,原文链接:

http://blog.51cto.com/lzf328/1030132
相关文章
|
4月前
|
存储 SQL 定位技术
数据库基础(五):存储过程与触发器的创建、执行、修改、删除
数据库基础(五):存储过程与触发器的创建、执行、修改、删除
|
4月前
|
存储 SQL 定位技术
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
数据库基础(六):T-SQL语言程序设计、游标定义与使用及存储过程创建与信息查找
|
8月前
|
SQL 存储 安全
PHPMySQL防注入 如何使用安全的函数保护数据库
在进行PHP编程开发时,安全性一直是开发人员必须注意的问题,其中最重要的是防止SQL注入攻击。SQL注入攻击是指通过输入恶意代码来攻击数据库的一种方式,攻击者通过输入SQL语句来绕过程序的安全机制,达到控制和操作数据库的目的。为了避免这种安全问题的发生,本文将介绍如何使用安全的函数保护数据库。
52 0
|
SQL 数据库
【脚本】快速获得当前用户下“暂忘”的数据库对象信息
对SQL*Plus情有独钟的朋友一定遇到过这样的问题:突然忘记了表的全名(或者其他数据库对象名),仅依稀记得它包含几个字母,怎么可以最快速知道具体的名字呢? 最快速的回答:使用数据字典视图可以达到提示自己的目的。 例如使用如下的SQL语句遍可获得当前用户下所有包含“TMP”关键字的数据库对象信息。 select * from obj where object_name like '%TMP%'; 完全正确,但是没有达到我们“快速”的目的。我这里给出一个非常简单的脚本(以obj为基础进行了简单的格式化),以便达到快速获得提示信息的目的。 1.脚本内容如下,有兴趣的朋友可以在这个基础上进一步
73 0
|
SQL 存储 数据库管理
fbh
|
安全 数据库 数据安全/隐私保护
SQLServer控制用户访问权限表
一、需求 在管理数据库过程中,我们经常需要控制某个用户访问数据库的权限,比如只需要给这个用户访问某个表的权限,甚至是CRUD的权限,更小粒度的还可以去到某几个字段的访问权限。
fbh
1271 0