- Este tópico contém 15 respostas, 7 vozes e foi atualizado pela última vez 11 anos, 5 meses atrás por fabio segato.
-
AutorPosts
-
28 de março de 2013 às 8:04 pm #105235José Ricardo GarciaParticipante
Pessoal,
Estou voltando do SQLServer para o Oracle e como estou meio enferrujado preciso
de uma ajuda para identificar uma solução para meu problema.
A situação é a seguinte:
Em SQLServer temos várias bases diferentes com a mesma estrutura de tabelas e o
mesmo schema (único) e todos os usuários acessam os objetos através deste
schema. Isto é para facilitar a codificação das rotinas.
Em Oracle, precisaria ter uma base em casa tablespace por exemplo e ter o mesmo
nome de schema visto que o sistema agora trabalhará com os dois bancos.
Já montei umas bases mas como o schema está vinculado ao nome do usuário,
precisei criar sinônimos para poder acessar os objetos do schema padrão.
Agora fica a dúvida, eu teria como ter em tablespaces diferentes a mesma
estrutura de base (objetos) utilizando um mesmo nome de schema?1 de abril de 2013 às 3:31 pm #105237marlontkParticipanteOpa,
Pelo que entendi teu problema não esta a nível de tablespace e sim quanto ao uso de schemas.Então pela tua descrição tu poderia ter dois schemas separadas cada um com suas tablespaces (podendo ser a mesma, mas dependendo do caso separar pode ser melhor opção)
Ao logar no banco é possível alterar o schema onde os sqls serão “executados” sem precisar colocar o prefixo user.alter session set current_schema = nome;
Teria uma esquema schema1 e schema2.
Ao logar com um usuario comun(tendo privilegios nos esquemas schema1 e schema2
e ao logar tu direciona teus sqls para o esquema nestes casos o uso de sinônimos se fazem desnecessários.Exemplo.
conn marlonti@dbprodbk
Connected to Oracle Database 11g Release 11.2.0.1.0
Connected as marlontiSQL> select count(1) from produtos;
select count(1) from produtos
ORA-00942: a tabela ou view não existe
SQL>
SQL> alter session set current_schema =estoque;Session altered
SQL> select count(1) from produtos;
COUNT(1)
54575
Suas rotinas sqls não terão que especificar o schema do tipo
SQL> select count(1) from estoque.produtos;COUNT(1)
54575
Espero ter ajudado.
1 de abril de 2013 às 5:25 pm #105239José Ricardo GarciaParticipanteMarlon,
Explicando melhor a minha situação que é a seguinte. Trabalhamos com diversos clientes utilizando o nosso ERP. Em nosso setor de suporte, existem algumas bases de clientes (que necessitam deste tipo de suporte) para que possa ser simulado o problema localmente.
No SQL Server, temos estas bases sendo acessadas com o mesmo usuário que acessa o schema default (dbo) e como ele trabalha diferente do oracle não tenho este problema.
Como estamos preparando o sistema para trabalhar com oracle também, pensei em ter um schema único (padrão) para não me preocupar com a troca. Outro detalhe é que ter todas estas bases em um único tablespace não acho bom e portanto pensei em ter um por base (tipo para identificação).
Então a minha necessidade é assim:
* Ter uma única instância… até aí sem problemas.
* Ter N tablespaces sendo uma para “cada base”.
* Ter 1 schema único padrão para todos os usuários.Quanto a utilizar o schema na frente dos objetos não é problema.
O que preciso é ter como “dizer” que neste momento quero acessar os dados da base/tablespace X e depois preciso utilizar os dados da base/tablespaces Y.
Não sei se isto é possível ou eu preciso adotar um outro tipo de abordagem.Obrigado pela ajuda.
1 de abril de 2013 às 6:18 pm #105241rmanParticipante@jricardogarcia
Realmente o conceito do SQL Server e do Oracle são diferentes.
A solução é criar uma instancia para cada base, mas creio que isso seja totalmente inviavel.
Outra solução é criar um prefixo com no nome do cliente antes do usuário padrão do sistema, isso vale também para a tablespace. O sistema também precisa de uma forma de parametrizar o usuário do Oracle que o sistema utiliza. Utilizando o datapump é possível remapear o schema e a tablespace, verifique os parametros REMAP_SCHEMA e REMAP_TABLESPACE.
1 de abril de 2013 às 7:04 pm #105242marlontkParticipante@jricardogarcia
Sem problemas teu sistema teria que ter algo para setar o esquema que ele ira trabalhar no Oracle.
Por exemplo
Usuario: nome
Senha: senha
Banco: nome da Base
Schema: schema de dados.Podendo ter o mesmo usuário acessando o esquema de cada cliente.
Quando quiser acessar uma “base” especifica de um cliente ao loga no sistema basta executar o sql que já enviei antes trocando o schema para o schema do cliente que será acessado.Quanto as tablespaces que tu ira criar isso é transparente para o sistema ter uma para cada schema ou uma para todos, irá apenas representar algo na tua organização e acredito alguma coisa de desempenho ai dependendo muito do volume de dados e demais configurações. Mas não faz parte do teu problema.
Verificar os grants de select, insert ….. para o usuário que será conectado que vem a eliminar os sinonimos que no teu problema não adiantaria de nada.Tua aplicação é Web ou desktop?
Uma instância para cada cliente teria sentido se teus clientes tiverem versões de banco diferentes e tu for utilizar alguns recursos específicos que entre versões fazem diferentes, do contrário não justificaria até porque teria que ter memoria para atender todas as instancias.
Eu partiria para resolver este teu problema com o que já citei anteriormente.
Eu uso uma instancia para cada base onde tenho uma base muito complexa com vários schemas ai juntar as duas é inviável, nas outras que apenas possuem um ou dois schemas centralizo elas em um mesmo server.
1 de abril de 2013 às 8:19 pm #105243José Ricardo GarciaParticipanteA aplicação é web e nela possui a string de conexão onde é alimentado o nome do schema que irei utilizar.
Partindo deste pressuposto eu precisaria ter um schema único. O que preciso é através do usuário ou do mesmo usuário poder identificar que em determinado momento utilizarei X tablespace (tendo em vista que terei um para cada base de dados por exemplo). O problema que eu identifico aqui é que as bases terão a mesma estrutura.
Não sei se isto será possível para meu sistema visto também que instâncias diferentes não me resolve também devido a quantidade de bases ser grande o que precisaria de uma estrutura muito grande.
Vi que tem alguns comandos para alterar schema e tablespace, mas não consegui identificar se isto resolve minha necessidade, caso possa colocar algum exemplo simples de utilização agradeço.Obrigado pela ajuda.
1 de abril de 2013 às 9:58 pm #105244marlontkParticipante@jricardogarcia
1º ” O que preciso é através do usuário ou do mesmo usuário poder identificar que em determinado momento utilizarei X tablespace…”
Esquece “por enquanto” esse lance de tablespace isso como já escrevi é apenas para tua organização e desempenho.
tanto que tu pode ter um esquema tendo vários tablespaces com vários datafiles.O que tu tem é um user para te conectar a base e um schema para executar os sqls sendo que apenas este ultimo irá variar podendo ser trocado no login
teoricamente no teu sistema ao logar teria que ter algo para selecionar o esquema para poder executar a aplicação.” caso possa colocar algum exemplo simples de utilização agradeço..”
Neste caso segue o que já comentei no primeiro post alter session….2 de abril de 2013 às 5:46 pm #105247marlontkParticipanteManda teu skype que pra facilitar….
3 de abril de 2013 às 4:48 am #105252José Ricardo GarciaParticipanteOlá Marlon,
Meu skype/msn é j_ricardogarcia@yahoo.com.br.
Vou tentar relatar um exemplo de como temos estruturado hoje em SQL Server. Preciso montar uma estrutura parecida com esta para evitar muitos retrabalhos.
A idéia inicial é utilizar um schema único para todas as bases, exemplo “minhaempresa”.
Então para todo SQL que a aplicação irá executar, utilizamos linq do c#, existe uma pré-configuração informando o schema do banco e portando seria o “minhaempresa”.
Temos bases de desenvolvimento e de testes e usuários específicos para o acesso as bases.
Através do login do usuário na instância, necessito acessar uma base específica mas com o mesmo schema.
Exemplo:
Base de desenvolvimento acessando com o usuário desenv
SELECT * FROM MINHAEMPRESA.PRODUTOBase de teste acessando com o usuário teste
SELECT * FROM MINHAEMPRESA.PRODUTONestas duas consultas, cada uma precisa trazer os dados correspondentes a sua base. Consegui me expressar?
Obrigado pela ajuda.
4 de abril de 2013 às 2:04 am #105270MarcusPEParticipanteCara, pelo que vi, seria ideal duas instâncias separadas mesmo.
As estruturas da tabelas, views, constraints…são iguais? Ou pode ser alterado em um e em outro não?
4 de abril de 2013 às 3:06 pm #105271José Ricardo GarciaParticipanteAs estruturas serão sempre iguais, o problema é que não serão apenas duas instâncias… as vezes podemos chegar a ter 10 bases diferentes (dados) com situações diferentes e isto torna inviável pela grande estrutura necessária.
4 de abril de 2013 às 8:55 pm #105275C-S-RParticipanteVoce precisa ter 1 banco para cada cliente? Se tiver 10 clientes são 10 bancos?
Se eles puderem acessar o mesmo banco é so criar tudo em um schema e criar varios usuarios com grants.
Senão voce vai ter que criar varias instancias de banco.
O SQL Server acredito que é pareceido com Postgres 1 Instancia possui varios Bancos, já no Oracle 1 Instancia possui 1 Banco
4 de abril de 2013 às 10:25 pm #105276MarcusPEParticipanteJá vi empresas aplicarem uma espécie de “Multi empresa” no banco. Para que somente um banco comportasse duas empresas com dados diferentes, porém com estruturas iguais, não existindo duplicidade de tabelas. Ou seja, os dados das duas empresas eram adicionados a mesma tabela. Como foi feito isso? Criando a tabela empresa e adicionando uma coluna empresa_id identificando a empresa a qual o usuário logou (logo tendo que adicionar ao login a opção de informar a empresa) à todas as tabelas envolvidas. Logo, também houve alterações em toda a aplicação para inserir essa coluna nos SQLs também.
Ex.
Teste = 1
Desenv = 2Consultar Dados de teste
SELECT *
FROM schema.table
WHERE empresa_id = 1Consultar Dados de Desenv
SELECT *
FROM schema.table
WHERE empresa_id = 2Deve ser mais ou menos isso que você precisa. Ficaria com um schema para “vários bancos”.
21 de junho de 2013 às 10:59 pm #105597Fábio GasparoniParticipantePessoal.
Aproveitando a discussão acerca de TABLESPACE. Como faço para mudar 1 objeto de 1 TABLESPACE para outra? Tipo: tenho uma tabela na TABLESPACE users e quero alocá-la na TABLESPACE app.
21 de junho de 2013 às 11:46 pm #105598fabio segatoParticipanteNão tem segredo. O mesmo schema em bases diferentes, vc vai ter que criar 1 instancia para cada ambiente, e esses schemas existirão em todas as instâncias.
-
AutorPosts
- Você deve fazer login para responder a este tópico.