【问题标题】:Default schema for DROP and SELECT INTO in stored procedures存储过程中 DROP 和 SELECT INTO 的默认架构
【发布时间】:2015-12-20 22:55:22
【问题描述】:

对于如何在 MS SQL 服务器中确定默认数据库架构,我有点困惑。

我有以下存储过程作为一个最小的工作示例:

CREATE PROCEDURE [dbo].[SampleSP]
AS

SELECT 'HI' as [SampleColumn]
INTO [SampleTable]

DROP TABLE [SampleTable]

所有测试都是在 MS SQL 服务器上使用用户 User 执行的,使用 Windows Auth 和同名的默认数据库架构。

  • 当我在 MS SQL Server 2005 安装(以兼容模式 80,即 Server 2000 运行)上执行此 SP 时,表创建为 [User].[SampleTable]DROP TABLE 失败并显示 Invalid object name 'SampleTable'(我假设是因为它寻找 @ 987654327@)
  • 当我在单独的查询中DROP TABLE [SampleTable] 时,它确实有效
  • 当我在 MS SQL Server 2008 R2(也在兼容 80 中运行)上执行 SP 时,表被创建为 [dbo].[SampleTable] 并且没有错误地删除

我发现this 回答描述了存储过程中的查找,但它没有提到该上下文中的用户默认值,即使它在 2005 年使用。也许有人知道这是如何改变的以及是否可以新版本配置为相同的行为方式。

【问题讨论】:

  • 省去麻烦,养成在过程和其他 t-sql 代码中始终使用模式的习惯。从长远来看,它将为您解决问题。
  • 我支持您始终使用架构。但我目前正在迁移一些遗留代码,并试图衡量这种变化对一些旧存储过程的行为的(非)影响。

标签: sql-server sql-server-2008 stored-procedures sql-server-2005


【解决方案1】:

听起来你只需要将用户的默认架构设置为 dbo:

ALTER USER YourUser WITH DEFAULT_SCHEMA = dbo;

这样它是在用户级别设置的,您无需更改任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2014-07-08
    • 2010-09-14
    相关资源
    最近更新 更多