在
SQL Server
中备份
/
还原
/
分离
/
脱机
/
删除指定数据库时
,
如果有其他用户正在使用此数据库时
, SQL Server
为了防止数据异常
,
会报错而终止你的操作
.
当然, 在SQL 2005里, 在做[分离/删除]数据库时提供了一个选项[关闭所以连接]供勾选(SQL 2000好像没有哦), 然而[备份/还原]操作却没有此选择, 也许你会说可以先[脱机数据库]再做[备份还原]操作, 对, 但你会发现[脱机]处理太慢了
J
,
那在SQL2005以及SQL 2000下有哪些方法可以解决此问题呢???
2.
解决方法
:
1.
拔掉此机器的网线
.
呵呵
,
这种方法立竿见影
,
但是可能对其他的连接造成影响
.
2.
通知连接至此数据库的用户断开连接
.
如果可能连接的用户很多或不知道哪个用户正在连接的话就不可行了
.
3.
在
SQL Server
中用命令
StopLogin
强行断开连接
.
详细说明如下
:
使用说明
:
StopLogin
@Dname
其中
@Dname
为要强行断开连接的数据库名称
,
如果您想断开数据库
’DEMO’
的所有连接
,
则只要在查询分析器中执行
[StopLogin
’DEMO’
]
即可
,
如果您要断开所有数据库的连接进行维护的话则只要执行
[StopLogin
’’
]
即可
.
下面用例子说明
:
EX1.
使用
StopLogin
强行断开连接前后
SQL
的执行结果对比
首先
,
我们执行如下
SQL
语句
:
USE
DEMO2
SELECT
TOP
1
*
FROM
INVMB
执行结果为
:
查询已成功执行
下面我们来执行如下
SQL
语句
:
StopLogin
'DEMO2'
执行结果为
:
由于数据库'DEMO2' 离线,无法打开该数据库。
3.
StopLogin
详细代码
(
写的仓促
,
若有
bug
请谅解
)
IF
EXISTS
(
SELECT
*
FROM
dbo
.
sysobjects
WHERE
id
=
object_id
(
N'[dbo].[StopLogin]'
)
and
OBJECTPROPERTY
(
id
,
N'IsProcedure'
)
=
1
)
DROP
PROCEDURE
[dbo]
.
[StopLogin]
CREATE
PROCEDURE
StopLogin
@Dname varchar
(
50
)
DECLARE
@name varchar
(
50
),
@s varchar
(
1000
)
BEGIN
IF
(
@Dname
=
''
)
BEGIN
DECLARE
DataName
CURSOR
FOR
SELECT
name
FROM
sysdatabases
WHERE
name
not
in
(
'master'
)
OPEN
DataName
FETCH
NEXT
FROM
DataName
INTO
@name
WHILE
(
@@FETCH_STATUS
=
0
)
BEGIN
DECLARE
tb
CURSOR
local
SELECT
N'kill '
+
CAST
(
spid
AS
varchar
)
FROM
master
..
sysprocesses
WHERE
dbid
=
db_id
(
@name
)
OPEN
tb
FETCH
next
FROM
tb
INTO
@s
WHILE
@@FETCH_STATUS
=
0
BEGIN
EXEC
(
@s
)
FETCH
NEXT
FROM
tb
INTO
@s
CLOSE
tb
DEALLOCATE
tb
FETCH
NEXT
FROM
DataName
INTO
@name
CLOSE
DataName
DEALLOCATE
DataName
BEGIN
DECLARE
tb
CURSOR
local
SELECT
N'kill '
+
CAST
(
spid
AS
varchar
)
FROM
master
..
sysprocesses
WHERE
dbid
=
db_id
(
@Dname
)
OPEN
tb
FETCH
next
FROM
tb
INTO
@s
WHILE
@@FETCH_STATUS
=
0
BEGIN
EXEC
(
@s
)
FETCH
NEXT
FROM
tb
INTO
@s
CLOSE
tb
DEALLOCATE
tb
========================================================================
最好的方法就是 停止服务 即可,,,