如何在jboss数据源URL中指定sql server的当前架构?

时间:2013-07-23 20:44:11

标签: java sql-server jdbc jboss7.x

我有一些像这样的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上运行?

1 个答案:

答案 0 :(得分:2)

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;