【问题标题】:How can I specify the current schema for sql server in a jboss data source url?如何在 jboss 数据源 url 中指定 sql server 的当前模式?
【发布时间】:2013-07-23 20:44:11
【问题描述】:

我有一些这样的 SQL 查询

select user_id from 
table_user where lower(email_address)=? and password=?

最近更新了应用程序的架构,但我真的不想更新应用程序中的每个 SQL 查询。有没有办法从JBOSS连接端指定当前的Schema?

旧连接:jdbc:sqlserver://myserver:1433;DatabaseName=db 试过了:jdbc:sqlserver://myserver:1433;DatabaseName=db;currentSchema=abc

我尝试使用currentSchema,但这并没有帮助,当我运行查询时我得到一个缺少对象的异常(因为我假设这些在 dbo 下查找)。有什么办法可以更新查询,因为我知道所有查询都将在架构 abc 上运行?

【问题讨论】:

  • 您应该创建两个数据源并根据场景使用所需的数据源。在 SQL 查询执行时更改连接信息不是标准/推荐的做法。
  • @Phani 我真的只需要 1 个数据源,因为此应用程序将始终使用该模式。但是,根据驱动程序属性,似乎没有办法通过连接字符串指定架构。
  • 如果是这种情况,那么 DBA 将配置用户并关联到架构,当您使用这些凭据时,它将引用正确的架构。这是标准/推荐的方法,因为它没有在 SQL 中硬编码模式名称是有意义的。
  • @Phani 我对此进行了更多研究,这似乎是一个可行的选择。 blog.sqlauthority.com/2009/09/07/…。愿意将其添加为其他人的答案吗?

标签: java sql-server jdbc jboss7.x


【解决方案1】:

These are the available connection properties 用于 Microsoft JDBC 4.0 驱动程序。我在这个列表中没有看到currentSchema,也没有看到任何允许您在连接字符串中指定特定架构的驱动程序。

由于您不想使用架构更新 SQL,您可以在默认 (dbo) 架构中为每个对象创建 synonyms。例如:

USE tempdb;
GO
-- create test schema
CREATE SCHEMA test AUTHORIZATION dbo;
GO

-- create table in test schema
CREATE TABLE test.tablename (columnname int null);

-- select from tablename in default schema will fail
SELECT * FROM tablename;
GO

-- create synonym mapping test.tablename to dbo.tablename
CREATE SYNONYM [dbo].[tablename] FOR [server].[tempdb].[test].[tablename]

-- -- select from tablename synonym will succeed
SELECT * FROM tablename;

-- cleanup
DROP SYNONYM [dbo].[tablename];
DROP TABLE [test].[tablename];
DROP SCHEMA [test];

您可以使用以下代码为用户对象生成CREATE SYNONYM 语句。如果使用它,则需要在执行前更新变量值并查看语句。没有明示或暗示的保证:)

-- generate create synonym statements for user objects
DECLARE @FromSchema SYSNAME = 'abc',
        @ToSchema SYSNAME = 'dbo',
        @ServerName SYSNAME = 'server',
        @DatabaseName SYSNAME = 'database';

SELECT  'CREATE SYNONYM ' + QUOTENAME(@ToSchema) + '.' + QUOTENAME(name) +
        ' FOR ' + QUOTENAME(@ServerName) + '.' + QUOTENAME(@DatabaseName) +
        '.' + QUOTENAME(@FromSchema) + '.' + QUOTENAME(name) + ';'
FROM    sys.objects
WHERE   is_ms_shipped = 0;

【讨论】:

  • 感谢您的链接和建议。这是一种有趣的方法,但是一旦添加了其他模式并且我有冲突的对象名称,我可能会遇到问题。由于没有允许您指定架构的驱动程序,我将解决更新 SQL。不过还是谢谢。
  • @Rondel 更新 SQL 将是我的首选。如果你养成了总是写schema.object 的习惯,那就不太麻烦了。
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 2015-05-13
  • 2016-07-18
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 2023-04-04
  • 2019-03-02
相关资源
最近更新 更多