【问题标题】:Alias/Synonym for a database based on user基于用户的数据库的别名/同义词
【发布时间】:2021-02-15 17:07:49
【问题描述】:

是否可以有相同的查询,但根据当前登录的不同用户,从不同的数据库中请求信息?

一个例子:我们有一个具有不同环境的应用程序 dev/test/int 等。对于每个环境,我们有不同的 JDBC 连接到 MSSQL Server。主要思想是,始终使用相同的查询,例如:

SELECT * FROM config_db.clients

但是在内部,根据连接字符串中的当前用户(如 user_dev、user_test 等)从 config_db_dev、config_db_test 等获取响应?我希望这个问题有意义。

提前致谢!

【问题讨论】:

  • “是否可以有相同的查询,但根据当前登录的不同用户,从不同的数据库请求信息?” 不,SQL 作用于文字,而不是推断的信息。如果您希望不同的用户连接到不同的数据库,则需要在应用程序中使用连接字符串进行配置。
  • 不确定这是否有帮助,但我已经看到不同用户基于同一数据库中的架构而不是单独的数据库进行连接的情况。然后数据检索全部基于数据库视图,这些数据库视图仅限于相关用户/模式的数据,并且用户具有默认模式,因此在检索数据时无需指定模式。
  • 建议创建将 userId 作为参数并运行指向他们需要访问的环境的动态 SQL 查询的存储过程。也许不是最优雅的解决方案,但足以用于测试目的。
  • 将配置表存储在与“环境”相同的数据库中?也许是用户默认模式中定义的同义词?但我担心您将事情过于复杂化,并且可能会增加某人意外在错误数据库中工作的机会。

标签: sql sql-server mssql-jdbc


【解决方案1】:

是否可以有相同的查询,但根据当前登录的不同用户,从不同的数据库中请求信息?

当然。登录有default database,用户有default schema

这两者都会影响对象名称解析。

如果您使用单部分名称,例如

SELECT * FROM clients

那么 SQL Server 将首先在用户的默认架构中查找名为“clients”的对象,然后在当前数据库的 dbo 架构中查找。

如果您使用由两部分组成的名称,例如

SELECT * FROM foo.clients

然后 SQL Server 将在当前数据库的“foo”模式中查找名为“clients”的对象。

【讨论】:

  • 嗨大卫,这听起来很简单!我今晚会测试它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-15
  • 2010-10-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多