我有一个C#应用程序,它使用SqlCommand类执行的T代码创建数据库和表。
一些由SqlCommand执行的脚本
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'clr enabled', 1;
RECONFIGURE;
use FooDatabase;
if exists (select * from sys.objects where name = 'CreateLineString')
drop aggregate dbo.CreateLineString;
if exists (select * from sys.objects where name = 'GeographyUnion')
drop aggregate dbo.GeographyUnion;
if exists (select * from sys.objects where name = 'ConvertToPolygon')
drop function dbo.ConvertToPolygon;
if exists (select * from sys.assemblies where name = 'osm2mssqlSqlExtension')
drop assembly osm2mssqlSqlExtension;
create assembly osm2mssqlSqlExtension FROM 0x4D5A900 /* some numbers more here ...*/
300000 WITH PERMISSION_SET = UNSAFE;
GO
create aggregate dbo.CreateLineString(@lat float,@lon float,@sort int) returns geography
external name osm2mssqlSqlExtension.[OsmImporter.DbExtensions.LineStringBuilder];
GO
create aggregate dbo.GeographyUnion(@geo geography) returns geography
external name osm2mssqlSqlExtension.[OsmImporter.DbExtensions.GeographyUnion];
GO
create function dbo.ConvertToPolygon(@geo geography) returns geography
as external name [osm2mssqlSqlExtension].[OsmImporter.DbExtensions.Functions].ConvertToPolygon;
GO执行上述sql代码的C#代码:
protected void ExecuteSqlCmd(string sqlCommand)
{
var sqlCommands = sqlCommand.Split(
new[]
{
"GO"
}, StringSplitOptions.RemoveEmptyEntries);
var connString = Connection.ToString();
using (var con = new SqlConnection() { ConnectionString = Connection.ToString() })
{
foreach (var sql in sqlCommands)
{
con.Open();
using (var cmd = new SqlCommand() { Connection = con })
{
cmd.CommandTimeout = int.MaxValue;
cmd.CommandText = sql;
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw;
}
}
con.Close();
}
}
} 当我使用以下连接字符串时:
"Data Source=SQL100;Initial Catalog=;Integrated Security=True"然后我看到以下错误:
主数据库中记录的数据库所有者SID与数据库“FooDatabase”中记录的数据库所有者SID不同。您应该通过使用ALTER授权语句重置数据库'FooDatabase‘的所有者来纠正这种情况。配置选项“显示高级选项”从1更改为1。请运行重新配置语句来安装。配置选项“clr已启用”从1更改为1。运行要安装的重新配置语句。将数据库上下文更改为“FooDatabase”。
如果使用以下连接字符串,则没有错误:
"Data Source=SQL100;Initial Catalog=;User ID=foouser;Password=foopassword我做错了什么?如何才能解决这个问题呢?任何帮助都将不胜感激!
更新:
我尝试过使用这个问题的公认答案,但是我看到了以下错误:
建议的新数据库所有者已经是用户或数据库中的别名。主数据库中记录的数据库所有者SID与数据库“FooDatabase”中记录的数据库所有者SID不同。您应该通过使用ALTER授权语句重置数据库'FooDatabase‘的所有者来纠正这种情况。配置选项“显示高级选项”从1更改为1。请运行重新配置语句来安装。配置选项“clr已启用”从1更改为1。运行要安装的重新配置语句。将数据库上下文更改为“FooDatabase”。
发布于 2020-01-15 11:58:57
我不知道发生此错误的原因。然而,找到了解决办法。感谢这篇伟大的文章!。有必要在新创建的数据库中重新创建用户。
整个代码如下所示:
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure 'clr enabled', 1;
RECONFIGURE;
use FooDatabase;
DECLARE @user NVARCHAR(max);
SELECT @user = SL.Name
FROM master..sysdatabases SD
JOIN master..syslogins SL ON SD.SID = SL.SID
WHERE SD.Name = DB_NAME()
IF ((SELECT 1 FROM sys.database_principals WHERE name = @user) = 1)
BEGIN
EXEC sp_dropuser @user
END
DECLARE @Command VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::[<<DatabaseName>>] TO
[<<LoginName>>]'
SELECT @Command = REPLACE(REPLACE(@Command
, '<<DatabaseName>>', SD.Name)
, '<<LoginName>>', SL.Name)
FROM master..sysdatabases SD
JOIN master..syslogins SL ON SD.SID = SL.SID
WHERE SD.Name = 'FooDatabase'
EXEC(@Command)
create assembly osm2mssqlSqlExtension FROM 0x4D5A900 /* some numbers more here ...*/
300000 WITH PERMISSION_SET = UNSAFE;
/* The other code is omitted for the brevity */发布于 2020-01-15 08:16:23
当从备份还原的数据库和数据库所有者的SID与主database.Try中列出的所有者SID不匹配时,可能会出现此问题。
DECLARE @Cmd VARCHAR(MAX) = 'ALTER AUTHORIZATION ON DATABASE::[<<DatabaseName>>] TO
[<<LoginName>>]'
SELECT @Cmd = REPLACE(REPLACE(@Cmd
, '<<DatabaseName>>', SD.Name)
, '<<LoginName>>', SL.Name)
FROM master..sysdatabases SD
JOIN master..syslogins SL ON SD.SID = SL.SID
WHERE SD.Name = DB_NAME()
PRINT @Cmd
EXEC(@Cmd)或
USE [DatabaseName]
GO
-- Option #1
EXEC sp_changedbowner 'sa'
GO
-- OR--
-- Option #2
ALTER AUTHORIZATION ON DATABASE::[DatabaseName] TO [sa]
GOhttps://stackoverflow.com/questions/59747081
复制相似问题