【发布时间】:2020-05-01 23:08:41
【问题描述】:
我有一个 C# 应用程序,它使用 SqlCommand 类执行的 T-SQL 代码创建数据库和表。
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"
然后我看到以下错误:
master 数据库中记录的数据库所有者 SID 与 记录在数据库“FooDatabase”中的数据库所有者 SID。你应该 通过重置数据库的所有者来纠正这种情况 'FooDatabase' 使用 ALTER AUTHORIZATION 语句。配置 选项“显示高级选项”从 1 更改为 1。运行 RECONFIGURE 语句进行安装。配置选项“启用 clr” 从 1 更改为 1。运行 RECONFIGURE 语句进行安装。改变了 'FooDatabase' 的数据库上下文。
如果我使用下面的连接字符串,没有错误:
"Data Source=SQL100;Initial Catalog=;User ID=foouser;Password=foopassword
我做错了什么?如何解决这个问题?任何帮助将不胜感激!
更新:
我尝试use the accepted answer from this question,但是我看到以下错误:
建议的新数据库所有者已经是用户或别名 数据库。 master数据库中记录的数据库所有者SID 与数据库中记录的数据库所有者 SID 不同 'Foo 数据库'。您应该通过重置 使用 ALTER AUTHORIZATION 的数据库 'FooDatabase' 的所有者 陈述。配置选项“显示高级选项”从 1 更改 1.运行RECONFIGURE语句进行安装。配置选项 'clr enabled' 从 1 更改为 1。运行 RECONFIGURE 语句以 安装。将数据库上下文更改为“FooDatabase”。
【问题讨论】:
-
我尝试重现您的错误,但我不能。我似乎错过了您正在执行的步骤之一。我认为您应该修改您的帖子,更详细地描述您的设置,包括一些 c# 代码以及何时触发。否则我们都会继续猜测。例如,@Bibin 提供的答案只是解决了当您尝试用另一个备份(包括不同的使用 SID)覆盖您的 c# 创建的数据库时可能出现的情况。
-
@Thailo 请看我更新的问题
-
USE [FooDatabase] GO -- Option #1 EXEC sp_changedbowner 'sa' GO -- OR-- -- 选项 #2 ALTER AUTHORIZATION ON DATABASE::[FooDatabase] TO [sa] GO跨度>
-
你只需在你的 sql sever 查询中执行这个。然后连接这个连接字符串 "Data Source=SQL100;Initial Catalog=;Integrated Security=True"
标签: c# sql-server tsql ado.net sql-server-2017