Как мога да посоча текущата схема за sql сървър в URL адрес на източник на данни jboss?

Имам някои SQL заявки като тази

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

Схемата за приложението беше актуализирана наскоро, но всъщност не искам да актуализирам всяка SQL заявка в приложението. Има ли начин да се посочи текущата схема от края на JBOSS връзката?

Стара връзка: jdbc:sqlserver://myserver:1433;DatabaseName=db Опитано: jdbc:sqlserver://myserver:1433;DatabaseName=db;currentSchema=abc

Опитах да използвам currentSchema, но това не помогна, получавам изключение за липсващ обект, когато изпълнявам заявките (тъй като предполагам, че те търсят под dbo). Има ли някакъв начин да се актуализират заявките, тъй като знам, че всички заявки ще се изпълняват по схема abc?


person Rondel    schedule 23.07.2013    source източник
comment
Трябва да създадете два източника на данни и да използвате необходимия източник на данни в зависимост от сценария. Не е стандартна/препоръчителна практика да променяте информацията за връзката по време на изпълнение на SQL заявка.   -  person Phani    schedule 24.07.2013
comment
@Phani Наистина ще ми трябва само 1 източник на данни, тъй като това приложение винаги ще използва тази схема. Въпреки това въз основа на свойствата на драйвера, изглежда няма начин да се посочи схемата чрез низа за връзка.   -  person Rondel    schedule 24.07.2013
comment
Ако случаят е такъв, тогава DBA ще конфигурира потребител и ще се асоциира към схема и когато използвате тези идентификационни данни, тогава ще се препрати към правилната схема. Това е стандартният/препоръчителен подход, тъй като няма смисъл имената на схемите да се кодират твърдо в SQL.   -  person Phani    schedule 24.07.2013
comment
@Phani Разгледах това малко повече и това изглежда като жизнеспособна опция. blog.sqlauthority .com/2009/09/07/. Искате ли да го добавите като отговор за другите?   -  person Rondel    schedule 06.08.2013


Отговори (1)


Това са наличните свойства на връзката за Microsoft JDBC 4.0 драйвер. Не виждам currentSchema в този списък и не съм виждал драйвер, който ви позволява да посочите конкретна схема в низа за връзка.

Тъй като не искате да актуализирате SQL със схемата, можете да създадете синоними в схемата по подразбиране (dbo) за всеки обект. Например:

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;
person Bryan    schedule 23.07.2013
comment
Благодаря за връзката и предложението. Това е интересен подход, но вероятно ще се натъкна на проблеми, след като бъдат добавени други схеми и имам противоречиви имена на обекти. Тъй като няма драйвер, който ви позволява да укажете схемата, ще се задоволя с актуализиране на SQL. Благодаря все пак. - person Rondel; 24.07.2013
comment
@Rondel Актуализирането на SQL ще бъде първият ми избор. Ако имате навика винаги да пишете schema.object, това не е твърде тромаво. - person Bryan; 24.07.2013