如果你使用的是虚拟主机的MSSQL数据库,你是不用做太多配置的,因为主要的配置工作是需要在服务器上完成的,你现在有的这些选项是站长常规维护用的,下面的方法是需要你的虚拟主机商操作的,你可以让他尝试下,如果还是不可以,再看有什么办法,我一向使用的是MYSQL,所以对MSSQL不是特别的熟悉,不知道能不能帮到你!单行分割线下面是另一个解决方法,也可以参考下.
*****方法一*****
问题原因:
把数据库备份还原到另一个服务器时,可能会产生孤立用户的问题;
解决办法:
步骤:
1.把备份的数据库还原到新的数据库服务器中(1.1企业管理器-->1.2数据库(右键)-->1.3所有任务-->1.4还原数据库-->1.5常规/还原为数据库/写上你要的数据库名字xxxx/选中从设备/选择设备/添加(浏览找到你的数据库备份文件)/确定/确定/确定-->1.6选项-->1.7将数据库还原为f:\usr\xxxx.mdf一般存放在你sql安装的目录下如:d:\Program Files\Microsoft SQL Server\MSSQL\Data\xxxx.mdf-->1.8确定就ok了!!
2. 查看你刚刚还原的数据库中的用户如:abc;
3. 查看安全性下面的登陆用户中是否有:abc如果没有此时的abc就是一个孤立用户;
4.打开查询分析器运行脚本
use 数据库名
go
DECLARE @sid BINARY(16)
SELECT @sid=sid FROM sysusers WHERE name='abc' and islogin=1
exec sp_addlogin @loginame = 'abc',@sid = @sid
5.注意,应该是先还原,如果事先在sql的安全性--登录中已经创建abc这个登录,则先删除它,再执行上面的语句.同过上面的就能解决问题了!======================================================================
总结:孤立用户疑难解答
把数据库备份还原到另一个服务器时,可能会遇到孤立用户的问题。下面的方案显示解决了这个问题:
通过执行sp_addlogin,把登录 janetl 改名为 dbo。
sp_addlogin 'janetl', 'dbo'
备份数据库。在本例中,备份 Northwind。
BACKUP DATABASE Northwind
TO DISK = 'c:\mssql\backup\northwnd'
除去刚刚备份的数据库。
DROP DATABASE Northwind
除去登录。
sp_droplogin 'janetl'
还原备份的数据库。
RESTORE DATABASE Northwind
FROM DISK = 'c:\mssql\backup\northwnd'
janetl 登录不能访问 Northwind 数据库,除非允许 guest 登录。尽管 janetl 登录已经删除,它仍然(作为一个孤立行)显示在 sysusers 表中:
USE Northwind
SELECT *
FROM sysusers
WHERE name = 'janetl'
解决孤立用户问题
用 sp_addlogin 添加一个临时登录。为孤立用户指定安全标识符(SID)(从 sysusers)。
sp_addlogin @loginame = 'nancyd',@sid = 0x32C864A70427D211B4DD00104B9E8A00
用 sp_dropalias 除去属于别名 SID 的临时别名。
sp_dropalias 'nancyd'
用 sp_dropuser 除去原始用户(即现在的孤立用户)。
sp_dropuser 'janetl'
用 sp_dropuser 除去原始登录。
sp_droplogin 'nancyd'
========================================
孤立用户的产生演示
创建一个测试的数据库
CREATE DATABASE DB_test
go
创建一个登录
EXEC sp_addlogin 'aa'
设置登录 aa 的默认数据库为测试数据库 DB_test
EXEC sp_defaultdb 'aa','DB_test'
go
切换到测试数据库
USE DB_test
go
为登录 aa 在当前测试数据库中添加用户
EXEC sp_grantdbaccess 'aa'
go
至此,用户 aa 登录后,其默认的当前数据库就是 DB_test
我们可以在查询分析器,使用用户 aa 登录一下,来验证我们的测试环境
备份测试数据库,为下面的测试做准备
{
BACKUP DATABASE DB_test TO DISK='c:\DB_test.bak' WITH INIT
go
/*=================== 产生孤立用户 ======================*/
切换到 master 数据库
USE master
go
删除测试数据库
DROP DATABASE DB_test
go
删除登录 aa
EXEC sp_droplogin 'aa'
go
/*=================== 孤立用户表现形式1 ======================*/
还原测试数据库
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go
切换到测试数据库
USE DB_test
go
查看用户信息
select name from sysusers where islogin=1
我们会发现,虽然我们已经将登录 aa 删除了,但用户 aa 仍然存在于数据库中
尝试一下,用 aa 登录,被告知登录失败
go
再把删除的登录添加回去
EXEC sp_addlogin 'aa'
设置登录 aa 的默认数据库为测试数据库 DB_test
EXEC sp_defaultdb 'aa','DB_test'
再次登录,被告知无法打开默认数据库,登录失败
go
于是把默认数据库改为 master
EXEC sp_defaultdb 'aa','master'
这次再登录,就可以登录了
go
尝试切换到测试数据库 DB_test
USE DB_test
得到错误信息: 服务器用户 'aa' 不是数据库 'DB_test' 中的有效用户。
看来用户 aa 与登录 aa 失去了联系
go
尝试重新为登录 aa 添加用户 aa
EXEC sp_grantdbaccess 'aa'
得到错误信息:当前数据库中已存在用户或角色 'aa'。
这次我们换个顺序,先建立登录,再恢复数据库,看能否使登录与用户自动建立回联系
做这个测试之前,先清理测试环境,即做前面的<产生孤立用户>步骤,然后再开始测试
先添加登录
EXEC sp_addlogin 'aa'
go
还原测试数据库
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go
切换到测试数据库
USE DB_test
go
查看用户信息
select name from sysusers where islogin=1
我们会发现,用户aa存在于数据库中
尝试一下,用aa登录,并切换到 DB_test
结果是登录成功,访问DB_test出现和测试1一样的错误
for SQL Server 错误 '80040e37'
对象名 'Dv_User' 无效。
/***.asp,行 *
先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错.
重写了一下代码,结果还是一样.
怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误.判断是数据库出现了问题.数据库链接没错.导入也没错.
go了一把,就解决了.
把所有表的所有者改为DBO即可。
执行下面语句,更改所有表的所有者为DBO
exec sp_msforeachtable "sp_changeobjectowner '?','dbo'"
*在如何修改数据库所有者的操作上出现了点曲折,做总结如下:
1:只需 运行sp_changeobjectowner '表名','dbo'即可;
2.但要将所有的表的所有者都改为dbo,可以用循环处理,此处略;
3.其实用SQL的系统存储过程sp_MSForEachTable可以轻松搞定,只需运行
exec sp_MSForEachTable 'sp_changeobjectowner ''?'', ''dbo'''。
当然,可能运行时会有错误出现,(比如有些表的所有者原先就是dbo,会提示“因为新所有者 'dbo' 已有同名的对象。”),再次运行该语句一遍。
------------------------------------------------------------------------------------------------------------------------------------
*****方法二*****
Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft OLE DB Provider for SQL Server 错误 '80040e37'
对象名 'X__Siteconfig' 无效。
/rc/conn/conn.asp,行16
先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错.
重写了一下代码,结果还是一样.
怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误.
判断是数据库出现了问题.数据库链接没错.
导入也没错.
百度一下:
把所有表的所有者改为DBO就OK了
SQL如何更改所有表的所有者
单个修改所有者sql语句如下:
查询分析器输入:EXEC sp_changeobjectowner 'user.table', 'dbo'
user.table的意思为:所有者.表名,比如oblog.oblog_user,以前的语句表示将table这张表的所有者由
user改成dbo
批量修改所有者语句如下:
查询分析器输入:exec sp_msforeachtable 'sp_changeobjectowner "?", "dbo"'
即可把当面表的所有所有者换成dbo
*****方法一*****
问题原因:
把数据库备份还原到另一个服务器时,可能会产生孤立用户的问题;
解决办法:
步骤:
1.把备份的数据库还原到新的数据库服务器中(1.1企业管理器-->1.2数据库(右键)-->1.3所有任务-->1.4还原数据库-->1.5常规/还原为数据库/写上你要的数据库名字xxxx/选中从设备/选择设备/添加(浏览找到你的数据库备份文件)/确定/确定/确定-->1.6选项-->1.7将数据库还原为f:\usr\xxxx.mdf一般存放在你sql安装的目录下如:d:\Program Files\Microsoft SQL Server\MSSQL\Data\xxxx.mdf-->1.8确定就ok了!!
2. 查看你刚刚还原的数据库中的用户如:abc;
3. 查看安全性下面的登陆用户中是否有:abc如果没有此时的abc就是一个孤立用户;
4.打开查询分析器运行脚本
use 数据库名
go
DECLARE @sid BINARY(16)
SELECT @sid=sid FROM sysusers WHERE name='abc' and islogin=1
exec sp_addlogin @loginame = 'abc',@sid = @sid
5.注意,应该是先还原,如果事先在sql的安全性--登录中已经创建abc这个登录,则先删除它,再执行上面的语句.同过上面的就能解决问题了!======================================================================
总结:孤立用户疑难解答
把数据库备份还原到另一个服务器时,可能会遇到孤立用户的问题。下面的方案显示解决了这个问题:
通过执行sp_addlogin,把登录 janetl 改名为 dbo。
sp_addlogin 'janetl', 'dbo'
备份数据库。在本例中,备份 Northwind。
BACKUP DATABASE Northwind
TO DISK = 'c:\mssql\backup\northwnd'
除去刚刚备份的数据库。
DROP DATABASE Northwind
除去登录。
sp_droplogin 'janetl'
还原备份的数据库。
RESTORE DATABASE Northwind
FROM DISK = 'c:\mssql\backup\northwnd'
janetl 登录不能访问 Northwind 数据库,除非允许 guest 登录。尽管 janetl 登录已经删除,它仍然(作为一个孤立行)显示在 sysusers 表中:
USE Northwind
SELECT *
FROM sysusers
WHERE name = 'janetl'
解决孤立用户问题
用 sp_addlogin 添加一个临时登录。为孤立用户指定安全标识符(SID)(从 sysusers)。
sp_addlogin @loginame = 'nancyd',@sid = 0x32C864A70427D211B4DD00104B9E8A00
用 sp_dropalias 除去属于别名 SID 的临时别名。
sp_dropalias 'nancyd'
用 sp_dropuser 除去原始用户(即现在的孤立用户)。
sp_dropuser 'janetl'
用 sp_dropuser 除去原始登录。
sp_droplogin 'nancyd'
========================================
孤立用户的产生演示
创建一个测试的数据库
CREATE DATABASE DB_test
go
创建一个登录
EXEC sp_addlogin 'aa'
设置登录 aa 的默认数据库为测试数据库 DB_test
EXEC sp_defaultdb 'aa','DB_test'
go
切换到测试数据库
USE DB_test
go
为登录 aa 在当前测试数据库中添加用户
EXEC sp_grantdbaccess 'aa'
go
至此,用户 aa 登录后,其默认的当前数据库就是 DB_test
我们可以在查询分析器,使用用户 aa 登录一下,来验证我们的测试环境
备份测试数据库,为下面的测试做准备
{
BACKUP DATABASE DB_test TO DISK='c:\DB_test.bak' WITH INIT
go
/*=================== 产生孤立用户 ======================*/
切换到 master 数据库
USE master
go
删除测试数据库
DROP DATABASE DB_test
go
删除登录 aa
EXEC sp_droplogin 'aa'
go
/*=================== 孤立用户表现形式1 ======================*/
还原测试数据库
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go
切换到测试数据库
USE DB_test
go
查看用户信息
select name from sysusers where islogin=1
我们会发现,虽然我们已经将登录 aa 删除了,但用户 aa 仍然存在于数据库中
尝试一下,用 aa 登录,被告知登录失败
go
再把删除的登录添加回去
EXEC sp_addlogin 'aa'
设置登录 aa 的默认数据库为测试数据库 DB_test
EXEC sp_defaultdb 'aa','DB_test'
再次登录,被告知无法打开默认数据库,登录失败
go
于是把默认数据库改为 master
EXEC sp_defaultdb 'aa','master'
这次再登录,就可以登录了
go
尝试切换到测试数据库 DB_test
USE DB_test
得到错误信息: 服务器用户 'aa' 不是数据库 'DB_test' 中的有效用户。
看来用户 aa 与登录 aa 失去了联系
go
尝试重新为登录 aa 添加用户 aa
EXEC sp_grantdbaccess 'aa'
得到错误信息:当前数据库中已存在用户或角色 'aa'。
这次我们换个顺序,先建立登录,再恢复数据库,看能否使登录与用户自动建立回联系
做这个测试之前,先清理测试环境,即做前面的<产生孤立用户>步骤,然后再开始测试
先添加登录
EXEC sp_addlogin 'aa'
go
还原测试数据库
RESTORE DATABASE DB_test FROM DISK='c:\DB_test.bak'
go
切换到测试数据库
USE DB_test
go
查看用户信息
select name from sysusers where islogin=1
我们会发现,用户aa存在于数据库中
尝试一下,用aa登录,并切换到 DB_test
结果是登录成功,访问DB_test出现和测试1一样的错误
for SQL Server 错误 '80040e37'
对象名 'Dv_User' 无效。
/***.asp,行 *
先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错.
重写了一下代码,结果还是一样.
怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误.判断是数据库出现了问题.数据库链接没错.导入也没错.
go了一把,就解决了.
把所有表的所有者改为DBO即可。
执行下面语句,更改所有表的所有者为DBO
exec sp_msforeachtable "sp_changeobjectowner '?','dbo'"
*在如何修改数据库所有者的操作上出现了点曲折,做总结如下:
1:只需 运行sp_changeobjectowner '表名','dbo'即可;
2.但要将所有的表的所有者都改为dbo,可以用循环处理,此处略;
3.其实用SQL的系统存储过程sp_MSForEachTable可以轻松搞定,只需运行
exec sp_MSForEachTable 'sp_changeobjectowner ''?'', ''dbo'''。
当然,可能运行时会有错误出现,(比如有些表的所有者原先就是dbo,会提示“因为新所有者 'dbo' 已有同名的对象。”),再次运行该语句一遍。
------------------------------------------------------------------------------------------------------------------------------------
*****方法二*****
Microsoft VBScript 编译器错误 错误 '800a03f6'
缺少 'End'
/iisHelp/common/500-100.asp,行242
Microsoft OLE DB Provider for SQL Server 错误 '80040e37'
对象名 'X__Siteconfig' 无效。
/rc/conn/conn.asp,行16
先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错.
重写了一下代码,结果还是一样.
怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误.
判断是数据库出现了问题.数据库链接没错.
导入也没错.
百度一下:
把所有表的所有者改为DBO就OK了
SQL如何更改所有表的所有者
单个修改所有者sql语句如下:
查询分析器输入:EXEC sp_changeobjectowner 'user.table', 'dbo'
user.table的意思为:所有者.表名,比如oblog.oblog_user,以前的语句表示将table这张表的所有者由
user改成dbo
批量修改所有者语句如下:
查询分析器输入:exec sp_msforeachtable 'sp_changeobjectowner "?", "dbo"'
即可把当面表的所有所有者换成dbo