什么决定了 SQL Server 中的默认架构名称?

4 sql-server

当我尝试创建表时,它使用我的 ID 作为架构名称。但是在我经理的计算机上创建表时,架构名称是“dbo”。为什么?他可能拥有管理员权限。当我尝试使用 sp_rename 重命名时,它没有改变。

Tho*_*ger 7

在 SSMS 中,转到您的数据库用户并单击属性。您将在那里看到一个用于默认架构的字段。

T-SQL 版本:

alter user YourDbUser 
with default_schema = YourNewSchema
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 5

我希望我能在这里结合三个人的答案,因为答案真的分为三个部分,每个部分都回答得很好。所以我将其标记为社区维基。

  1. 您获得不同架构的原因dbo是因为您的默认架构不是 dbo,并且您正在编写:

    CREATE TABLE foo(...);
    
    Run Code Online (Sandbox Code Playgroud)

    执行此操作时,SQL Server 假定您要在默认架构中创建对象(毕竟这是拥有自定义默认架构的目的的一部分)。

  2. 要阻止这种情况发生,请在创建或引用对象时始终指定架构前缀。当你这样写语句时,SQL Server 是没有办法出错的:

    CREATE TABLE dbo.foo(...);
    CREATE TABLE your_schema.foo(...);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 要移动在错误架构中意外创建的表,您可以使用ALTER SCHEMA. 例如,如果您创建your_schema.foo并希望在dbo架构中使用它,您可以说:

    IF NOT EXISTS 
    (
      SELECT 1 FROM sys.tables AS t
        INNER JOIN sys.schemas AS s
        ON t.[schema_id] = s.[schema_id]
        WHERE t.name = N'foo'
        AND s.name = N'dbo'
    )
    BEGIN
      ALTER SCHEMA [dbo] TRANSFER your_schema.foo;
    END
    ELSE
    BEGIN
      PRINT 'Sorry, couldn''t move the object because it already exists.';
    END
    
    Run Code Online (Sandbox Code Playgroud)