У меня есть приложение C#, которое создает базу данных, таблицы с использованием кода T- SQL, выполняемого классом SqlCommand
.
Некоторые сценарии, которые выполняются с помощью 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
C# кода для выполнения вышеуказанного sql кода:
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 владельца базы данных, записанный в базе данных master, отличается от SID владельца базы данных, записанной в базе данных 'FooDatabase ». Вы должны исправить эту ситуацию, сбросив владельца базы данных «FooDatabase» с помощью инструкции ALTER AUTHORIZATION. Параметр конфигурации «Показать дополнительные параметры» изменен с 1 на 1. Запустите инструкцию RECONFIGURE для установки. Параметр конфигурации 'clr enabled' изменен с 1 на 1. Запустите инструкцию RECONFIGURE для установки. Изменен контекст базы данных на «FooDatabase».
Если я использую следующую строку подключения, ошибки не будет:
"Data Source=SQL100;Initial Catalog=;User ID=foouser;Password=foopassword
Что я делаю неправильно? Как можно решить эту проблему? Любая помощь будет принята с благодарностью!
ОБНОВЛЕНИЕ:
Я пытался использовать принятый ответ на этот вопрос , однако я вижу следующая ошибка:
Предполагаемый новый владелец базы данных уже является пользователем или имеет псевдоним в базе данных. SID владельца базы данных, записанный в базе данных master, отличается от SID владельца базы данных, записанной в базе данных 'FooDatabase'. Вы должны исправить эту ситуацию, сбросив владельца базы данных «FooDatabase» с помощью инструкции ALTER AUTHORIZATION. Параметр конфигурации «Показать дополнительные параметры» изменен с 1 на 1. Запустите инструкцию RECONFIGURE для установки. Параметр конфигурации 'clr enabled' изменен с 1 на 1. Запустите инструкцию RECONFIGURE для установки. Изменен контекст базы данных на «FooDatabase».