Sqlserver – SQL para pesquisar todas as constraints de colunas de tabelas

20 12 2016

Problema

Preciso pesquisar as constraints de das tabelas do SQL SERVER

Solução

Abaixo segue um SQL que busca todas as constraints das tabelas

SELECT 
    TableName = t.Name,
    ColumnName = c.Name,
    dc.Name,
    dc.definition
FROM sys.tables t
INNER JOIN sys.default_constraints dc ON t.object_id = dc.parent_object_id
INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND c.column_id = dc.parent_column_id
ORDER BY t.Name

 





[sqlserver] UPDATE com INNER JOIN e GROUP BY

4 08 2014

Problema

Como fazer um update com INNER JOIN E GROUP BY no SQLSERVER

Solução

UPDATE pedido_ SET pedido_.vl_saldo = A.vl_saldo_recalculado
FROM PEDIDO pedido_
INNER JOIN
(
   SELECT
   pedido_.id_pedido as id_pedido,
   (pedido_.vl_valor_total - SUM(item_pedido_.vl_valor_entrega)) as vl_saldo_recalculado
   FROM PEDIDO pedido_
   INNER JOIN ITEM_PEDIDO item_pedido_ on item_pedido_.id_pedido = pedido_.id_pedido  AND pedido_.nr_numero_pedido = '2014073100003'
   GROUP By pedido_.id_pedido, pedido_.vl_valor_total
)
A ON A.id_pedido = pedido_.id_pedido




[Oracle] Como verificar o tamanho de utilização de um índice

26 07 2010

Problema:

É necessário verificar o tamanho que um índice está ocupando no banco de dados.

Solução:
select sum(bytes)/1024/1024 "Index size in Mb" from dba_segments where segment_type='INDEX' and segment_name = 'SYS_CXXXXX';





[Oracle] DUMP DIRS verificaando os caminhos

19 05 2010

Para você que fez um script EXPDP a um bom tempo, e especificou um diretório no Oracle e agora não sabe onde diabos fica essa diretório,  segue o SQL que resolverá os seus problemas:

SELECT * FROM dba_directories;

No meu caso precisava saber o DUMPDIR da minha máquina de desenvolvimento para fazer um IMPDP no meu banco de dados.

OBS: Não esqueça que é necessário privilégios de SYS para verificar essa tabela.





[Oracle] Clonando/Copiando tabelas

13 04 2010

Você que precisa clonar uma tabela por algum motivo basta utilizar os seguintes comandos:

CREATE TABLE  clientes_temp AS  SELECT *  FROM clientes;

Se pretende substituir a tabela pode utilizar os comandos abaixo:

DROPT TABLE  clientes
RENAME clientes_temp TO clientes

IMPORTANTE: Este comando não copia nenhuma  restrição(FK, UK, PK) e nenhum indice, então se for utiliza-lo para copiar e utilizar tabelas você terá que recriar estas informações no braço mesmo.

PS: Não sei se esse comando funciona em outros bancos de dados.





[BD] Identificando linhas duplicas em uma tabela

28 01 2010

Para você,  que como eu que teve que resolver um problema de linhas duplicadas em uma tabela segue a dica.

create table cfg (
    object varchar2(10) not null,
    value varchar2(10) not null
);

insert into cfg values ('A', '1');
insert into cfg values ('A', '1');
insert into cfg values ('A', '2');
insert into cfg values ('B', '1');
insert into cfg values ('B', '1');
insert into cfg values ('C', '1');
insert into cfg values ('D', '1');

SELECT  cfg.OBJECT, cfg.VALUE FROM cfg
group by OBJECT, VALUE
HAVING count(*) > 1;

drop table cfg;
purge table cfg;

Mas lembre-se que a melhor maneira de evitar isso é criando as chaves primárias corretas e/ou as UNIC KEYS.





[oracle][index error] ORA-08102: index key not found, obj# 27063, file 6, block 65802

18 11 2009

Problema

Quando tentei apagar um registro com dados estranhos da base a seguinte mensagem me foi informada:

ORA-08102: index key not found, obj# 27063, file 6, block 65802

Causa

Pesquisando, descobri que esse erro é acontece devido ao índice estar corrompido no banco de dados.
Para descobrir qual o objeto em questão basta pesquisar na tabela de objetos especificando o numero do objeto corrompido, descrito na mensagem.

SELECT * from all_objects WHERE object_id=27063;

O resultado do select acima foi as informações do indice com o problema.

Solução

Solução 1

Para resolver o problema primeiramente tentei dar um rebuild no índice utilizando o seguinte comando:


ALTER INDEX index_name REBUILD;

Após a execução do rebuild tentei remover o registro mas não obtive sucesso.

Solução 2

Minha segunda abordagem foi apagar o índice mesmo, pois, analisando o índice em questão verifiquei que era um índice auxiliar de FK, isso que dizer que o índice pode ser apagado e criado novamente sem muito risco, para fazer isso manualmente basta seguir os seguintes passos:

1) Desabilitar o indice

ALTER INDEX ??index_name?? DISABLE;

2) Remover o indice

DROP INDEX ??index_name??;

3) Recriar o indice


Após apagar o índice foi possível remover o registro e depois disso recriei o índice com o script original.

Se por acaso você não tem o script para recriar manualmente o indice esse SQL abaixo pode te ajudar a recria-lo:

ATENÇÃO: Esse SQL só funciona se o indice é para apenas um campo da tabela, se existir mais de um campo o resultado desse SQL deve ser modificado manualmente.

SELECT 'CREATE INDEX ' || TABLE_OWNER || '.' || INDEX_NAME || ' ON ' || TABLE_OWNER || '.' || TABLE_NAME || '(' || COLUMN_NAME || ');'
FROM dba_ind_columns idx
WHERE INDEX_NAME = '??index_name??'
AND TABLE_OWNER  =  '??schema??';

Referencia:
http://forums.oracle.com/forums/thread.jspa?threadID=61877