ANEXO TÉCNICO PROCEDIMENTOS PARA EXECUÇÃO DE SCRIPTS EM BANCO DE DADOS DO GEMCO ANYWHERE 1. Introdução Este manual aborda os procedimentos para atualização de bancos de dados do sistema Gemco. A atualização dos scripts é um procedimento importante que faz parte das rotinas de manutenção do sistema. Com a atualização dos scripts são criadas tabelas, campos e feitos ajustes essenciais à estrutura do banco de dados. Ao receber uma nova versão do aplicativo Gemco ou modulares, o banco de dados deve estar atualizado, ou seja, com os scripts executados, para que esta versão funcione adequadamente. Abordaremos os procedimentos de como obter os scripts, de sua organização, nomenclatura, execução e erros comuns que possa enfrentar. 2. Escopo As instruções deste manual atendem todos os produtos Bematech Gemco na base de dados SQL Server ou Oracle. 3. Obtenha os scripts Existe um meio para a obtenção dos scripts: Via FTP – BBS Bematech (www.bematech.com.br) Via BBS, siga os seguintes passos: 1. Acesse www.bematech.com.br e clique em Área restrita. 2. Selecione BBS Gemco e entre com o usuário e a senha fornecidos pela Bematech, selecione os arquivos em “Recebimento” e copie para um diretório de controle dos Scripts em sua máquina. Observação: Se não possuir nenhum usuário e senha, solicite ao Suporte Bematech. A BBS armazena os arquivos por tempo limitado, onde a cada 3 meses é realizada uma limpeza automática dos arquivos disponibilizados. Por isso salientamos a importância de sempre copiar os arquivos para a Estação ou Servidor assim que disponíveis. 4. Organize os Scripts Organize seus scripts. A organização é fundamental para que não haja faltas na ordem de execução e para que tenhamos o histórico do que já foi executado. Sugerimos a criação de um pasta “scripts” no diretório C:\Suporte\ do próprio servidor ou estação administrativa no Data Center. Abaixo desse diretório crie duas pastas: “Executados” e “Novos”. Assim, teríamos a seguinte estrutura: C:\Suporte\Scripts\Executados C:\Suporte\Scripts\Novos No banco de dados à tabela GEMCO_SCRIPTS_EXECUTADOS registra os scripts executados. Para listar os scripts executados, execute o seguinte comando no SQL Query Analizer (SQL Server) ou SQL Plus (Oracle): select * from gemco_scripts_executados order by script 5. Nomenclaturas padrão dos bancos de dados Como referência, ao implantar o sistema Gemco, adotamos a seguinte nomenclatura para os bancos de dados: Produção Treinamento e testes Demonstração CEP SQL Server dbGemco dbTreinamento dbDemo dbCep Oracle GEMCO TREINO DEMO CEP 6. Tipos e ordem de execução dos scripts Os arquivos para atualização ou manutenção do banco de dados possuem a extensão .SQL e são denominados scripts. Os scripts podem ser de dois tipos: banco de dados ou segurança. Nomenclatura para SQL Server: Scripts de banco de dados: IPLAA0000.SQL Scripts de segurança: SQDDMMAA.SQL Scripts de banco de dados - Modular: MODAA0000.SQL Nomenclatura para Oracle: Scripts de banco de dados: IPLAA0000.ORA Scripts de segurança: ORDDMMAA.SQL Scripts de banco de dados - Modular: MODAA0000.ORA Onde AA é o ano em que o script foi desenvolvido (exemplo: 13 refere-se a scripts do ano de 2013). Onde MOD é o modular em que o script foi desenvolvido (exemplo: FIN refere-se a scripts do modular Financeiro). Ordem de execução A ordem de execução dos scripts para atualizar o banco de dados deve respeitar a sequência de AA (Ano) e depois a sequência Numérica. Já a execução dos scripts de segurança deve respeitar a sequência da Data. Exemplo (no caso, para scripts SQL Server): Suponha que tenham sido recebidos os seguintes scripts: Script Data Hora Tamanho IPL130001.SQL 28/12/2013 14:30 60 SQ210913.SQL 21/09/2013 9:59 221 IPL140002.SQL 25/01/2014 15:34 181 SQ030114.SQL 03/01/2014 17:02 2.343 FIN14010.SQL 13:02 20 02/02/2014 Primeiro, deverão ser executados os scripts para atualização do banco de dados: Script Data IPL130001.SQL 28/12/2013 IPL140002.SQL 25/01/2014 FIN14010.SQL 02/02/2014 Depois, deverão ser executados os scripts para atualização da segurança do Gemco. Script Data SQ210913.SQL 21/09/2013 SQ030114.SQL 03/01/2014 7. Procedimento para executar os scripts em SQL Server Os scripts deverão ser executados conforme a ordem apresentadas no tópico 7, através do utilitário MS Query Analyzer ou SQL Server Management Studio. 1. 2. 3. 4. 5. SQL Server Informe o nome do Servidor de Banco de Dados Login Name gemco Password gemco (ou a senha definida) Ok Após a conexão, certifique-se de que o banco apropriado esteja selecionado na barra de ferramentas. Na pasta identificada por QUERY, na metade superior da tela: 1. 2. 3. 4. Escolha no Menu principal a opção FILE, OPEN Na caixa OPEN FILE, selecione o arquivo .SQL OPEN < ENTER > Execute o script clicando na a opção QUERY, EXECUTE ou pressione as teclas CTRL+E. Repita os passos 1 à 4 para todos os scripts novos que ainda não foram executados. Lembre-se sempre de seguir a sequência conforme explicado no tópico 7. 8. Procedimento para executar os scripts em Oracle Os scripts deverão ser executados conforme a ordem apresentadas no tópico 7, através do utilitário SQL Plus. Conecte-se com o servidor, preenchendo as seguintes informações: 1. Username GEMCO (no Oracle, o usuário determina qual é a base de dados que sera atualizada) 2. Password GEMCO (ou a senha definida) 3. Host String String de conexão com o servidor de banco de dados 4. Ok < ENTER > 5. No prompt identificado por SQL> digite @<CAMINHO>\<SCRIPT> Exemplo: SQL> @C:\G2002\SCRIPTS\SET00010 <ENTER> Repita o passo 5 para todos os novos scripts restantes. Apêndice A – Principais mensagens de erro ao executar scripts em SQL Server Mensagens na execução normal do script: Mensagem Explicação The command(s) completed successfully. Indica que o comando executado não retorna dados. Ocorre quando o comando executado for: CREATE TABLE, ALTER TABLE (coluna e remoção de constraint), DROP TABLE, CREATE INDEX, DROP INDEX. (‘X’ row(s) affected) Indica que o comando alterou ‘X’ linhas da tabela em questão. Ocorre quando o comando executado for: INSERT INTO, UPDATE, DELETE, ALTER TABLE (adição: Primary Key, Foreign Key). Caution: Changing any part of an object Indica que o objeto ‘XX’ (objeto ou coluna) foi name could break scripts and stored renomeado para ‘YY’. Informa também que procedures. poderão ocorrer problemas com stored The ‘XX’ was renamed to ‘YY’. procedures ou scripts. Default bound to column. Indica que foi associado um default a determinada coluna de determinada tabela. Default unbound from table column. Indica que foi removida a associação de um default de determinada coluna de determinada tabela. Para script executado mais de uma vez: Mensagem Server: Msg 2714, Level 16, State 6, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already an object named ‘XX’ in the database. Server: Msg 2705, Level 16, State 4, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Column names in each table must be unique. Column name ‘XX’ in table ‘YY’ is specified more than once. Server: Msg 15335, Level 11, State 1, Procedure sp_rename, Line 332 [Microsoft][ODBC SQL Server Driver][SQL Server]Error: The @newname value ‘XX’ is already in use as a object name and Explicação Indica que o objeto ‘XX’ (tabela, primary key, foreign key ou index) já existe no banco de dados. Indica que a coluna ‘XX’ já existe na tabela ‘YY’. Indica a tentativa de renomear um objeto (Tabela, Primary Key, Foreign Key ou Index) com um nome que já existe no banco de dados. would cause a duplicate that is not permitted. Server: Msg 15225, Level 11, State 1, Indica a tentativa de renomear uma coluna com Procedure sp_rename, Line 271 um nome que já existe no banco de dados. [Microsoft][ODBC SQL Server Driver][SQL Server]No item by the name of ‘XX’ could be found in the current database ‘DB’, given that @itemtype was input as '(null)'. Mensagem de advertência que poderá retornar: Mensagem Server: Msg 1779, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Table 'XX' already has a primary key defined on it. Server: Msg 1750, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Could not create constraint. See previous errors. Server: Msg 3701, Level 11, State 5, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot drop the table ‘XX’, because it does not exist in the system catalog. Server: Msg 1913, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]There is already an index on table ‘XX’ named ‘YY’. Server: Msg 3703, Level 11, State 7, Line 1 [Microsoft] [ODBC SQL Server Driver][SQL Server]Cannot drop the index ‘XX’, because it does not exist in the system catalog. Server: Msg 3701, Level 11, State 5, Line 1 [Microsoft] [ODBC SQL Server Driver][SQL Server]Cannot drop the trigger ‘XX’, because it does not exist in the system catalog. Explicação Indica tentativa de criar uma primary key na tabela ‘XX’, sendo que esta já existe. Indica que a tabela ‘XX’ não pode ser apagada porque não existe no banco de dados. Indica que o índice ‘YY’ não pode ser apagado porque já existe no banco de dados. Indica que o índice ‘XX’ não pode ser apagado porque não existe no banco de dados. Indica que o trigger ‘XX’ não pode ser apagado porque não existe no banco de dados. Server: Msg 2627, Level 14, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of PRIMARY KEY constraint ‘XX’. Cannot insert duplicate key in object ‘YY’. The statement has been terminated. Server: Msg 547, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]INSERT statement conflicted with COLUMN FOREIGN KEY constraint ‘XX’. The conflict occurred in database ‘DB’, table ‘YY’, column ‘WW’. The statement has been terminated. Server: Msg 3728, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server] ‘XX’ is not a constraint. Server: Msg 3727, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Could not drop constraint. See previous errors. Server: Msg 1776, Level 16, State 1, Line 1 [Microsoft] [ODBC SQL Server Driver][SQL Server]There are no primary or candidate keys in the referenced table ‘XX’ that match the referencing column list in the foreign key ‘YY’. Server: Msg 1750, Level 16, State 1, Line 1 [Microsoft][ODBC SQL Server Driver][SQL Server]Could not create constraint. See previous errors. Indica que violou a primary key ‘XX’ da tabela ‘YY’. Ocorreu uma tentativa de inserir uma linha na tabela com os campos que formam a primary key ‘XX’ já existente na tabela ‘YY’. Indica que violou a foreign key ‘XX’ da tabela. Ocorreu uma tentativa de inserir uma linha na tabela com um campo ‘WW’ que deveria existir na tabela ‘YY’ e não existe. Indica que o objeto ‘XX’ não foi encontrado no banco de dados e portanto não foi possível executar o comando para eliminar a constraint (Primary Key ou Foreign Key). Ou não existe a constraint ou então possui outro nome. Indica tentativa de criar uma foreign key ‘YY’ sem existir a primary key na tabela referenciada ‘XX’. Mensagens que necessitam da interferência do usuário: Mensagem Can't allocate space for object ‘X’ in database ‘DB’ because the ‘Y’ segment is full. If you ran out of space in Syslogs, dump the transaction log. Otherwise, use ALTER DATABASE or sp_extendsegment to increase the size of the segment. Explicação Indica que o não há mais espaço no log de transações, e este precisa ser limpo. Normalmente este erro ocorre quando é um comando muito extenso for executado no banco de dados. Caso a limpeza do log não solucione o problema, deve-se verificar o tamanho do TEMPDB. Caso o erro persista, deve-se verificar o tamanho do BANCO DE DADOS. Apêndice B – Principais mensagens de erro ao executar scripts em Oracle Mensagens na execução normal do script: Mensagem Table created. Table altered. Index created. Sequence created. ‘X’ row(s) created. ‘X’ rows selected. ‘X’ row(s) updated. ‘X’ row(s) deleted. Table truncated. Table renamed. Trigger created. Procedure created. PL/SQL procedure successfully completed. Table dropped. Index dropped. Sequence dropped. Trigger dropped. Procedure dropped. Explicação Indica que a tabela foi criada com sucesso. Ocorre quando o comando executado for CREATE TABLE. Indica que o comado ALTER TABLE foi realizado com sucesso (Adicionar Coluna, associar Default, criar Primary Key, criar Foreign Keyremover Primary Key, remover Foreign Key ou modificar o tamanho / tipo da coluna). Indica que o índice foi criado com sucesso, através do comando CREATE INDEX. Indica que a sequência foi criada com sucesso. Indica que o comando inseriu ‘X’ linhas da tabela em questão. Ocorre quando o comando executado for INSERT INTO. Indica número de linhas selecionados pelo comando SELECT (este retorno só aparecerá se o número de linhas retornadas for maior ou igual a 6). Indica que o comando alterou ‘X’ linhas da tabela em questão. Ocorre quando o comando executado for UPDATE. Indica que ‘X’ linhas foram removidas da tabela em questão. Ocorre quando o comando executado for DELETE. Indica que a tabela foi truncada, ou seja, todas as linhas da tabela foram removidas. Indica que a tabela foi renomeada. Este é o único objeto que pode ser renomeado no Oracle. Indica que o trigger foi criada com sucesso. Indica que a stored procedure foi criada com sucesso. Indica que o procedimento (Stored Procedure ou um PL/SQL) foi executado com sucesso. Indica que a tabela foi eliminada com sucesso. Indica que o índice foi eliminado com sucesso. Indica que a sequência foi eliminada com sucesso. Indica que o trigger foi eliminada com sucesso. Indica que a stored procedure foi eliminada com sucesso. Para script executado mais de uma vez: Mensagem ERROR at line 1: ORA-00955: name is already used by an existing object. ERROR at line 1: ORA-01430: column being added already exists in table ERROR at line 1: ORA-02260: table can have only one primary key ERROR at line 2: ORA-02275: such a referential constraint already exists in the table ERROR at line 1: ORA-04081: trigger 'XX_TR' already exists ERROR at line 2: ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found Explicação Indica que o objeto (tabela, primary key, foreign key, índice, stored procedure, sequence) já existe no usuário de banco de dados. Indica que a coluna já existe no usuário de banco de dados. Indica que a tabela já possui primary key. Indica que a tabela já possui foreign key. Indica que o trigger ‘XX_TR’ já existe no usuário de banco de dados. Indica tentativa de criar índice único, sendo que este já existe. Mensagens de advertência: Mensagem ERROR at line 1: ORA-02260: table can have only one primary key ERROR at line 1: ORA-00942: table or view does not exist ERROR at line 1: ORA-01418: specified index does not exist ERROR at line 1: ORA-04080: trigger 'XX_TR' does not exist ERROR at line 1: ORA-00001: unique constraint (GEMCO.XX) violated ERROR at line 1: ORA-02291: integrity constraint (GEMCO.X_FK_Y) violated - parent key not found Explicação Indica tentativa de criar uma Primary Key na tabela ‘XX’, sendo que esta já existe. Indica que a tabela em questão não pode ser apagada porque não existe no usuário de banco de dados. Indica que o índice em questão não pode ser apagado porque não existe no usuário de banco de dados. Indica que o trigger ‘XX_TR’ não pode ser apagado porque não existe no usuário de banco de dados. Indica que violou a Primary Key ou o índice único ‘XX’. Ocorreu uma tentativa de inserir uma linha na tabela com os valores das colunas que formam a Primary Key ou o índice único já existentes na tabela. Indica que violou a foreign key ‘X_FK_Y’ da tabela. Ocorreu uma tentativa de inserir uma linha na tabela com um campo ‘WW’ que deveria existir na tabela ‘Y’ e não existe. ERROR at line 1: ORA-02443: Cannot drop constraint nonexistent constraint Indica que o objeto não foi encontrado no - usuário de banco de dados e portanto não foi possível executar o comando para eliminar a constraint (Primary Key ou Foreign Key). Ou não existe a constraint ou então possui outro nome. Indica que não foi possível eliminar a Primary Key porque esta não existe. ERROR at line 1: ORA-02441: Cannot drop nonexistent primary key ERROR at line 3: ORA-02270: no matching unique or primary key for this column-list ERROR at line 1: ORA-02266: unique/primary keys in table referenced by enabled foreign keys ERROR at line 1: ORA-00902: invalid datatype ERROR at line 1: ORA-00947: not enough values ERROR at line 1: ORA-02298: cannot enable (GEMCO.XX_FK_Y) - parent keys not found Indica tentativa de criar uma Foreign Key sem existir a Primary Key na tabela referenciada. Indica tentativa de eliminar uma tabela que é referenciada por outra com uma Foreign Key. Indica tentativa de criar relacionamento para Foreign Key com colunas de tipos diferentes. Indica tentativa de inserir dados na tabela com número de argumentos do Insert diferente do número do Values. Indica tentativa de criar um relacionamento entre a tabela ‘XX’ e ‘Y’, sendo que o dado da Foreign Key da tabela filho ‘XX’ não existe na tabela pai ‘Y’. Mensagens que necessitam da interferência do usuário: Mensagem Explicação Warning: Trigger created with compilation Indica que o trigger foi gerada com erro de errors. compilação. Será necessário corrigi-lo. Para a visualização do erro digitar no prompt do SQL Plus: SQL> show error trigger NOME_DO_TRIGGER <enter> Warning: Procedure created with Indica que a stored procedure foi gerada com compilation errors. erro de compilação. Será necessário corrigi-lo. Para a visualização do erro digitar no prompt do SQL Plus: SQL> show error procedure NOME_DA_SP <enter> ERROR at line 1: Indica que o comando não foi terminado ORA-00933: SQL command not properly apropriadamente. Será necessário corrigi-lo. ended ERROR at line 1: ORA-01658: unable to create INITIAL extent for segment in tablespace GEMCO_DAT ERROR at line 1: ORA-01555: snapshot too old (rollback segment too small) ERROR at line 1: ORA-01562: failed to extend rollback segment ID = num Indica que não foi possível executar o comando (CREATE TABLE, INSERT INTO) porque não existe mais espaço em disco disponível. Indica que o segmento de rollback habilitado é muito pequeno. Indica que não foi possível aumentar o segmento de rollback identificado por ‘NUM’.