当前位置: 首页 > 知识库问答 >
问题:

即使我是数据库所有者,更改架构传输也会失败

孔斌
2023-03-14

我在GitHub上问过这个问题,但我认为我们可以把它变成一个更通用的问题,以便更快地获得一些有用的想法。首先,我在这里运行脚本,它显示我是db-owner组的成员。

这是在名为“自动编辑”的旧工具的安装脚本上。尽管存在以下问题,但我能够为特定表启用自动审核,并且它工作正常。

提供的脚本将一些存储的proc存储在带有我的用户名的模式下,然后稍后尝试将它们传输到“审计”模式。自动编辑概念和存储的过程实际上都在工作,但现在我需要清理它并将其放入另一个环境中。

错误是:

找不到对象“pAutoAudit”,因为它不存在或者您没有权限。

它将存储的过程创建为

“公司\myuserid.pAutoAudit”

我添加了两条打印语句来帮助调试:

-- This is the line of code (the EXEC below) that is causing the issue:
print Concat('@AuditSchema=', @AuditSchema)
SET @Sql = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER dbo.pAutoAudit'
print Concat('@Sql=', @Sql)
EXEC (@Sql)

以上显示:

@AuditSchema=Audit
@Sql=ALTER SCHEMA [Audit] TRANSFER dbo.pAutoAudit

模式Audit存在,其中有一个存储过程:pAutoAuditArchive。

我在这里添加了一个相关的问题:从dbo更改架构的SQL服务器设置

共有1个答案

丰飞龙
2023-03-14

为了解决这个特定问题,我在这里看到了Lauren答案中的正确语法,如下所示:

更改架构新架构转移[旧架构]。[表名]

以下脚本暂时修复了该问题。如果原始脚本确实存在错误,我必须进一步研究如何修复它:

use myDbname 
Declare @AuditSchema varchar(32) 
Declare @OldSchema varchar(32) 
Declare @SQL varchar(max) 

Set @AuditSchema = 'Audit' 
Set @OldSchema = 'Corp\myuser' 
-- ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]


SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAudit'
print Concat('@SQL=', @SQL) 
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditAll'
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditDrop'
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditDropAll'
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditRebuild'
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditRebuildAll'
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditSetTriggerState'
EXEC (@SQL)

SET @SQL = 'ALTER SCHEMA ' + quotename(@AuditSchema) + ' TRANSFER ' + quotename(@OldSchema) + '.pAutoAuditSetTriggerStateAll'
EXEC (@SQL) 

但是,要修复问题中引用的“自动编辑”脚本,可以通过将此代码添加到自动编辑或在自动编辑之前运行它来解决问题。显然,它假设您处于“dbo”default_schema。如果需要,您可能需要在脚本之后将值设置回原始值。

DECLARE @SQL2 VARCHAR(max)
SET @SQL2 = 'ALTER USER ' + quotename(current_user)  + ' WITH DEFAULT_SCHEMA = dbo' 
print Concat('@SQL2=', @SQL2) 
exec (@SQL2)

当我将它移动到另一个环境时,更好的解决方法是将所有“创建程序xxxx”更改为“创建程序dbo.xxxx”。

 类似资料:
  • 是否可以更改我没有连接到的数据库的架构?更具体地说,我需要更改模式的所有者(但出于问题的考虑,这并不重要)。

  • 问题内容: 如何指定Spring Boot使用的数据库架构?我正在使用默认的hibernate(=默认)和postgres(但我希望一个通用的解决方案)。我知道如何指定JDBC URL: 但是不幸的是,postgresql不允许在JDBC URL中指定架构。我知道这里有hibernate属性hibernate.default_schema,所以我希望以下属性之一可以工作: 但是不幸的是,他们似乎都

  • 如何指定Spring Boot使用的数据库模式?我使用默认的hibernate(=默认)和postgres(但我希望有一个通用的解决方案)。我知道如何指定JDBC URL: 但不幸的是,postgresql不允许在JDBCURL中指定模式。我知道有hibernate属性,因此我希望以下属性之一能够正常工作: 但不幸的是,它们似乎都没有任何结果。

  • 任何帮助都将成为徒弟

  • 问题内容: 根据本文,您可以使用Spring Framework中的AbstractRoutingDataSource来动态更改应用程序使用的数据源。 但是,使用的数据源是通过配置定义的,而不是通过编程定义的。有没有一种方法可以配置要在运行时使用的数据源? 该解决方案的可扩展性如何,即数据源数量上的限制是什么? 谢谢! 问题答案: 我已经为30个数据源实现了这种方法,并且它们当前正在生产环境中运行

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 跟踪和/或自动执行数据库架构更改的最佳方法是什么?我们的团队使用Subversion进行版本控制,我们已经能够以这种方式自动执行一些任务(将构建推送到暂存服务器