即使我是数据库所有者,Alter Schema Transfer 也会失败

Alter Schema Transfer fails even when I'm a db-owner

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

这是一个名为 AutoEdit 的旧工具的安装脚本。尽管存在以下问题,但我可以为特定表打开 AutoAudit,并且工作正常。

提供的脚本使用我的用户名在一个模式下存储了一些存储过程,然后稍后尝试将它们运行转移到“审计”模式。 AutoEdit 概念和存储过程实际上都在工作,但现在我需要清理它并放在另一个环境中。

错误是:

Cannot find the object 'pAutoAudit', because it does not exist or you do not have permission.

它将存储过程创建为

"Corp\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。

我在这里添加了一个相关问题:

为了解决这个具体问题,我从 Lauren 的回答 here 中看到了正确的语法,如下所示:

ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

以下脚本暂时解决了这个问题。如果确实有错误,我必须更多地研究如何修复原始脚本:

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) 

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

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

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