none
怎样查询数据库对象的状态 RRS feed

  • 问题

  • 比如,我想使用一个数据库db1,我想在使用前查询它是否正在被其他进程使用,如果正在被使用,那么我将稍后再用。
    2010年4月14日 7:01

答案

  • 经常用这个,。踢掉连接,还原数据库或者脱机数据库。前提是你要跟相关的人说好了,你要T掉连接了。

    create proc [dbo].[killspid] (@dbname varchar(20))

    as
    begin
    declare @sql nvarchar(500)
    declare @spid int
    set @sql='declare getspid cursor for
    select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
    exec (@sql)
    open getspid
    fetch next from getspid into @spid
    while @@fetch_status <>-1
    begin
    exec('kill '+@spid)
    fetch next from getspid into @spid
    end
    close getspid
    deallocate getspid
    end

    GO

     

    在master数据库下执行

    killspid '数据库名字'

     

     

    2010年4月15日 1:00
  • 可以考虑查询 syslockinfo

    除非是 with nolock  查询, 否则对象被引用时都会加锁

     而使用 with nolock 访问的话, 其他进程操作这个对象也不会有什么问题

    2010年4月15日 4:27

全部回复

  • 执行

    sp_who

    然后在结果里面检查 是否存在 status='runnable' and dbname='db1'
    如果有 表面有 对应的loginname的用户登录在使用这个数据库

    但是,这个状态并不是表示一个持续的动作,只是你查询的瞬间状态。


    family as water
    2010年4月14日 8:37
  • select * from master.sys.sysprocesses where dbid=db_id('數據庫') and spID<>@@spid--不等於當前進程
    ROY WU(吳熹)
    2010年4月14日 8:55
    版主
  • 我试了,但是有时的状态是“suspended”,应该是在写log, 所以不是总能得到“runnable” 。还有更好的办法吗?

     

    2010年4月14日 9:42
  • select * from master.sys.sysprocesses where dbid=db_id('數據庫') and spID<>@@spid and status = 'runnable'
    2010年4月14日 14:27
  • 经常用这个,。踢掉连接,还原数据库或者脱机数据库。前提是你要跟相关的人说好了,你要T掉连接了。

    create proc [dbo].[killspid] (@dbname varchar(20))

    as
    begin
    declare @sql nvarchar(500)
    declare @spid int
    set @sql='declare getspid cursor for
    select spid from sysprocesses where dbid=db_id('''+@dbname+''')'
    exec (@sql)
    open getspid
    fetch next from getspid into @spid
    while @@fetch_status <>-1
    begin
    exec('kill '+@spid)
    fetch next from getspid into @spid
    end
    close getspid
    deallocate getspid
    end

    GO

     

    在master数据库下执行

    killspid '数据库名字'

     

     

    2010年4月15日 1:00
  • 可以考虑查询 syslockinfo

    除非是 with nolock  查询, 否则对象被引用时都会加锁

     而使用 with nolock 访问的话, 其他进程操作这个对象也不会有什么问题

    2010年4月15日 4:27