SID владельца базы данных записал ошибку, когда Integrated security = true; - PullRequest
0 голосов
/ 15 января 2020

У меня есть приложение 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».

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Эта проблема может возникнуть, если база данных восстановлена ​​из резервной копии, а SID владельца базы данных не совпадает с SID владельца, указанным в базе данных master. Попробуйте этот

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]
    GO
1 голос
/ 15 января 2020

Я не знаю причину возникновения этой ошибки. Однако решение было найдено. Благодаря этой замечательной статье! . Необходимо было воссоздать пользователя во вновь созданной базе данных.

Весь код выглядит так:

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 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...