【问题标题】:The database owner SID recorded error when Integrated security= true;Integrated security= true 时,数据库所有者 SID 记录错误;
【发布时间】: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


【解决方案1】:

当从备份恢复的数据库和数据库所有者的 SID 与主数据库中列出的所有者 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]
    GO

【讨论】:

  • 感谢您的回复。但是当我看到上述错误时,我的第一个动作是执行此代码。但是,它会引发另一个错误。
  • 我在更新的问题中添加了一个错误。请看我更新的问题。我相信这是足够的信息。
  • 我找到了解决方案。感谢您的努力。这很有帮助,但是我需要在您的解决方案中添加一些代码。我投了赞成票。非常感谢,伙计!:)
【解决方案2】:

我不知道发生此错误的原因。但是,找到了解决方案。 Thanks to this great article!。需要在新创建的数据库中重新创建用户。

整个代码如下所示:

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 */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 2010-12-23
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    相关资源
    最近更新 更多