SQL Server无默认Schema时创建表报错,查询却自动匹配dbo?求解
问题解答
1. 创建表不指定Schema报错的原因
SQL Server创建对象(如表)时,若未指定Schema,会优先使用当前登录用户的默认Schema。但你的账号没有设置默认Schema(SCHEMA_NAME()返回null),对于Service Principal这类Azure AD身份的用户,SQL Server会尝试以你的完整用户名称(aashay.amballi@<company>.com)作为Schema名称去创建表——但这个Schema不存在,且你没有权限新建这个Schema,因此触发Msg 2760错误。
2. 查询时不指定Schema能匹配dbo的原因
查询对象时,SQL Server会按照Schema搜索路径依次查找。默认情况下,这个搜索路径包含dboSchema:当你执行select * from visits时,会先尝试在你的默认Schema(不存在)中查找,找不到就自动去dboSchema中匹配,因此能返回结果。
注意:创建操作和查询操作的逻辑不同——创建必须明确指定Schema,或有可用的默认Schema;而查询会遍历搜索路径中的Schema。
3. 关联Django MigrationSchemaMissing问题的解决方法
Django迁移默认不会指定Schema,因此会遇到和手动创建表一样的报错,可通过两种方式解决:
- 方式一:配置Django默认Schema
在settings.py的数据库配置中添加schema选项,强制迁移时使用dboSchema:DATABASES = { 'default': { 'ENGINE': 'mssql', 'NAME': '你的数据库名', 'USER': '你的Service Principal ID', 'PASSWORD': '你的Service Principal密钥', 'HOST': '你的Azure SQL服务器地址', 'PORT': '1433', 'OPTIONS': { 'schema': 'dbo', }, } } - 方式二:给Service Principal设置默认Schema
在SQL Server中执行以下语句,将你的账号默认Schema设为dbo,后续不管手动操作还是Django迁移都无需指定Schema:ALTER USER [aashay.amballi@<company>.com] WITH DEFAULT_SCHEMA = dbo;
内容的提问来源于stack exchange,提问作者Aashay Amballi
相关产品推荐
相关产品推荐

