SEFAZ-BA SGF DTI GEDES Secretaria da Fazenda do Estado da Bahia Superintendência da Gestão Fazendária Diretoria de Tecnologia da Informação Gerência de Administração de Dados e Desenvolvimento de Sistemas MANUAL DE PADRÕES BANCO Versão 01.28.00 Salvador (Ba), maio de 2017 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 CONTROLE DE VERSÃO Versão Data Responsável Histórico 01.24.00 15/02/2013 Equipe AD (Padrões) 1. Alteração no item LEGENDA E CABEÇALHO 01.25.00 16/12/2013 Equipe AD (Padrões) 1. Alteração no item LEGENDA E CABEÇALHO 01.26.00 22/10/2014 Equipe AD (Padrões) Alterações nos seguinte itens: 1. CONSIDERAÇÕES GERAIS 2. NOMES LÓGICOS DOS SERVIDORES 01.27.00 20/05/2015 Equipe AD (Padrões) Alterações nos seguinte itens: 1. NOMES LÓGICOS DOS SERVIDORES 2. NOMENCLATURA DE OBJETOS DE BANCO DE DADOS 01.28.00 20/11/2015 Equipe AD (Padrões) Alteração no item: CONSIDERAÇÕES GERAIS Página 2 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 RESUMO O presente documento contempla os Padrões de Banco de Dados adotados na Secretaria da Fazenda do Estado da Bahia. Esse Manual abrange desde a nomenclatura para criação de usuários até os objetos gerenciados ou não pela Ferramenta Case adotada. Esse Manual não contempla recomendações sobre quando, como e/ou onde usar ou não determinadas funcionalidades providas pelo SQL Server. Quando for necessário buscar informações desse tipo, deve-se ler o documento Boas Práticas de Programação - TransactSQL.doc. Por fim, os procedimentos em relação à criação dos objetos no Banco de Dados estão descritos no Manual de Procedimentos Gerais de Sistemas. Página 3 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 ÍNDICE 1. ACESSO (LOGINS, GRUPOS E USUÁRIOS) ................................................................5 1.1. LOGINS .................................................................................................................................. 5 1.1.1. GRUPOS E USUÁRIOS ................................................................................................ 5 2. NOMENCLATURA DE OBJETOS ..................................................................................6 2.1. CONSIDERAÇÕES GERAIS ................................................................................................ 6 2.2. NOMENCLATURA DE OBJETOS DE BANCO DE DADOS .............................................. 7 2.2.1. BANCO DE DADOS ..................................................................................................... 7 2.2.2. STORED PROCEDURES ............................................................................................. 8 2.2.3. USER FUNCTIONS ...................................................................................................... 9 2.2.4. TRIGGERS .................................................................................................................... 9 2.2.5. VIEWS ......................................................................................................................... 10 2.2.5.1. 2.2.5.2. 2.2.5.3. 2.2.5.4. 2.2.5.5. 2.2.6. 2.2.7. 2.2.8. 2.2.9. 2.2.10. 2.2.11. 2.2.11.1. 2.2.11.2. 2.2.12. 2.2.13. 2.2.14. 2.2.15. 2.2.16. 2.2.17. 2.2.18. 2.2.19. 2.2.20. 2.2.20.1. 2.2.20.2. 2.2.21. 2.2.21.1. 2.2.21.2. 2.2.21.3. 2.2.21.4. 2.2.21.5. 2.2.21.6. 3. PACOTES DTS DO DW ............................................................................................. 12 CUBOS DO DW .......................................................................................................... 14 DATA SOURCE NAME (DSN) .................................................................................. 15 ESTATÍSTICAS DE BANCO ..................................................................................... 15 SERVIDOR .................................................................................................................. 15 INSTÂNCIAS .............................................................................................................. 16 INSTÂNCIA PADRÃO ......................................................................................................... 16 INSTÂNCIA NOMEADA ..................................................................................................... 16 SCHEMAS ................................................................................................................... 17 SINÔNIMOS ................................................................................................................ 17 LINKED SERVER ....................................................................................................... 17 NOMES LÓGICOS DOS SERVIDORES ................................................................... 18 INSTÂNCIAS POR NOME LÓGICO DOS SERVIDORES ...................................... 18 JOBS ............................................................................................................................ 19 FILAS ........................................................................................................................... 20 ENTIDADE .................................................................................................................. 20 ATRIBUTO.................................................................................................................. 23 ATRIBUTO FONETIZADO ................................................................................................. 24 TIPO DE DADOS .................................................................................................................. 25 CONSTRAINTS .......................................................................................................... 28 CHAVE PRIMÁRIA ............................................................................................................. 28 ÍNDICE SECUNDÁRIO........................................................................................................ 28 ÍNDICE PARA TESTES DE PERFORMANCE ................................................................... 29 CHAVE ESTRANGEIRA ..................................................................................................... 29 CHECK .................................................................................................................................. 30 DEFAULT ............................................................................................................................. 31 INDEPENDÊNCIA DE CODIFICAÇÃO .......................................................................32 3.1. 3.2. 4. VIEWS COMUNS ................................................................................................................. 10 VIEWS DE REPLICAÇÃO ................................................................................................... 11 VIEWS DE LINKED SERVER ............................................................................................. 11 VIEWS INDEXADAS ........................................................................................................... 11 VIEWS DO DW..................................................................................................................... 12 USO DE COMANDOS “SELECT *” E “INSERT *” ........................................................... 32 REFERENCIAR ENTIDADES E ATRIBUTOS .................................................................. 32 PADRÃO DE LAYOUT DE TRIGGERS .......................................................................32 4.1. 4.2. 4.3. 4.4. 4.5. CONSIDERAÇÕES GERAIS .............................................................................................. 32 TRIGGERS SEM CURSOR ................................................................................................. 33 TRIGGERS COM CURSOR ................................................................................................ 35 TRIGGERS INSTEAD OF INSERT ..................................................................................... 37 TRIGGERS DE AUDITORIA .............................................................................................. 38 Página 4 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 1. ACESSO (LOGINS, GRUPOS E USUÁRIOS) 1.1. LOGINS Normalmente são gerados 2(dois) logins de acesso a banco: 1(um) para o usuário 1(um) para o usuário ca AMBIENTE DE PRODUÇÃO Os logins gerados para este ambiente são: 1(um) para o usuário da Rede 1(um) para o usuário ca_usuário da Rede Apenas o usuário ca_usuário da Rede tem acesso ao banco de dados, sendo que este é dado pelo gestor do sistema através da aplicação de Controle de Acesso. AMBIENTE DE DESENVOLVIMENTO Os logins gerados para este ambiente são: 1(um) para o projeto (usar o código do projeto cadastrado no ASA) 1(um) para o usuário ca_projeto O acesso ao banco de dados, via Query Analyzer, para o usuário projeto é solicitado pelo Coordenador do Sistema que indica o tipo de permissão que deve ser concedida a este. Estes usuários normalmente são desenvolvedores de sistema. 1.1.1. GRUPOS E USUÁRIOS Existem dois grupos criados no SQL, para acesso aos bancos de dados: grp_atualização: acesso para consulta, inclusão, alteração e exclusão ao(s) banco(s) solicitados grp_consulta: acesso de leitura ao(s) banco(s) solicitados Os usuários são incluídos nos grupos através de seus logins, a partir da solicitação do Coordenador do Sistema. Página 5 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 2. NOMENCLATURA DE OBJETOS 2.1. CONSIDERAÇÕES GERAIS Os objetos devem ter nomes formados por uma ou poucas palavras, preferencialmente substantivos, que os identifiquem da forma mais completa possível para que possa expressar claramente o seu conteúdo, evitando a utilização de siglas e abreviações desnecessárias e também observando a cultura da organização e não apenas o contexto do sistema, sempre visando manter o modelo de dados corporativo da SEFAZ, assim como reutilizar definições já existentes neste modelo. Para objetos cuja nomenclatura seja gerenciada pela Ferramenta Case, o limite de tamanho é determinado pela Ferramenta Case. Para os objetos não definidos através da Ferramenta Case, deve prevalecer o bom senso no sentido de criar nomes claros, intuitivos e condizentes com a realidade. Deve-se utilizar: Nomes formados por uma ou poucas palavras (substantivos que os identifiquem); Letras minúsculas; Palavras no singular; Caracter sublinhado (‘_’) como conector de palavras, em lugar de preposição, conjunção ou artigo; Preferencialmente palavras em português. Não se deve utilizar: Siglas; Abreviações que prejudiquem a clareza do nome do objeto; Acentuação ou cedilha; Formatação ou caracteres especiais; Palavras em outro idioma, exceto quando não for possível encontrar uma palavra na língua portuguesa que expresse claramente o significado do objeto, ou quando o termo em outro idioma já for de uso comum de forma que traduzir traga mais um complicador do que usá-lo em outro idioma. Exemplos: software, hardware, qrcode, token. NOTA: Todos os servidores de banco de dados SQL Server da SEFAZ têm como padrão de instalação as opções code page Multilingual e sort order binary. Toda e qualquer aplicação desenvolvida para este ambiente deve levar em consideração essas configurações. Desenvolver aplicações em servidores com configurações diferentes das citadas representa um risco de surgimento de erros como conflitos de nomes, inconsistência de dados e discrepância de resultados entre os ambientes de desenvolvimento, homologação e produção. Página 6 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 2.2. NOMENCLATURA DE OBJETOS DE BANCO DE DADOS 2.2.1. BANCO DE DADOS O padrão de nomenclatura para os bancos de dados transacionais é: bd_xxx...xxx Onde: bd é uma abreviatura de Banco de Dados; xxx...xxx indica o nome do banco de dados. Os Padrões de Nomenclatura para os bancos do DW são: dw_staging_area Onde: dw é uma abreviatura de datawarehouse staging_area significa área de armazenamento temporária dw_dimensao Onde: dw é uma abreviatura de datawarehouse dimensao significa área de armazenamento das tabelas de dimensões dw_fatos...xxx Onde: dw é uma abreviatura de datawarehouse fatos significa área de armazenamento das tabelas fatos xxx indica o assunto dw_mddb_views Página 7 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 Onde: dw é uma abreviatura de datawarehouse mddb_views significa área de armazenamento das views de acesso via Hyperion dw_credito_views Onde: dw é uma abreviatura de datawarehouse credito_views significa área de amazenamento das views de acesso via Access 2.2.2. STORED PROCEDURES O padrão de nomenclatura para as Stored Procedures é: up_vvv...vvv_ddd...ddd Onde: up é uma abreviatura de User Procedure vvv...vvv é um verbo no infinitivo ddd...ddd é um nome livre Exemplo: Caso seja criada uma Stored Procedure para calcular o valor do auto de infração, o nome desse objeto deveria ser up_calcular_valor_auto_infracao. NOTA: Para procedures de cargas do DW o verbo no infinitivo “vvv...vvv” deverá ser substituído por “cg”. Exemplo: up_cg_fat_indicador_credito O padrão de nomenclatura para Variáveis e Parâmetros nas procedures é: yyy_vvvvvvvvvvvv Onde: yyy indica o tipo do atributo definido (Atributo) vvvvvvvvvvvv indica o nome da variável Página 8 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 2.2.3. USER FUNCTIONS O padrão de nomenclatura para as User Functions é: uf_ddd...ddd Onde: uf é uma abreviatura de User Function ddd...ddd é um nome livre, que NÃO deve iniciar com um verbo e sim com um termo que indique o dado que será retornado através dessa função. Exemplo: Caso seja criada uma User Function para retornar o próximo dia útil, o nome desse objeto poderia ser uf_dia_util. NOTA: Antes de criar uma função, deve-se consultar a equipe de DBA para verificar a sua real necessidade. Fora isso, deve-se verificar também a pré-existência de alguma função que possa ser reutilizada. O padrão de nomenclatura para Variáveis e Parâmetros nas user functions é: yyy_vvvvvvvvvvvv Onde: yyy indica o tipo do atributo definido (Atributo) vvvvvvvvvvvv indica o nome da variável 2.2.4. TRIGGERS O padrão de nomenclatura para os triggers de integridade referencial é: tg_ref_ttt...ttt_ooo Onde: tg é uma abreviatura de trigger ref indica que é trigger de integridade referencial ttt...ttt indica o nome da entidade ooo indica o tipo da operação efetuada “ins” para trigger de insert “upd” para trigger de update “del” para trigger de delete O padrão de nomenclatura para os triggers de negócio é: tg_neg_ttt...ttt_ooo Onde: Página 9 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 tg é uma abreviatura de trigger neg indica que é trigger de negócio ttt...ttt indica o nome da entidade ooo indica o tipo da operação efetuada “ins” para trigger de insert “upd” para trigger de update “del” para trigger de delete O padrão de nomenclatura para os triggers de auditoria é: tg_ttt...ttt_aud Onde: tg é uma abreviatura de trigger ttt...ttt indica o nome da entidade aud indica que é trigger de auditoria Se a entidade for um nome composto, caso seja necessário, pode-se abreviá-lo, porém deve-se manter o sublinhado (_) separando os nomes e contemplar todas as “partes” que compõe o nome da entidade. Exemplo: Caso seja criado o trigger de negócio para a operação de insert da tabela ocorrencia_movim_fisc_autom, o nome do trigger poderia ser tg_neg_ocorr_mov_fisc_autom_ins, mas não tg_neg_ocorr_fisc_autom_ins, por exemplo, pois o nome da tabela não foi totalmente contemplado (retirou a parte mov). NOTAS: O Manual de Procedimentos Gerais de Sistemas aborda algumas considerações sobre triggers. O SQL 2000 permite a criação de triggers INSTEAD OF, mas os mesmos NÃO devem ser utilizados, pois a criação de um trigger INSTEAD OF em uma tabela omite a execução dos demais triggers (AFTER) para a mesma operação naquela mesma tabela. A única indicação para uso desse trigger é o caso de tabelas que devem possuir apenas uma linha (como as tabelas utilizadas para geração de números seqüenciais e as tabelas de parâmetros de sistema). Para verificar o padrão para a criação de triggers deve-se consultar o item 4 – Padrão de Layout de Triggers 2.2.5. VIEWS Antes de efetuar a criação de qualquer view, deve-se consultar o Manual de Procedimentos Gerais de Sistemas. Nesse documento existe um tópico que relaciona considerações sobre a criação desses objetos de banco. 2.2.5.1. VIEWS COMUNS Página 10 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 O padrão de nomenclatura para as Views comuns é: vw_ttt...ttt Onde: vw é uma abreviatura de View ttt...ttt é um nome que descreve a view. O nome da view deve contemplar o assunto que ela trata e não os nomes das tabelas envolvidas. 2.2.5.2. VIEWS DE REPLICAÇÃO O padrão de nomenclatura para as Views de Replicação é: vr_ttt...ttt Onde: vr é uma abreviatura de View de Replicação ttt...ttt é um nome que descreve a view. O nome da view deve contemplar o assunto que ela trata e não os nomes das tabelas envolvidas. NOTA: As views de Replicação só devem ser criadas pela GETEC. 2.2.5.3. VIEWS DE LINKED SERVER O padrão de nomenclatura para as Views de Linked Server é: vl_ttt...ttt Onde: vl é uma abreviatura de View de Linked Server ttt...ttt é o nome da tabela que a view referencia. Exemplo: Um trigger no servidor S1 precisa acessar a tabela tab no servidor SSED03W. Logo, uma view chamada vl_tab será criada em S1 com o seguinte código: CREATE VIEW vl_tab AS SELECT campo1, campo2, ... FROM CORPORATIVO.nome_do_banco.dbo.tab Local para criação de Views de Linked Server: Banco: bd_linked 2.2.5.4. VIEWS INDEXADAS O padrão de nomenclatura para as Views Indexadas é: vi_ttt...ttt Página 11 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 Onde: vi é uma abreviatura de View Indexada ttt...ttt é um nome que descreve a view. O nome da view deve contemplar o assunto que ela trata e não os nomes das tabelas envolvidas. NOTA: Devido às restrições existentes em relação ao uso de Views Indexadas, o analista que identificar a necessidade de utilização das mesmas deve conversar previamente com a GETEC (DBA e AnalistaDO de DW Performance). VIEWS Só deve ser 2.2.5.5. VIEWS DO DW O Padrão específico de Nomenclatura para as Views do DW, quando estas representarem apenas uma tabela e não possuírem nenhuma cláusula de restrição, é: ttt...ttt Onde: ttt...ttt é o mesmo nome da tabela a ser disponibilizada para a camada semântica de abstração. Exemplo: Uma view para representar a tabela fato fat_indicador_credito deverá se chamar fat_indicador_credito Entretanto, quando as views representarem uma consulta que envolva mais de uma tabela e/ou contiverem alguma cláusula de restrição, o padrão de nomenclatura a ser seguido deverá ser aquele já estabelecido neste documento no item 2.2.5.1 – VIEWS COMUNS. Exemplo: Uma view que representar uma consulta à tabela fato fat_indicador_credito e, na intenção de restringir os dados ao ano corrente, à dimensão dim_tempo poderá se chamar vw_indicador_credito_atual NOTA: As views são criadas no banco dw_mddb_views para representarem uma camada de abstração que omita da ferramenta OLAP certos detalhes técnicos como, por exemplo, os nomes de bancos de dados, de campos seqüenciais. 2.2.6. PACOTES DTS DO DW O padrão de nomenclatura para os Pacotes de Download de Dimensões do DW é: pck_dwh_dim_ddd...ddd Página 12 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 Onde: pck_dwh é uma abreviatura de pacote de DW dim é uma abreviatura de Dimensão ddd...ddd é um nome livre O padrão de nomenclatura para os Pacotes de Download de Fatos do DW é: pck_dwh_fat_ddd...ddd Onde: pck_dwh é uma abreviatura de pacote de DW fat é uma abreviatura de Fato ddd...ddd é um nome livre NOTA: Os pacotes de download são gerados a partir do Enterprise Manager e têm como objetivo carregar as tabelas auxiliares que serviram como base para a carga das tabelas de dimensão e fato. O padrão de nomenclatura para os Pacotes de Carga de Dimensões do DW é: pck_dwh_proc_dim_ddd...ddd Onde: pck_dwh é uma abreviatura de pacote de DW proc é uma abreviatura de procedure dim é uma abreviatura de Dimensão ddd...ddd é um nome livre O padrão de nomenclatura para os Pacotes de Carga de Fatos do DW é: pck_dwh_proc_fat_ddd...ddd Onde: pck_dwh é uma abreviatura de pacote de DW proc é uma abreviatura de procedure fat é uma abreviatura de Fato ddd...ddd é um nome livre O padrão de nomenclatura para os Pacotes de ações que não sejam carga de tabelas Fatos ou Dimensões do DW é: pck_dwh_vvv…vvv_ddd...ddd Página 13 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 Onde: pck_dwh é uma abreviatura de pacote de DW vvv...vvv é um verbo no infinitivo ddd...ddd é um nome livre Exemplo: O pacote DTS para limpar a área de Staging pode ter o nome pck_dwh_limpar_staging.dts NOTA: Os pacotes de carga são gerados a partir do Enterprise Manager e têm como objetivo carregar as tabelas de dimensão e fato. 2.2.7. CUBOS DO DW O padrão de nomenclatura para os Cubos do DW é: cb_ddd…..ddd Onde: cb é uma abreviatura de cubo de DW ddd...ddd é um nome livre que deve detalhar o assunto NOTA: Os Cubos são criados para armazenar dados em uma estrutura multidimensional de fácil navegação. Podem ser previamente VIRTUAIS CUBOS calculados, otimizando o tempo de recuperação das informações. O padrão de nomenclatura para os Cubos Virtuais do DW é: vc_ddd…..ddd Onde: vc é uma abreviatura de virtual cubo DW ddd...ddd é um nome livre que deve detalhar o assunto NOTA: Cubo virtual é um conjunto de cubos, similar às views em uma base de dados relacional. Página 14 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 2.2.8. DATA SOURCE NAME (DSN) O padrão de nomenclatura para os Data Source Name é: dsn_xxx...xxx Onde: xxx...xxxxx indica o tipo do Servidor ( Desenvolvimento ou Produção) Atualmente só devem existir 3 (três) DSN´s: dsn_desenvolvimento (SSED20W) dsn_desenvolvimento_web (SSED02W) dsn_producao (SSED03W) NOTA: Essa nomenclatura só é necessária para aplicações WEB. 2.2.9. ESTATÍSTICAS DE BANCO O padrão de nomenclatura para as Estatísticas de Banco é: est_xxx...xxx_nnn...nnn Onde: xxx...xxxx indica o nome da tabela nnn...nnn indica o nome do campo Exemplo: Estatística do campo num_placa_cavalo para a tabela passe_fiscal: est_passefiscal_numplacacavalo Apesar de ser possível a criação de uma estatística para um conjunto de campos, o SQL Server sempre sugere a criação das estatísticas para cada campo individualmente. NOTA: A criação de estatísticas de banco só pode ser efetuada pela GETEC. Caso o analista precise criar alguma, deve enviar um chamado para _Atendimento GEPIN AD. 2.2.10. SERVIDOR O padrão de nomenclatura para Servidores é: Página 15 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 XYYY...YYY Onde: X indica o ambiente, onde: Desenvolvimento: d Homologação Interna: h Homologação Externa: e Produção: p YYY...YYY indica o nome lógico do servidor ou sua abreviação; O nome do servidor deve possuir até quinze caracteres. 2.2.11. INSTÂNCIAS 2.2.11.1. INSTÂNCIA PADRÃO O padrão de nomenclatura para as Instâncias Padrão é: xxx...xxx Onde: xxx...xxx indica o nome do servidor: NOTA: Este tipo de instância deve ser evitado, sempre que possível. 2.2.11.2. INSTÂNCIA NOMEADA O padrão de nomenclatura para as Instâncias Nomeadas é: xxy_zzz...zzz Onde: xx indica o nome do servidor: Servidor de Banco de Dados: bd y indica o ambiente: Desenvolvimento: d Homologação Interna: h Homologação Externa: e Produção: p zzz...zzz indica o nome da instância propriamente dita ou sua abreviação, devendo cada palavra ser separada da outra pelo “_” NOTA: O nome da instância pode ter até 16 caracteres e deve seguir as regras contidas no Books Online. A GETEC recomenda a utilização de até 15 caracteres p/ nomear a instância, evitando alterações na migração para o SQL 2005 (esta é a limitação de Virtual Server SQL 2005). Página 16 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 2.2.12. SCHEMAS O padrão de nomenclatura para os Schemas é: nnnnnn Onde: nnnnnn é um nome que identifique o negócio. NOTA: Válido apenas para o SQL Server 2005. 2.2.13. SINÔNIMOS O padrão de nomenclatura para os Sinônimos é: xxxxxx Onde: xxxxxx é o mesmo nome do objeto ao qual se refere. Os sinônimos podem ser locais ou remotos. NOTA: Válido apenas para o SQL Server 2005. Todos os sinônimos deverão estar no schema dbo, por isso não é permitido criar objetos diferentes com mesmo nome. 2.2.14. LINKED SERVER O padrão de nomenclatura para os Linked Servers é: yyyyyy Onde: yyyyyy é um nome que identifique o negócio, por instância. Atualmente existem os seguintes Linked Servers: Página 17 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 CORPORATIVO (PCORPORATIVO\BDP_CORPORATIVO) SINTEGRA (PSINTEGRA\BDP_SINTEGRA) NFEN (BDP_NFEN) DATAWAREHOUSE (PDW\BDP_DW) PROCESSAMENTO (BDP_NFEN_PROCESS) 2.2.15. NOMES LÓGICOS DOS SERVIDORES O padrão de nomenclatura para os Nomes Lógicos dos Servidores é: yyyyyy Onde: yyyyyy é um nome que identifique o negócio ou serviço. Exemplos: CORPORATIVO, NFEN. 2.2.16. INSTÂNCIAS POR NOME LÓGICO DOS SERVIDORES O padrão de nomenclatura para as instâncias por nome lógico dos servidores é: xxx...xxx\yyy...yyy Onde: xxx...xxx é um nome que identifica o servidor. yyy...yyy é um nome que identifica a instância. \ - Parte fixa que une a identificação do servidor e da instância. NOTA: Instância por nome lógico dos servidores suporta até 32 caracteres contemplando os sinais de sublinhado e barra invertida. Atualmente existem as seguintes Instâncias por Nomes Lógicos dos Servidores: NOME LÓGICO DO SERVIDOR INSTÂNCIA HOMOLOGAÇÃO EXTERNA DESENVOLVIMENTO HOMOLOGAÇÃO CORPORATIVO DCORPORATIVO\ BDD_CORPORATIVO HCORPORATIVO\ BDH_CORPORATIVO - PCORPORATIVO\ BDP_CORPORATIVO SINTEGRA DSINTEGRA\ BDD_SINTEGRA HSINTEGRA\ BDH_SINTEGRA - PSINTEGRA\ BDP_SINTEGRA NFEN DNFEN\BDD_NFEN - HNFEN\BDE_NFEN BDPNFEN\BDP_NFEN DATAWAREHOUSE DDW\BDD_DW HDW\BDH_DW - PDW\BDP_DW PROCESSAMENTO DNFEN\BDD_NFEN_ PROCESS - HNFEN\ BDE_NFEN_PROCESS Página 18 PRODUÇÃO BDPNFENPROCESS\ BDP_NFEN_PROCESS 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 DNFENREC\ BDD_NFEN_REC_A RECEPCAO DBINFEN\ BDD_BINFEN (Report, Analysis server, Staging) BINFEN - HBINFEN\ BDH_BINFEN (Analysis server, Staging) HENFENRECA\ BDE_NFEN_REC_A PNFENRECA\ BDP_NFEN_REC_A HENFENRECB\ BDE_NFEN_REC_B PNFENRECB\ BDP_NFEN_REC_B HNFENRECC\ BDE_NFEN_REC_C PNFENRECC\ BDP_NFEN_REC_C - HBINFENRS\ BDH_BINFEN_RS (Report) PBINFENAS\ BDP_BINFEN_AS (Analysis server) PBINFEN\BDP_BINFEN (Staging) INTELLINX - - - 10.9.249.252 (PRODEB) SAEB - - - 10.2.8.234 (SAEB) EFD DEFD\BDD_EFD HEFD\BDH_EFD - PEFD\BDP_EFD HYPERION - SSED239W - SSED225W DW ANALYSIS SERVICE - - - SSED224W URA - - - SSED17W BCL DBCL\BDD_BCL HBCL\BDH_BCL - - BCL_RECEPCAO DBCLRECA\ BDD_BCL_REC_A HBCLRECA\ BDH_BCL_REC_A - - BCL_PROCESSAMENTO DBCL\ BDD_BCL_PROCESS HBCL\ BDH_BCL_PROCESS - - NFCE DNFCE\BDD_NFCE HNFCE\BDH_NFCE - - MFC DMFC\BDD_MFC HMFC\BDH_MFC - PMFC\BDP_MFC NOTA: Caso seja necessário criar um linked server, este deverá ter o nome igual ao nome lógico do servidor. 2.2.17. JOBS O padrão de nomenclatura para JOBs de negócio é: neg_xxx...xxxx_ppppp Onde: xxx...xxxx é a descrição do JOB ppppp é o código do projeto Página 19 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 O padrão de nomenclatura para JOBs administrativos é: adm_xxx...xxxx_getec Onde: xxx...xxxx é a descrição do JOB 2.2.18. FILAS O padrão de nomenclatura para filas do service broker é: fila_fff...fff Onde: fff...fff é o nome da fila 2.2.19. ENTIDADE O padrão de nomenclatura para as Entidades é: ttt...ttt Onde: tttt...tttt indica o nome da tabela NOTA: Se a entidade for uma entidade associativa, caso não exista um nome específico no mundo real que identifique o que ela representa, deve-se fazer uma composição dos nomes das tabelas associadas, de forma a se poder identificar quem são elas. Deve-se manter o “_” como separador das diversas partes do nome. O padrão de nomenclatura para as Tabelas Temporárias é: tmp_ttt...ttt Onde: tmp é uma abreviatura de temporária tttt...tttt indica o nome da tabela NOTA: Esse padrão deve ser aplicado para as tabelas cujo conteúdo sempre será excluído antes da execução de algum procedimento. (Exemplo: Tabelas temporárias usadas para armazenamento de dados que serão exibidos em um relatório). As tabelas temporárias que são criadas apenas durante a execução da consulta (query) – tabelas que possuem o símbolo # - não precisam seguir esse padrão. Convém destacar que no Manual de Boas Práticas SQL existem considerações sobre o uso dessas tabelas. Página 20 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 O padrão de nomenclatura para os Consolidados é: cons_ ttt...ttt Onde: cons é uma abreviatura de consolidado tttt...tttt indica o nome da tabela O padrão de nomenclatura para as Tabelas de Histórico é: hist_ ttt...ttt Onde: hist é uma abreviatura de histórico tttt...tttt indica o nome da tabela O padrão de nomenclatura para as Tabelas de Auditoria é: aud_ ttt...ttt Onde: aud é uma abreviatura de auditoria tttt...tttt indica o nome da tabela que será auditada. Exemplo: Se a tabela a ser auditada chama-se contribuinte_inscrito, o nome da tabela de auditoria deve ser aud_contribuinte_inscrito. O padrão de nomenclatura para as Tabelas Particionadas é: ttt...ttt_cccc Onde: tttt...tttt indica o nome da tabela cccc é o critério utilizado para o particionamento como: ano, semestre, situação, etc. Exemplo: Se o critério utilizado para o particionamento da tabela tef_operacao_ecf for o ano, o nome da tabela referente ao ano de 2004 deverá ser tef_operacao_ecf_2004. NOTAS: Convém destacar que no Manual de Procedimentos Gerais de Sistemas (item Procedimento para Tratamento de Tabelas Com Grande Quantidade De Registros) existem considerações NOTAS: sobre estratégias para tratamento de tabelas com grande quantidade de registros. Sempre que for necessário reduzir o nome da entidade para compor algum objeto do banco de dados, deve-se: Reduzir preferencialmente o nome da primeira entidade. Reutilizar o nome reduzido para os outros objetos do banco de dados. Página 21 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 Ao referenciar entidades, deve-se sempre considerar o descrito no item Independência de Codificação deste manual. O padrão de nomenclatura para as Tabelas Auxiliares do DW é: aux_ ttt...ttt Onde: aux é uma abreviatura de auxiliar tttt...tttt indica o nome da tabela Exemplo: Se a tabela se chama auto_infracao, o nome da tabela auxiliar deve ser aux_auto_infracao. NOTA: Tabelas auxiliares são cópias de produção e auxiliam no processo de transformação e carga dos dados. O padrão de nomenclatura para as Tabelas de Dimensões do DW é: dim_ddd...ddd Onde: dim é uma abreviatura de Dimensão ddd...ddd é um nome livre NOTA: As dimensões são tabelas que armazenam as informações descritivas. O padrão de nomenclatura para as tabelas de agrupamento do DW é: agr_ddd...ddd Onde: agr é uma abreviatura de agrupamento ddd...ddd é um nome livre NOTA: Página 22 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 Os agrupamentos são tabelas que armazenam as informações de forma consolidada e auxiliam na carga das tabelas fatos. O padrão de nomenclatura para as Tabelas de Fatos do DW é: fat_ddd...ddd Onde: fat é uma abreviatura de Fato ddd...ddd é um nome livre NOTA: Fatos são tabelas que armazenam as métricas. O padrão de nomenclatura para as Tabelas de Controle de execução de cargas do DW é: ctr_ddd...ddd Onde: ctr é uma abreviatura de Controle ddd...ddd é um nome livre NOTA: As Tabelas de Controle armazenam a situação e a data de execução das cargas. 2.2.20. ATRIBUTO O padrão de nomenclatura para os Atributos é: yyy_ aaa...aaa Onde: yyy indica o tipo do atributo aaa...aaaa é um qualificador do atributo O tipo do atributo deverá ser um dos códigos abaixo. ano des dig dtr hor nom = = = = = = Ano Descrição Digito Data Reduzida (ano/mês, dia/mês ou mês/ano) Hora Nome Página 23 cod dia dtc fon mes num = = = = = = Código Dia Data completa Fonético Mês Número 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação prc seq sts img = = = = 29/05/2017 Percentual Sequencial Status Imagem qtd sig val Xml = = = = Quantidade Sigla Valor Arquivo XML NOTA: dtr – pode estar no formato int ou smallint int => armazenamento de ano e mês ou ano e dia. Quando usar o ano, fazê-lo com 4 dígitos smallint => armazenamento de mês e dia. ano – deve ter 4 digitos. sig - quando o domínio de um campo não for binário (não contemplar apenas Sim ou não, Verdadeiro ou Falso) e que não possa ser tabelado (não possuir tabela básica correspondente). sts – quando o domínio for estritamente binário (contemplar apenas Sim ou não, Verdadeiro ou Falso). cod - quando o domínio de um campo puder ser tabelado (possuir tabela básica correspondente). Os nomes dos campos de código, descrição, nome de tabelas de domínio, devem seguir os nomes das tabelas. Estes nomes podem ser abreviados quando necessário, desde que o significado do mesmo seja claro e o nome completo da tabela seja preservado. Deve ser mantido o caracter “_” para separar as palavras que compõe o nome. Exemplo I: Nome da tabela mensagem_erro Os nomes dos atributos dessa tabela podem ser: cod_mensagem_erro ou cod_mens_erro des_mensagem_erro ou des_mens_erro num_prioridade dtc_atualizacao Exemplo II: Nome da tabela ocorrencia_movim_fisc_autom Os nomes dos atributos dessa tabela podem ser: cod_ocorrencia_mov_fisc_autom ou cod_ocor_mov_fisc_autom des_ocorrencia_mov_fisc_autom ou des_ocor_mov_fisc_autom des_ocorrencia_mov_fisc_autom_resumida ou des_ocor_mov_fisc_autom_resumida dtc_inicio_vigencia dtc_fim_vigencia dtc_atualizacao Nesse caso, os nomes desses campos não podem ser, por exemplo, des_ocorr_fisc_autom, pois não contempla todo o nome da tabela (a parte movim foi omitida). NOTAS: O Manual de Procedimentos Gerais de Sistemas relata algumas considerações sobre o uso de atributos. Ao referenciar atributos, deve ser sempre considerado o descrito no item Independência de Codificação deste manual. 2.2.20.1. ATRIBUTO FONETIZADO Página 24 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 O padrão de nomenclatura para os atributos fonetizados é: fon_ aaa...aaan Onde: yyy indica o tipo do atributo fonetizado aaa...aaaa é um qualificador do atributo n é um número de 1 a 4, visto que sempre serão criados 4 atributos para cada um a ser fonetizado NOTA: Este atributo será sempre do tipo Char, tamanho 4 e podendo ser nulo. O tamanho dos nomes dos atributos fonetizados também é limitado pela ferramenta Case. 2.2.20.2. TIPO DE DADOS Tipos de dados especificam as características dos atributos, parâmetros de stored procedures e variáveis. Na ferramenta CASE devem ser definidos os campos de acordo com os tipos do SQL Server listados na tabela a seguir: SQL SERVER CHAR (n) ACCESS TEXTO VARCHAR (n) TEXTO DESCRIÇÃO Permite valores alfanuméricos. Sempre reserva os n caracteres definidos para o campo. Deve ser usado para campos de código e para pequenas descrições onde o número de caracteres inseridos não variar muito, ficando próximo do limite definido. Permite valores alfanuméricos com no máximo 8.000 caracteres. Como o tamanho total da tabela é 8 Kb, deve-se atentar para não exceder esse limite, uma vez que o tamanho dos campos varchar não está pré-definido. Deve ser usado para campos descritivos de uma maneira geral, desde que não se encaixem na situação definida para CHAR. Constantes alterações em campos do tipo varchar podem implicar em reorganizações físicas e conseqüente overhead nos updates. Permite datas de 01/Jan/1753 até 31/Dez/9999 e hora/minutos/segundos/milesegundos (no formato 00:00:00:000AM/PM), registrados juntos no mesmo campo. Armazena o número em 8 bytes, sendo 2 grupos de 4 bytes inteiros. Pode ser informado só a data ou só a hora. Quando nenhum dos dois for informado, o default é DATETIME Página 25 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 SMALLDATETIME DATA/HORA INT NUMERO/ INTEIROLONGO BIGINT SMALLINT NUMERO/INTEIRO TINYINT NUMERO/BYTE MONEY MOEDA DECIMAL ( p [, s ] ) Página 26 01/Jan/1900 12:00:00:000AM. Valores são movidos para o campo com aspas simples (´). A função CONVERT deve ser utilizada para resgatar somente a data ou hora, variando seu formato. Insere e recupera o dado inteiro (Data/Hora) Permite datas de 01/Jan/1900 até 06/Jun/2079 (no formato mm/dd/aaaa) e hora/minutos, registrados juntos no mesmo campo. Armazena o número em 4 bytes. Quando somente for informada a data, a hora default é 12:00AM, e quando somente for informada a hora, a data default é Jan 1, 1900. Valores são movidos para o campo com aspas simples (´). A função CONVERT deve ser utilizada para resgatar somente a data ou hora, variando seu formato. Insere e recupera o dado inteiro (Data/Hora) Permite números inteiros de -2.147.483.648 até 2.147.483.647, ou seja, -2(31) até 2(31) -1. Armazena o número em 4 bytes. Indicado para números inteiros com até 9 caracteres. Permite números inteiros acima de -9.223.372.036.854.775.808. Armazena o número em 8 bytes. Indicado para números inteiros acima de 10 e abaixo de 19 caracteres. Acima de 19 caracteres, para números inteiros, deve ser usado o tipo Decimal. Permite números inteiros de -32.768 até 32.767, ou seja, -2(15) até 2(15) -1. Armazena o número em 2 bytes. Permite números inteiros de 0 até 255. Armazena o número em 1 byte. Indicado para campos com limitação de tamanho. Indicado para campos do tipo status(nesses casos deve-se associar uma constraint Check para validar os dados). Permite números com precisão para 15 inteiros e 4 decimais, tendo valor máximo 2(63) e mínimo, -2(63). Armazena o número em 8 bytes. Esse tipo de dado só deve ser usado quando todas as 4 casas decimais forem preenchidas ou quando não for necessária a conversão do dado (aproximação). Caso sejam utilizadas menos que 4 casas decimais e seja necessário efetuar a conversão de valores, esse tipo de dado não deve ser usado. Caso sejam utilizadas menos que 4 casas decimais e não seja necessário efetuar a conversão de valores, esse tipo de dado pode ser usado. Permite números, com ou sem decimais, de -10 (38) até 10 (38) - 1, preservando a precisão até o último dígito significativo (precisão engloba tanto a parte decimal como a parte inteira). Armazena o número em 5 até 17 bytes, dependendo do 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 tamanho total declarado (p), inclusive contando com as casas decimais especificadas no parâmetro [s]. Precisão Tam.Bytes 1 -9 = 5 10-19 = 9 20-28 = 13 29-38 = 17 Consiste em um campo resultante de operações efetuadas em outros campos da tabela. No SA, esse tipo de dado deve ser criado como Definido pelo Usuário. Armazena arquivo XML. Tipo válido apenas para o SQL Server 2005 e 2008. Este tipo especial de dados permite que o conteúdo de um arquivo XML seja armazenado de forma que sua estrutura hierárquica seja padronizada através de um Schema e consultada através de XQuery. Há facilidade na manipulação do conteúdo do XML. Apesar das vantagens, esse tipo de campo altera a estrutura original do XML, não sendo indicado onde é necessário garantir a integridade do dado armazenado. Em alguns casos, o armazenamento do tipo de dado XML invalida a assinatura do arquivo XML. Esse tipo de dado ocupa mais espaço e é menos performático que o tipo VARBINARY, sendo que para a manipulação através desse último tipo, faz-se necessário converte-lo para VARCHAR(Max). Em um XML pequeno e com até 1000 registros a Xquery funciona perfeitamente, porém em um XML extenso e complexo fica impraticável. Suporta até 2GB de dados e deve ser usado quando o tamanho exceder 8000 bytes. A interferência no tamanho máximo de um registro (8 Kb) é mínima, pois armazena apenas um ponteiro para as páginas de dados. Tipo válido apenas para o SQL Server 2005. Os tipos de dados binary e varbinary armazenam cadeias de caracteres de bits. Embora os dados dos caracteres sejam interpretados com base na página de código SQL Server, os dados binary e varbinary são simplesmente um fluxo de bits. Deve ser usado quando o tamanho do dado é fixo, sendo que n varia de 1 a 8000. Os tipos de dados binary e varbinary armazenam cadeias de caracteres de bits. Embora os dados dos caracteres sejam interpretados com base na página de código SQL Server, os dados binary e varbinary são simplesmente um fluxo de bits. Varbinary (n) deve ser usado quando o tamanho do dado variar consideravelmente. n pode variar de 1 a 8000. Deve-se utilizar varbinary(Max) quando os dados excederem 8000 bytes. COMPUTED XML VARCHAR (Max) BINARY (n) VARBINARY [ ( n | max) ] Página 27 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 NOTA: O SQL 2000 permite ainda a criação de outros tipos de dados como Table , sql_variant. Sobre o tipo Table deve-se seguir suas recomendações de uso de acordo com o Manual de Boas Práticas SQL. Os tipos de dados sql_variant ainda não foram estudados o suficiente e, em face disso, NÃO podem ser utilizados. 2.2.21. CONSTRAINTS O banco de dados implementa a integridade dos dados através da criação de constraints (regras de consistência): Chave Primária (Primary Key), Chave Estrangeira (Foreign Key), Checks (Domínio de Valores) e Valores Default. 2.2.21.1. CHAVE PRIMÁRIA O padrão de nomenclatura para a chave primária é: ix_tttt01 Onde: ix identifica Índice tttt...tttt indica o nome da entidade 01 é número seqüencial que indica que um índice é uma chave primária. Se a entidade for um nome composto, e sendo necessário, pode-se abreviá-lo, porém deve-se manter o sublinhado ( _ ) separando os nomes e todas as “partes” que compõe o nome da tabela devem ser contempladas. Exemplo: Caso o nome da tabela seja ocorrencia_movim_fisc_autom, o nome da chave primária poderia ser ix_ocorr_mov_fisc_autom01, mas não poderia ser ix_ocorr_mov_autom01, pois não contempla todos as partes do nome da tabela (a parte fisc foi retirada) 2.2.21.2. ÍNDICE SECUNDÁRIO O padrão de nomenclatura para índice secundário é: ix_ttttnn Onde: ix identifica Índice tttt...tttt indica o nome da entidade nn é número seqüencial para índices por entidade. Deve começar do 02, visto que o seqüencial 01 identifica chave primária. Exemplo: Segue as mesmas regras de formação da nomenclatura da constraint chave primária, devendo apenas obedecer ao início do seqüencial em 02. Dessa forma, caso o nome de uma tabela seja ocorrencia_movim_fisc_autom, o nome de um índice secundário poderia Página 28 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 ser ix_ocorr_mov_fisc_autom02, mas não poderia ser ix_ocorr_mov_autom02, pois não contempla todos as partes do nome da tabela (a parte fisc foi retirada). NOTA: Índices secundários únicos devem ser criados sempre como índice e não como constraint. Exemplo: Utilizar CREATE UNIQUE NONCLUSTERED INDEX ix_lacre_termo_ecf02 ON lacre_termo_ecf (num_lacre_termo) Não utilizar ALTER TABLE lacre_termo_ecf ADD CONSTRAINT ix_lacre_termo_ecf02 UNIQUE NONCLUSTERED (num_lacre_termo) 2.2.21.3. ÍNDICE PARA TESTES DE PERFORMANCE O padrão de nomenclatura para índices para testes de performance é: tp_ttttnn Onde: tp identifica que é um índice para teste de performance tttt...tttt indica o nome da entidade nn é número seqüencial para índices por entidade. Um índice para teste de performance é um índice provisório que só pode ser criado pela GETEC. NOTA: O Manual de Procedimentos Gerais de Sistemas relata algumas considerações sobre o uso de índices para testes de performance. 2.2.21.4. CHAVE ESTRANGEIRA O padrão de nomenclatura para a chave estrangeira é: fk_ffff...ffff_ppp..pppnn Onde: fk é uma abreviatura de Foreign Key Página 29 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 fff...fff indica o nome da entidade onde o atributo será "fk"(entidade filha) (Ver desenho) ppp...pp indica o nome da entidade onde o atributo ("fk") compõe a primary key(entidade pai) (Ver desenho) nn é um seqüencial de identificação PAI Os nomes das entidades podem ser abreviados, atentando sempre para contemplar todas as “partes” que compõe o nome da tabela. O sublinhado ( _ ) deve existir somente para separar o nome da entidade pai do nome da entidade filha, bem como para separar o nome da entidade filha do prefixo “fk”. Ele não deve seu usado apenas como separador de campo do nome da entidade pai ou do nome da entidade filha. FILHA Exemplo: Considerando que a tabela ocorrencia_movim_fisc_autom é filha da tabela tipo_ocorrencia_movim_fisc_autom, o nome da fk poderia ser fk_ocomovfisaut_tpocomovfisaut01, mas não poderia ser fk_oco_mov_fisc_aut_tp_mov_fis_aut (o caracter “ _ ” está sendo usado como separador para o nome das tabelas filha e pai), nem fk_ocomovfisaut_tpocomovaut01 (não contempla todas as partes que compõe o nome da tabela, pois a parte fisc foi retirada) e nem fk_ocomovfisaut_tpocomovfisaut pois não está com o seqüencial de identificação. 2.2.21.5. CHECK Domínio é o conjunto de valores que um determinado atributo pode assumir. Para delimitar esse conjunto, usa-se a Constraint Check O padrão de nomenclatura para check é: ck_ttt...ttt_xxx...xxx Onde: ck é uma abreviatura de Check ttt...ttt indica o nome da entidade xxx...xxx indica o nome do atributo Os nomes da entidade e do atributo podem ser abreviados, atentando sempre para contemplar todas as “partes” que compõe os nomes dos mesmos. O sublinhado ( _ ) deve existir somente para separar o nome da entidade do nome do atributo, bem como para separar o nome da entidade do prefixo “ck”. Ele não deve ser usado apenas como separador de campo do nome da entidade ou do nome do atributo. Exemplo: Na tabela ocorrencia_movim_fisc_autom existe o campo sts_ocorr_movim_fisc_autom, o qual possui um check indicando que os valores válidos são “N” ou “S”. O nome do Check poderia ser ck_ocmovfisaut_stsocmovfisaut, mas não ck_ocorrfisaut_stsocmovfisaut (o nome da tabela não foi totalmente contemplado, pois a parte movim foi retirada) e nem ck_oc_mov_fis_aut_sts_oc_mov_fis_aut (o caracter “ _ ” está sendo usado como separador para o nome da entidade e do atributo) Página 30 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 A determinação dos valores que um determinado atributo pode assumir deve ser feita da seguinte forma: [nome do atributo] = [valor] and >= or <= <> NOTAS: Quando o [valor] for alfanumérico, colocá-lo entre aspas simples. O Manual de Procedimentos Gerais de Sistemas relata algumas considerações sobre constraint check. Se existir um check em um campo que existe em mais de uma tabela, mas não é uma FK, o nome da contraint deve ser alterado no script. 2.2.21.6. DEFAULT Default é o valor padrão para um atributo a ser utilizado quando outros valores não forem informados. O padrão de nomenclatura para default é: df_ttt...ttt_xxx...xxx Onde: df é uma abreviatura de Default ttt...ttt indica o nome da entidade xxx...xxx indica o nome do atributo Os nomes da entidade e do atributo podem ser abreviados, atentando sempre para contemplar todas as “partes” que compõe os nomes dos mesmos. O sublinhado ( _ ) deve existir somente para separar o nome da entidade do nome do atributo, bem como para separar o nome da entidade do prefixo “df”. Ele não deve ser usado apenas como separador de campo do nome da entidade ou do nome do atributo. Exemplo: Na tabela ocorrencia_movim_fisc_autom existe o campo dtc_ocorr_movim_fisc_autom, o qual possui um default de valor getdate(). O nome do Default poderia ser df_ocmovfisaut_dtcocmovfisaut, mas não df_ocorrfisaut_stsocmovfisaut (o nome da tabela não foi totalmente contemplado, pois a parte movim foi retirada) e nem df_oc_mov_fis_aut_sts_oc_mov_fis_aut (o caracter “ _ ” está sendo usado como separador para o nome da entidade e do atributo). O Manual de Procedimentos Gerais de Sistemas relata algumas considerações sobre constraint default. Página 31 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 3. INDEPENDÊNCIA DE CODIFICAÇÃO 3.1. USO DE COMANDOS “SELECT *” E “INSERT *” Não devem ser utilizados os comandos “select *” e “insert *” nem no código fonte das aplicações, nem em triggers, procedures, funções, etc... para que se possa garantir a independência da codificação. Dessa forma, minimiza-se aos impactos provocados seja por inclusões de novos atributos ou por alteração da ordem dos campos de uma tabela. 3.2. REFERENCIAR ENTIDADES E ATRIBUTOS Para garantir independência de codificação quanto aos impactos provocados pela inclusão de entidades já existentes em outros bancos, ao referenciar entidades, o nome do banco deve sempre ser utilizado internamente na codificação – seja em triggers, procedures, código fonte da aplicação, funções, etc... Essa referência deve ser efetuada da seguinte forma: nome_do_banco.nome_da_entidade. Exemplo: bd_recursos_humanos.servidor. Já no caso dos atributos, não só o nome do banco, mas também o nome da entidade deve sempre ser utilizado internamente na codificação – seja em triggers, procedures, código fonte da aplicação, funções... Isso porque pode ocorrer a inclusão de campos já existentes em outras entidades. Essa referência deve ser efetuada da seguinte forma: nome do banco.nome da entidade.nome do atributo. Exemplo: bd_recursos_humanos.servidor.nom_servidor Um atributo pode ser referenciado através de um Alias para uma entidade. Ver item Entidades. Exemplo: serv.nom_servidor (ver Exemplo do item Entidades). NOTA: Sugere-se criar um ALIAS para as entidades criadas, pois os mesmos podem ser referenciados posteriormente em qualquer parte da consulta (query). Exemplo: bd_recursos_humanos.servidor serv 4. PADRÃO DE LAYOUT DE TRIGGERS 4.1. CONSIDERAÇÕES GERAIS Os triggers são implementados seja para garantir a integridade referencial entre tabelas de bancos diferentes, seja para efetuar algum tratamento de negócio ou geração de auditoria ou de históricos, entre outras coisas. Página 32 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 NOTA: O acesso a bancos de dados localizados em outros servidores somente deve ocorrer nos triggers através de views de linked server ou de chamadas remotas a procedures. Para conhecimento dos padrões e das orientações sobre o uso de views de linked server ou de chamadas remotas a procedures, consultar o tópico 2.2.5.3. VIEWS DE LINKED SERVER. Existem algumas precauções que devem ser tomadas ao se implementar um trigger. Seguem algumas delas: Quanto à utilização de cursores, pelo fato destes degradarem performance. Só se deve utilizar cursor quando for necessário realizar algum tratamento registro a registro e não for possível fazê-lo através de comandos DML que afetem o bloco inteiro de registros. Quanto à importância de tratamento de múltiplas linhas. Em caso de atualização de múltiplas linhas em uma tabela, o trigger precisa garantir que inconsistências não serão geradas e erros não serão mascarados. Quanto ao tratamento de erro. É obrigatória a utilização dos comandos RAISERROR, ROLLBACK e RETURN nos triggers para garantir a exibição de mensagens e finalização correta da transação em caso de erro. Quanto à integridade referencial entre tabelas de servidores diferentes. A única forma segura de garantir essa integridade é através do uso de linked server, sendo proibido o acesso a tabelas replicadas. Deve-se colocar comentários no corpo dos triggers, com o objetivo de identificar a data da manutenção, o projeto solicitante, banco, tabela e campo envolvidos no tratamento da regra de integridade (em triggers de integridade referencial), da regra de negócio (em triggers de negócio) ou da regra de auditoria (em triggers de auditoria). NOTA: O documento de Boas Práticas, disponível no PRT, relata outras considerações importantes sobre utilização de cursores, controle de transação, entre outras coisas aplicáveis aos triggers. 4.2. TRIGGERS SEM CURSOR PADRAO DE ESTRUTURA PARA TRIGGERS SEM CURSOR: Exemplo1: /* ---------------------------- */ /* TRIGGER DE INSERT SEM CURSOR */ /* ---------------------------- */ Página 33 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 CREATE TRIGGER tg_ref_<nome_da_tabela>_ins ON <nome_da_tabela> FOR INSERT AS /* Declaracao de variaveis */ DECLARE @<variavel1> ... /* Estrutura padrão para integridade referencial */ IF ( SELECT count(1) FROM <tabela_pai> P, inserted WHERE P.<chave_primaria> = inserted.<chave_estrangeira> ) <> ( SELECT count(1) FROM inserted ) BEGIN RAISERROR ... ROLLBACK TRANSACTION RETURN END Exemplo2: /* ---------------------------- */ /* TRIGGER DE DELETE SEM CURSOR */ /* ---------------------------- */ CREATE TRIGGER tg_ref_<nome_da_tabela>_del ON <nome_da_tabela> FOR DELETE AS /* Declaracao de variaveis */ DECLARE @<variavel1> ... /* Estrutura padrão para integridade referencial */ IF ( SELECT count(1) FROM <tabela_filho> F, deleted WHERE F.<chave_estrangeira> = deleted.<chave_primaria> ) > 0 BEGIN RAISERROR ... ROLLBACK TRANSACTION RETURN END Exemplo3: /* ---------------------------- */ /* TRIGGER DE UPDATE SEM CURSOR */ /* ---------------------------- */ CREATE TRIGGER tg_ref_<nome_da_tabela>_upd ON <nome_da_tabela> FOR UPDATE AS /* Declaração de variaveis */ DECLARE @<variavel1> ... Página 34 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 /* Estrutura padrão para integridade referencial */ IF UPDATE(<chave_estrangeira>) BEGIN IF ( SELECT count(1) FROM <tabela_pai> P, inserted WHERE P.<chave_primaria> = inserted.<chave_estrangeira> ) <> ( SELECT count(1) FROM inserted ) BEGIN RAISERROR ... ROLLBACK TRANSACTION RETURN END END 4.3. TRIGGERS COM CURSOR PADRAO DE ESTRUTURA PARA TRIGGERS COM CURSOR: Exemplo1: /* ---------------------------- */ /* TRIGGER DE INSERT COM CURSOR */ /* ---------------------------- */ CREATE TRIGGER tg_neg_<nome_da_tabela>_ins ON <nome_da_tabela> FOR INSERT AS /* Declaracao de variaveis */ DECLARE @<variavel1> ... /* Cursor Padrão */ DECLARE crs_<nome_da_tabela>_ins CURSOR FOR SELECT inserted.<campo1>, inserted.<campo2>, ... FROM inserted /* <campo1> é a chave da tabela */ OPEN crs_<nome_da_tabela>_ins FETCH NEXT FROM crs_<nome_da_tabela>_ins INTO @<campo1>_ins, @<campo2>_ins, ... WHILE (@@FETCH_STATUS <> -1) BEGIN ... FETCH NEXT FROM crs_<nome_da_tabela>_ins INTO @<campo1>_ins, @<campo2>_ins, ... END Página 35 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 CLOSE crs_<nome_da_tabela>_ins DEALLOCATE crs_<nome_da_tabela>_ins Exemplo2: /* ---------------------------- */ /* TRIGGER DE DELETE COM CURSOR */ /* ---------------------------- */ CREATE TRIGGER tg_neg_<nome_da_tabela>_del ON <nome_da_tabela> DELETE AS FOR /* Declaracao de variaveis */ DECLARE @<variavel1> ... /* Cursor Padrão */ DECLARE crs_<nome_da_tabela>_del CURSOR FOR SELECT deleted.<campo1>, deleted.<campo2>, ... FROM deleted /* <campo1> é a chave da tabela */ OPEN crs_<nome_da_tabela>_del FETCH NEXT FROM crs_<nome_da_tabela>_del INTO @<campo1>_del, @<campo2>_del, ... WHILE (@@FETCH_STATUS <> -1) BEGIN ... FETCH NEXT FROM crs_<nome_da_tabela>_del INTO @<campo1>_del, @<campo2>_del, ... END CLOSE crs_<nome_da_tabela>_del DEALLOCATE crs_<nome_da_tabela>_del Exemplo3: /* ---------------------------- */ /* TRIGGER DE UPDATE COM CURSOR */ /* ---------------------------- */ CREATE TRIGGER tg_neg_<nome_da_tabela>_upd ON <nome_da_tabela> FOR UPDATE Página 36 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 AS /* Declaração de variaveis */ DECLARE @<variavel1> ... /* Cursor Padrão */ DECLARE crs_<nome_da_tabela>_upd CURSOR FOR SELECT deleted.<campo1>, inserted.<campo1>, deleted.<campo2>, inserted.<campo2>, ... FROM deleted,inserted WHERE deleted.<campo1> = inserted.<campo1> /* <campo1> é a chave da tabela */ OPEN crs_<nome_da_tabela>_upd FETCH NEXT FROM crs_<nome_da_tabela>_upd INTO @<campo1>_del, @<campo1>_ins, ..., @<campo2>_del, @<campo2>_ins, ... WHILE (@@FETCH_STATUS <> -1) BEGIN ... FETCH NEXT FROM crs_<nome_da_tabela>_upd INTO @<campo1>_del, @<campo1>_ins, ..., @<campo2>_del, @<campo2>_ins, ... END CLOSE crs_<nome_da_tabela>_upd DEALLOCATE crs_<nome_da_tabela>_upd 4.4. TRIGGERS INSTEAD OF INSERT PADRÃO DE CÓDIGO PARA ASSEGURAR QUE UMA TABELA SÓ TENHA UMA LINHA: /* ------------------------- */ /* TRIGGER INSTEAD OF INSERT */ /* ------------------------- */ Página 37 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação CREATE TRIGGER INSTEAD OF INSERT AS 29/05/2017 tg_neg_<nome_da_tabela>_ins ON <nome_da_tabela> /* Se a tabela já possuir alguma linha ou se a quantidade de linhas sendo inseridas for maior do que um, retorna-se com erro. */ IF (SELECT count(1) FROM <nome_da_tabela>) > 0 OR (SELECT count(1) FROM inserted) > 1 BEGIN RAISERROR ... ROLLBACK TRANSACTION RETURN END ELSE /* Efetua na tabela a inserção, que havia sido impedida pelo trigger, da linha existente em “inserted”. */ INSERT INTO <nome_da_tabela> (<nome_campo_1>, <nome_campo_2>, ..., <nome_campo_n>) SELECT <nome_campo_1>, <nome_campo_2>, ..., <nome_campo_n> FROM inserted 4.5. TRIGGERS DE AUDITORIA O padrão de preenchimento de tabelas de auditoria, referente às atualizações realizadas através de aplicações que não usam UniFW (Ex.: atualização da tabela fechamento_arrecadacao através do Query Analyzer), exige que os triggers de auditoria dessas tabelas sigam os direcionamentos abaixo: Deve-se preencher os campos da tabela OperacaoAuditoria da seguinte forma: 1) Campo Interface: com uma string contendo o código ASA do projeto (ou módulo) responsável pela tabela; 2) Campo SiglaDominioUsuario: com a string "SEFAZ", o mesmo padrão utilizado pelas aplicações UniFw; 3) Campo Funcao: com "Inserção/Alteração/Exclusão de <nome_da_tabela>"; 4) Campo EnderecoRemoto: com o valor da função HOST_NAME(). Já o preenchimento dos campos referentes às informações do usuário que executou a operação deve considerar as seguintes possibilidades: 1) O login utilizado é o cda ou o cda_aplic (aplicações cliente/servidor, padrão SEFAZ): Deve-se capturar o login através da função APP_NAME(), observando as seguintes situações: a) Se o valor retornado pela função APP_NAME() for NULL (relatórios do Crystal, aplicações fora de padrão, etc), utilizar o valor retornado pela função Página 38 841071913 Secretaria da Fazenda do Estado da Bahia DTI - Diretoria de Tecnologia da Informação 29/05/2017 USER_NAME(), ou seja, cda ou cda_aplic e na descrição do usuário "Usuário não Identificado"; b) Se o valor retornado pela função APP_NAME() for diferente de NULL, verificar se está no padrão SEFAZ (APLICAÇÃO/login), ou seja, se existe uma “/” (barra). Em caso afirmativo, capturar o conteúdo que está logo após a barra e considerar como o LOGIN. A descrição do usuário deverá ser obtida na tabela de servidor ou na tabela de terceiro e, caso não exista, deve ser preenchida com "Usuário não Identificado". 2) O login utilizado é o cda_web (aplicações web, não .Net): Por enquanto, as aplicações web não informam o nome do usuário, logo, deve-se registrar o login como cda_web, e a descrição do usuário como "Usuário não Identificado". 3) O login utilizado é o usr_sefinfra (DSCAD): Por enquanto, as aplicações COM+ não informam o nome do usuário, logo, deve-se registrar o login como usr_sefinfra, e a descrição do usuário como "Usuário não Identificado". 4) O login utilizado não é um login de aplicação (acesso direto via Query Analyzer, VB, Access, etc): O login deve ser capturado através da função USER_NAME(). A descrição do usuário deverá ser obtida na tabela de servidor ou na tabela de terceiro e, caso não exista, deve ser preenchida com "Usuário não Identificado". Página 39 841071913