首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库所有者SID在集成security= true时记录错误;

数据库所有者SID在集成security= true时记录错误;
EN

Stack Overflow用户
提问于 2020-01-15 07:54:09
回答 2查看 1.4K关注 0票数 0

我有一个C#应用程序,它使用SqlCommand类执行的T代码创建数据库和表。

一些由SqlCommand执行的脚本

代码语言:javascript
复制
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#代码:

代码语言:javascript
复制
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();
         }   
     }   
}    

当我使用以下连接字符串时:

代码语言:javascript
复制
"Data Source=SQL100;Initial Catalog=;Integrated Security=True"

然后我看到以下错误:

主数据库中记录的数据库所有者SID与数据库“FooDatabase”中记录的数据库所有者SID不同。您应该通过使用ALTER授权语句重置数据库'FooDatabase‘的所有者来纠正这种情况。配置选项“显示高级选项”从1更改为1。请运行重新配置语句来安装。配置选项“clr已启用”从1更改为1。运行要安装的重新配置语句。将数据库上下文更改为“FooDatabase”。

如果使用以下连接字符串,则没有错误:

代码语言:javascript
复制
"Data Source=SQL100;Initial Catalog=;User ID=foouser;Password=foopassword

我做错了什么?如何才能解决这个问题呢?任何帮助都将不胜感激!

更新:

我尝试过使用这个问题的公认答案,但是我看到了以下错误:

建议的新数据库所有者已经是用户或数据库中的别名。主数据库中记录的数据库所有者SID与数据库“FooDatabase”中记录的数据库所有者SID不同。您应该通过使用ALTER授权语句重置数据库'FooDatabase‘的所有者来纠正这种情况。配置选项“显示高级选项”从1更改为1。请运行重新配置语句来安装。配置选项“clr已启用”从1更改为1。运行要安装的重新配置语句。将数据库上下文更改为“FooDatabase”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-15 11:58:57

我不知道发生此错误的原因。然而,找到了解决办法。感谢这篇伟大的文章!。有必要在新创建的数据库中重新创建用户。

整个代码如下所示:

代码语言:javascript
复制
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 */
票数 1
EN

Stack Overflow用户

发布于 2020-01-15 08:16:23

当从备份还原的数据库和数据库所有者的SID与主database.Try中列出的所有者SID不匹配时,可能会出现此问题。

代码语言:javascript
复制
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)

代码语言:javascript
复制
USE [DatabaseName]
GO


    -- Option #1
    EXEC sp_changedbowner 'sa'
    GO

    -- OR--

    -- Option #2
    ALTER AUTHORIZATION ON DATABASE::[DatabaseName] TO [sa]
    GO
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59747081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档