即使我是数据库所有者,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”。
我在 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”。