在 SQL 服务器中,我可以通过连接到不同的数据库来改变 "entity.table" 在 SQL 表达式中的含义吗?

In SQL Server, can I vary what "entity.table" means in a SQL expression by connecting to a different database?

我正在开发 PHP 7.2 应用程序,它在 Windows + SQL 服务器环境中 运行ning。我被要求持续进行一些更改。

在这个项目上工作了几个月后,没有自动化测试变得越来越令人沮丧。此外,为了正常工作,它需要连接到我没有的企业可视化软件,所以它是一个相当多的系统,必须在生产中进行测试。

为了减轻这些风险,我将其 Docker 化,因此至少其中一些会 运行 在我的笔记本电脑上。我将它 运行ning 与 SQL 服务器的副本放在一起,也在一个容器中。我现在正计划改进一些 API 测试,我发现了一些 SQL 可能有问题的代码。

按照我的惯例,我希望能够在本地 运行 两个数据库,一个名为 "local" 用于临时测试和一般开发,另一个名为 "testing",用于自动化测试。每次测试 运行 都会拆除并重建测试版。但是,所有查询看起来都像这样:

SELECT [Username], [User_ID], [Forename], [Surname],
       [Title], [Job_Title], [Email],[Permissions],
       [Password_Created], [Enabled], [Change_Password]
FROM [MASTER].[User]
WHERE CONCAT(
    [Username],' ',[Forename],' ',[Surname],' ',
    [Email],' ',[Job_Title]
) LIKE :searchTerm

所以,所有表格都表示为[MASTER].[Table_Name]。我假设 [MASTER] 是模式名称,尽管我不熟悉 SQL 服务器。这些查询有很多。我已经设置了我的初始测试,以便临时数据库以 [MASTER_TESTING].[Table_Name] 的形式出现,因此我需要将所有查询更改为其他模式以进行测试。

解决此问题的一种方法是将架构名称注入每个引用 MASTER 的应用程序 class,这样我就可以对其进行配置(用于 运行 时间或测试) .但是,鉴于我没有测试,以这种方式更改大量代码感觉很冒险,我想知道是否有其他选择。

我可以在 PDO 连接字符串中设置数据库名称,或者发出 USE 命令,让 [MASTER].[Table_Name] 引用任意数量的数据库,还是我只需要修改每个查询?

tables are expressed as [MASTER].[Table_Name]. I assume that [MASTER] is a schema name,

正确。 MASTER 这里是会话当前数据库中模式的名称。这是一个由两部分组成的名称,并且相对于会话的当前数据库进行解析。

can I set up a database name in the PDO connection string, or issue a USE command, to get [MASTER].[Table_Name] to refer to any number of databases

是的。重新连接到另一个数据库或发出 USE database_name 将更改会话当前数据库,并且两部分名称将相对于新数据库进行解析。

听从 David 的有益建议,我想我会展示我正在做什么以连接到空白测试数据库中的 MASTER 模式。

以下是我用来拆除和创建数据库的代码。我将 test/client 端和 API/server 端连接到 Docker.

中 SQL 服务器的标准 sa 用户
DROP DATABASE IF EXISTS $dbname;
CREATE DATABASE $dbname;
CREATE SCHEMA [MASTER] AUTHORIZATION [dbo];
ALTER AUTHORIZATION ON SCHEMA::[MASTER] TO [dbo];
GRANT SELECT, INSERT, DELETE, ALTER, EXECUTE, CONTROL ON SCHEMA::MASTER TO dbo;
USE $dbname;

/* Create my application tables here for test */

在发布 GRANT 之前,我无法在 MASTER 代码中创建表。不知道能不能写的更简洁点,不过只是一次性数据库,测试代码不一定要完美