Gerenciar Bases Oracle e SQL Server

3 respostas
J

Boa tarde.

Não sei se minha dúvida se enquadra como sendo básica, mas lá vai.

Estou querendo criar uma forma mais simplificada para criar, dropar, fazer backup e restaurar bases de dados Oracle e SQL Server. Não precisa ser algo muito bonito aos olhos. Apenas mais acessível que arquivos bat. Usando JOptionPane mesmo, que seja. Pelo menos para eu entender como funciona. Depois me preocupo com um controle mais apurado.

Alguém tem alguma idéia de como fazê-lo? Penso em algo realmente simples.

Para CRIAR bases:
1) Usuário informa o servidor.
2) O usuário recebe confirmação que o servidor é conectável.
3) O usuário informa o nome da base que deseja criar.
4) O usuário recebe confirmação de que a base foi criada ou uma advertência de que a base já existe.

Para DROPAR bases:
1) Usuário informa o servidor.
2) O usuário recebe confirmação que o servidor é conectável.
3) O usuário informa o nome da base que deseja remover.
4) O usuário recebe confirmação de que a base foi removida ou uma advertência de que existem usuários conectados à base.

Seguindo a mesma linha de raciocínio para backups e restaurações.

Atualmente, para os dois exemplos acima, uso um bat com o seguinte código:

@echo off C: cd \ cd \GerenciadoresBD\Oracle11g\product\11.2.0\dbhome_1\BIN sqlplus usuario/senha @ arquivo_com_instrucoes.sql

Dentro do arquivo .sql está o código:

Spool C:\TEMP_JO\Scripts\create_user_11g.log CREATE USER "NOME_DA_BASE" PROFILE DEFAULT IDENTIFIED BY "SENHA" DEFAULT TABLESPACE TS_FPW_DAT_01 QUOTA UNLIMITED ON TS_FPW_DAT_01 QUOTA UNLIMITED ON TS_FPW_IND_01 ACCOUNT UNLOCK; GRANT CONNECT TO NOME_DA_BASE; GRANT CREATE TABLE TO NOME_DA_BASE; GRANT CREATE TRIGGER TO NOME_DA_BASE; GRANT CREATE PROCEDURE TO NOME_DA_BASE; GRANT CREATE VIEW TO NOME_DA_BASE; GRANT CREATE SEQUENCE TO NOME_DA_BASE; GRANT SELECT_CATALOG_ROLE TO NOME_DA_BASE; GRANT UNLIMITED TABLESPACE TO NOME_DA_BASE; Spool Off Exit

Agradeço imensamente se alguém puder me ajudar.

3 Respostas

E

Cara, acho que com o Hibernate fica mais fácil de você entender e aprender legal…
Abç

J

Creio eu que o Hibernate é mais voltado (ou exclusivamente voltado, corrija-me se eu estiver errado) para persistência.

Minha idéia é fazer o papel de um manager.

Assim como o Microsoft Management Studio é para o SQL Server e o Enterprise Manager é para o Oracle. A ideia é criar a base (user no Oracle), ao invés de realizar operações CRUD.

Consegui hoje na parte da tarde fazer o CRIAR no Oracle (agora falta dropar, restaurar e fazer backup).

Abaixo os dois principais métodos utilizados para a criação da base (user) Oracle:

public String createUserOracle(String nomeBase, String senhaBase)
			throws SQLException, ClassNotFoundException {
		String strCriaBase = "";
		strCriaBase = new String("CREATE USER \"" + nomeBase + "\" PROFILE DEFAULT IDENTIFIED BY \"" + senhaBase + "\" DEFAULT TABLESPACE TS_FPW_DAT_01 QUOTA UNLIMITED ON TS_FPW_DAT_01 QUOTA UNLIMITED ON TS_FPW_IND_01 ACCOUNT UNLOCK");
		try {
			con = this.init();
			stmt = con.createStatement();
			System.out.println("Código usado para criação da base: " + strCriaBase);
			stmt.execute(strCriaBase);
			JOptionPane.showMessageDialog(null, "Base [" + nomeBase + "] criada com sucesso!");
			System.out.println("Base criada: " + stmt.SUCCESS_NO_INFO);
			grantRightsOracle(nomeBase);
			JOptionPane.showMessageDialog(null, "Grants atribuídos.");
			stmt.close();
		} catch (SQLException e) {
			System.out.println("Falha de SQL: " + e.getMessage());
		} catch (ClassNotFoundException e) {
			System.out.println("Falha de Classe: " + e.getMessage());
		} finally {
			if (null != con) {
				con.close();
			}
		}
		return "SUCCESS";
	}
public String grantRightsOracle(String nomeBase) throws SQLException,
			ClassNotFoundException {

		String strGrant1 = new String("GRANT CONNECT TO " + nomeBase);
		String strGrant2 = new String("GRANT CREATE TABLE TO " + nomeBase);
		String strGrant3 = new String("GRANT CREATE TRIGGER TO " + nomeBase);
		String strGrant4 = new String("GRANT CREATE PROCEDURE TO " + nomeBase);
		String strGrant5 = new String("GRANT CREATE VIEW TO " + nomeBase);
		String strGrant6 = new String("GRANT CREATE SEQUENCE TO " + nomeBase);
		String strGrant7 = new String("GRANT SELECT_CATALOG_ROLE TO " + nomeBase);
		String strGrant8 = new String("GRANT UNLIMITED TABLESPACE TO " + nomeBase);

		try {
			con = this.init();
			stmt = con.createStatement();
			System.out.println("Atribuindo privilégios.");
			stmt.execute(strGrant1);
			stmt.execute(strGrant2);
			stmt.execute(strGrant3);
			stmt.execute(strGrant4);
			stmt.execute(strGrant5);
			stmt.execute(strGrant6);
			stmt.execute(strGrant7);
			stmt.execute(strGrant8);
			stmt.close();
			
		} catch (SQLException e) {
			System.out.println("Falha durante os GRANTs: " + e.getMessage());
		} catch (ClassNotFoundException e) {
			System.out.println("Falha durante os GRANTs: " + e.getMessage());
		} finally {
			if (null != con) {
				this.close(con);
			}
		}
		return "SUCCESS";
	}
J

Consegui também fazer o Drop do Oracle (remover a base/user).

Abaixo a classe completa:
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JOptionPane;

import conexao.ConnOracle;

public class Drop {
	
	ConnOracle conOra = new ConnOracle();
	private Connection con;
	private Statement stmt;
	private String nomeBase = null;
	
	public String deleteUserOracle(String nomeBase) throws SQLException,
			ClassNotFoundException {
		String strDrop = new String("DROP USER " +nomeBase+ " CASCADE");
		try {
			con = conOra.init();
			stmt = con.createStatement();
			stmt.execute(strDrop);
			stmt.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, "Falha de SQL: " + e.getMessage());
		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Falha durante o DROP: " + e.getMessage());
		} finally {
			if (null != con) {
				conOra.close(con);
			}
		}
		return "SUCCESS";
	}
	
	public void droparBase() throws ClassNotFoundException, SQLException {
		nomeBase = JOptionPane.showInputDialog("Informe o nome da base");
		nomeBase = nomeBase.toUpperCase();
		 int res = JOptionPane.showConfirmDialog(null, "Tem certeza que deseja remover a base [" +nomeBase+"]? " +
		 		"A ação é definitiva.", "Confirmação", JOptionPane.YES_NO_OPTION);
		    if (res == JOptionPane.YES_OPTION)
		    {
		      deleteUserOracle(nomeBase);
		      JOptionPane.showMessageDialog(null, "A base ["+nomeBase+"] foi removida com sucesso!");
		    } else {
		    	JOptionPane.showMessageDialog(null, "DROP cancelado.");
		    }

	}
}

Agora vou trabalhar na exportação (backup) que é relativamente menos complexo que a importação (restauração).

Criado 26 de fevereiro de 2013
Ultima resposta 27 de fev. de 2013
Respostas 3
Participantes 2