1) O documento descreve os procedimentos para realizar manutenção em tabelas de um banco de dados, como adicionar, modificar e excluir colunas e chaves primárias. 2) Ele também explica como mover tabelas entre esquemas e remover restrições como chaves estrangeiras. 3) Vários exemplos ilustram como executar essas operações em tabelas já populadas com dados.
PLANOS E EIXOS DO CORPO HUMANO.educacao física pptx
BD I - Aula 15 C - Manutencao de tabelas
1. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 1 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
Capitulo 3 – Tabelas (Manutenção)
Geralmente, precisaremos fazer alterações em tabelas quando o banco de dados já estiver em produção.
Como as tabelas terão dados, não será possível apagar e reconstruir facilmente, causando perda de
dados.
Exemplo de banco dados criado, com alguns dados já inseridos para testes de manutenção:
USE MASTER
GO
-- criacao do banco de dados
CREATE DATABASE CORP_PEDIDOS ON PRIMARY
(
NAME = N'CORP_PEDIDOS',
FILENAME = N'C:TESTCORP_PEDIDOS.MDF',
SIZE = 4 MB,
MAXSIZE = 10 MB,
FILEGROWTH = 2 MB
)
LOG ON
(
NAME = N'CORP_PEDIDOS_LOG',
FILENAME = N'C:TESTCORP_PEDIDOS_LOG.LDF',
SIZE = 2 MB,
MAXSIZE = 10 MB,
FILEGROWTH = 2 MB
)
GO
--alterando a conexao para o banco de dados criado
use CORP_PEDIDOS
GO
--criação do schema
CREATE SCHEMA test AUTHORIZATION dbo
go
--criando tabelas
CREATE TABLE test.Cliente (
Cod_Cliente int not null,
Nome_Cliente varchar(30) not null,
UF char(02),
constraint pk_Cliente Primary Key(cod_Cliente)
)
go
--inserindo dados na tabela de Cliente
insert into test.Cliente (Cod_Cliente, Nome_Cliente, UF)
values (1,'ANA PAULA', 'SP'),
(2,'MARIA FERNANDA', 'RJ'),
(3,'JOANA SILVA', 'PR'),
(4,'JOSE FERNANDO', 'SP'),
(5,'FERNANDA PEREIRA','MT')
GO
--visualizando os dados
select * from test.Cliente
--criando a tabela de produtos
CREATE TABLE test.Produto (
Cod_Prod int not null identity(1,1),
2. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 2 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
Desc_Prod varchar(30) not null,
Valor_Compra money,
Valor_Venda money,
Constraint pk_Produto Primary key(Cod_Prod),
Constraint ck_VrCompra Check (Valor_Compra > 0),
Constraint ck_VrVenda Check (Valor_Venda > Valor_Compra)
)
go
--inserindo dados na tabela de produtos
INSERT INTO test.Produto (Desc_Prod, Valor_Compra, Valor_Venda)
values ('SABONETE', 1.50, 2.50),
('SABAO EM PO', 4.25, 5.80),
('TOMATE', 2.50, 4.50),
('DETERGENTE', 3.75, 6.80),
('TOALHA', 10.50, 15.40),
('ALCOOL EM GEL', 4.50, 6.50),
('ALFINETE', 0.25, 1.98)
GO
--visualizando os produtos
select * from test.Produto
go
--criando a tabela de pedidos
CREATE TABLE test.Pedido (
Cod_Pedido int not null identity(1,1),
Data_Pedido datetime not null constraint df_Data_Pedido default getdate(),
Cod_Cliente int,
constraint pk_Pedido Primary key(cod_Pedido),
constraint ck_Data_Pedido Check (Data_Pedido >= getdate()),
constraint fk_Pedido_Cliente Foreign Key(Cod_Cliente)
references test.Cliente(Cod_Cliente)
)
go
--inserindo dados na tabela de pedidos
insert into test.Pedido (Cod_cliente)
values (1),
(1),
(1),
(2),
(2),
(4),
(5),
(5)
GO
--visualizando os dados da tabela de pedido
select * from test.Pedido
go
--criando a tabela de itens de pedidos
CREATE TABLE test.Itens_Pedido (
Cod_Pedido int not null,
Item tinyint not null,
Cod_Prod integer,
Quantidade integer,
Valor_Venda money,
constraint pk_Itens_Pedido Primary key(Cod_Pedido,Item),
constraint fk_IP_Cod_Pedido Foreign Key(Cod_Pedido)
references test.Pedido(Cod_Pedido),
constraint fk_IP_Cod_Produto Foreign Key(Cod_Prod)
references test.Produto(Cod_Prod)
)
go
--inserindo dados na tabela de itens de produtos
3. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 3 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
insert into test.Itens_Pedido (Cod_Pedido, Item, Cod_Prod, Quantidade, Valor_Venda)
values ( 1, 1, 1, 10, 2.50),
( 1, 2, 3, 10, 4.50),
( 1, 3, 4, 05, 6.80),
( 2, 1, 2, 02, 5.80),
( 2, 2, 4, 06, 6.80),
( 3, 1, 5, 10, 15.40),
( 3, 2, 4, 06, 6.80),
( 4, 1, 6, 07, 6.50),
( 4, 2, 4, 06, 6.80),
( 5, 1, 1, 02, 2.50),
( 5, 2, 4, 06, 6.80),
( 6, 1, 3, 04, 4.50),
( 6, 2, 4, 06, 6.80),
( 7, 1, 5, 09, 15.40),
( 7, 2, 4, 06, 6.80),
( 8, 1, 1, 02, 6.50),
( 8, 2, 4, 06, 6.80)
GO
--visualizando os dados da tabela de itens de pedido
select * from test.Itens_Pedido
go
Adicionando Colunas
--incluindo um campo na tabela test.Client
alter table test.Cliente add cidade varchar(25)
go
--diagnostico da tabela
sp_help 'test.Cliente'
--selecao de dados na tabela Cliente
select * from test.Cliente
Excluindo Colunas
-- excluindo um campo na tabela test.Client
alter table test.Cliente drop column cidade
go
Reordenando Colunas
Depois das tabelas estarem criadas, com dados e relacionadas (primary Key’s e foreign key’s), não é
possível alterar a reordenação de colunas. Para isso, é necessário seguir os seguintes passos:
--reordenando uma coluna
-- Não é possivel reordenar uma coluna diretamente depois de criada.
--copiando os dados para uma tabela temporaria, em memoria
select *
into test.#TEMP_CLIENTE
from test.Cliente
4. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 4 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
--vizualizando os dados temporarios
select * from test.#TEMP_CLIENTE
--desabilitando a fk fk_pedido_cliente da tabela test.Pedido
--ALTER TABLE test.Pedido NOCHECK CONSTRAINT fk_Pedido_Cliente
--excluindo a fk da tabela de Pedido, que se relaciona com a de clientes
ALTER TABLE test.Pedido DROP CONSTRAINT fk_Pedido_Cliente
--excluindo os dados da tabela test.Cliente
--delete from test.Cliente
--excluindo a tabela
drop table test.Cliente
--reconstruindo a tabela com a estrutura desejada
CREATE TABLE test.Cliente (
Cod_Cliente int not null,
Nome_Cliente varchar(30) not null,
Cidade varchar(30), --> nova coluna criada na ordem desejada
UF char(02),
constraint pk_Cliente Primary Key(cod_Cliente)
)
go
--insercao dos dados temporarios na tabela refeita
insert into test.Cliente (Cod_Cliente, Nome_Cliente, UF)
select Cod_Cliente, Nome_Cliente, UF
from test.#TEMP_CLIENTE
--`reconstruindo a fk da tabela test.Itens_Pedido com a tabela de Pedidos
ALTER TABLE test.Pedido ADD CONSTRAINT fk_Pedido_Cliente
FOREIGN KEY(Cod_Cliente) references test.Cliente(Cod_Cliente)
--conferindo os dados da tabela de Clientes
select * from test.Cliente
Referencia:
http://msdn.microsoft.com/pt-br/library/ms190273.aspx
http://msdn.microsoft.com/pt-br/library/ms188263.aspx
5. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 5 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
Modificando Colunas
Após as tabelas já armazenarem dados, fique atento no tipo de dados e no tamanho do campo (para
campos caracteres). Geralmente há necessidade de criar uma coluna para migração desses dados nos
dados de dados numéricos. Em casos de dados do tipo caracteres, quando há diminuição da coluna, há
sempre o risco de perda de dado. (no sqlserver há um aviso alertando)
--modificando colunas, de 30 para 35 (campo Cidade da tabela Cliente)
ALTER TABLE test.CLIENTE ALTER COLUMN Cidade varchar(35)
--atualizando dados da tabela test.Pedidos
UPDATE test.Cliente SET Cidade = 'JUNDIAI' WHERE Cod_Cliente = 1
GO
UPDATE test.Cliente SET Cidade = 'CAMPO LIMPO PAULISTA' WHERE Cod_Cliente = 2
GO
UPDATE test.Cliente SET Cidade = 'SAO BERNANDO DOS CAMPOS' WHERE Cod_Cliente = 3
GO
UPDATE test.Cliente SET Cidade = 'VISTA GROSSA DO MONTE NEGRO' WHERE Cod_Cliente = 4
GO
UPDATE test.Cliente SET Cidade = 'CASA DA SAUDADE DO RIACHO GRANDE' WHERE Cod_Cliente = 5
GO
-- selecionando os dados da tabela
select * from test.Cliente
--modificando colunas, de 35 para 25 (campo Cidade da tabela Cliente),
--causando erro de truncamento
ALTER TABLE test.CLIENTE ALTER COLUMN Cidade varchar(25)
--simulacao: alterando a tabela Itens_Pedido
-- (coluna Quantidade de int para decimal(10,2)
--verificando os dados
select * from test.Itens_Pedido
--alterando (coluna Quantidade de int para decimal(10,2)
ALTER TABLE test.Itens_Pedido ALTER COLUMN Quantidade decimal(10,2)
GO
--atualizando 1 dado
update test.Itens_Pedido set Quantidade = 10.2 WHERE Cod_Pedido = 1 and Item = 1
go
--verificando o dado alterado
select * from test.Itens_Pedido
--revertendo a alteracao (coluna Quantidade de int para decimal(10,2)
ALTER TABLE test.Itens_Pedido ALTER COLUMN Quantidade int
GO
--verificando o dado alterado
select * from test.Itens_Pedido
6. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 6 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
Alterando Chaves Primárias
Como as chaves primárias são sempre NOT NULL, é necessário reconstruir as tabelas (desativando as
foreing Keys), com os novos campos e fazer update nos valores faltantes, para posteriormente fazer a
criação da mesma. (quase o mesmo processo de refazer a ordens das colunas)
Removendo Chaves Primárias (constraints)
Quando há chaves foreign Keys de outras tabelas relacionadas a ela, será necessário excluir a relação
para depois excluir a constraint de Primary Key. Caso não tenha nenhuma dependência, o SQL Server
deixa fazer a exclusão;
-- executando raio-x da tabela Itens_Pedido
sp_help 'test.Itens_Pedido'
--removendo a Primary Key Constraint de Itens_Pedido
--sem dependencia de nenhuma tabela
ALTER TABLE test.Itens_Pedido DROP CONSTRAINT pk_Itens_Pedido
--com dependencia de tabela, causando um erro
ALTER TABLE test.Cliente DROP CONSTRAINT pk_Cliente
Excluindo Tabelas
Uma tabela pode ser excluída quando não há relacionamentos dependentes na tabela. Caso contrário, é
necessário fazer a exclusão de todas as constraint’s nela existente para posteriormente fazer a exclusão
da tabela.
--removendo uma tabela com dependencia, causando erro
drop table test.Cliente
--removendo uma tabela sem dependencia
drop table test.Itens_Pedido
Removendo Chaves Estrangeiras
Quando queremos fazer a remoção de constraints entre tabelas, é necessário executar o seguinte
comando:
--removendo a Foreign Key Constraint de test.Pedido
sp_help 'test.Pedido'
ALTER TABLE test.Pedido DROP CONSTRAINT fk_Pedido_Cliente
7. METODOLOGIA DE AULA TEÓRICA
DISCIPLINA: BANCO DE DADOS I
TÍTULO DA AULA: MANUTENÇÃO DE TABELAS
Rev. 3
13.11.2019
Pág. 7 de 7
CENTRO UNIVERSITÁRIO PADRE ANCHIETA – PROF. RODRIGO SAITO - rodrigok@anchieta.br
Desativando uma Constraint
Nem todas as constraints são possíveis de serem desativadas. A constraint do tipo check, conseguimos
fazer que a mesma possa ser desativada:
--desativando constrait da tabela test.Pedido
sp_help 'test.Pedido'
ALTER TABLE test.Pedido NOCHECK CONSTRAINT ck_Data_Pedido
--para ativar novamente
ALTER TABLE test.Pedido CHECK CONSTRAINT ck_Data_Pedido
Removendo uma Constraint
Para se remover uma constraint, é necessário executar o seguinte comando abaixo:
--para remover uma constraint
sp_help 'test.Pedido'
ALTER TABLE test.Pedido DROP CONSTRAINT df_Data_Pedido
sp_help 'test.Pedido'
Movendo Tabelas entre schemas diferentes
Quando queremos fazer a transferencia de um objeto (tabela) para diferentes schemas, execute o
seguinte comando:
--transferindo tabelas entre schemas
--criação do schema
CREATE SCHEMA test2 AUTHORIZATION dbo
go
--alterando de schema
alter schema test2 TRANSFER test.Pedido