Escolar Documentos
Profissional Documentos
Cultura Documentos
AULA PRATICA2024 - Exercicios Banco de Dados-tabelas-View-particoes-stored Procedures
AULA PRATICA2024 - Exercicios Banco de Dados-tabelas-View-particoes-stored Procedures
Desenhar o DEA
Criar um banco de dados simples e banco de dados com vários ficheiros e filegroups.
Criar/alterar/remover tabelas
Inserir dados
Aplicar restrições
1. Aplique as etapas de modelação de uma base de dados de uma clinica para o curso de
SGBD. Use o sql server 2016 para o efeito.
a) Identifique as entidades:
Abra o SQL Server Management Studio e conecte-se à instância desejada, como mostra a
Figura 1.
A Windows autentication conecta-se directamente sem colocar a senha e com o sql server
autentications precisa de um login e senha. Por Padrão o sql server tem um utilizador administrador
sa e a senha a colocar é a mesma que colocou durante a instalação do sql serever.
utilizando
Instruções T-SQL
Editor gráfico
Com o Management Studio aberto, clique no botão New Query, como mostra a Figura 2.
Em seguida, na parte central da interface aparecerá uma tela em branco, na qual poderá
digitar os códigos para criar o banco de dados, tabelas, efectuar consultas, etc. após executar
o código a seguir pressionar F5 ou clicar em Execute, como mostra a Figura 3:
Com o banco criado, precisamos entrar no seu contexto para poder executar novos scripts
dentro dele. No caso, precisamos aceder para criar nossa tabela. Para isso, devemos executar
o seguinte comando:
USE CLINICA_sgbd_2023;
GO
Para confirmar que a operação foi executada como esperado, veja na parte superior esquerda
do Management Studio se o banco criado está em uso, como mostra a Figura 4.
FIGURA 4 – VERIFICANDO O BANCO DE DDADOS NO SSMS
USE CLINICA_SGBD_2023;
GO
--Criar tabelas
-- inserir dados
insert into TBL_ESPECIALIDADE (COD_ESPECIALIDADE, DESCRICAO)
values('10', 'CRIMINALISTICA'), ('20', 'PEDIATRA'), ('30', 'DENTISTA'), ('40',
'OBSTETRA'), ('50', 'CARDIOLOGISTA'), ('60', 'CIRURGIAO'), ('70', 'OTORRINO'), ('80',
'ONCOLOGISTA'), ('90', 'GENERALISTA'), ('100', 'LEGISTA');
-- inserir dados
insert into TBL_MEDICO (COD_MEDICO, NOME_MEDICO, MORADA,
COD_ESPECIALIDADE) VALUES ('01', 'JOANA PADRAO','ALTO MAE B', '100'),('09',
'ALFACE JOAQUIM','XIPAMANINE', '10'), ('02', 'JOAO DE DEUS','ALTO MAE A', '40'),
('05', 'FELIZ ANDRADE','MALHANGALENE', '20'), ('03', 'LARA SITOE','BAIRRO
ALTO', '50'), ('06', 'PEQUENO CONFIANTE','ALTO MAE B', '30'), ('04', 'MESA DA
SILVA PEDRO','MALANGA', '60')
-- inserir dados
insert into TBL_RECEITA (COD_RECEITA, NOME_MEDICAMENTO,
QUANT_ADMINISTRADA, FORMA_ADMINISTRACAO) VALUES
('01', 'PARACETAMOL','60', 'INJECTAVEL'), ('09','DICLOFENAC','90','APLICACAO'),
('02', 'TETRACICLINA','30', 'INJECTAVEL'), ('05', 'MEBENDAZOL','90', 'ORAL'), ('03',
'MENTOCAINA','20', 'ORAL'), ('06', 'ANABOLIZANTE','10', 'INJECTAVEL'),
('04', 'PARADOX','80', 'ORAL')
-- inserir dados
insert into TBL_MEDICAMENTO (COD_MEDICAMENTO, NOME_MEDICAMENTO,
COD_RECEITA, COD_MEDICO) VALUES ('01', 'PARACETAMOL','6', '4'),
('09','DICLOFENAC','5','1'), ('02', 'TETRACICLINA','3', '4'), ('05', 'MEBENDAZOL','4', '4'),
('03', 'MENTOCAINA','2', '6'), ('06', 'ANABOLIZANTE','1', '5'), ('04', 'PARADOX','4', '2')
-- inserir dados
insert into TBL_CONSULTA (COD_CONSULTA, DATA, COD_PACIENTE)
VALUES ('09','03/02/2022','6'),('10','03/12/2022','5'), ('04','03/02/2022','4')
Listagem
SELECT * FROM TBL_CONSULTA
-- inserir dados
insert into TBL_ATENDIMENTO (COD_PACIENTE, COD_MEDICO)
values('1','1'), ('2', '4'), ('3', '3'), ('1','1'), ('1','5'), ('6','1'), ('1','6')
2. Pode também efectuar algumas operações sobre essas tabelas criadas
a) Excluir coluna de uma tabela
Alter table add pk (Adicione chave primaria a uma tabela sem chave)
g) Excluir tabela
Drop table tbl_cliente
Se tiver dados irá perder tudo que inseriu. Se tiver relacionamentos em outras tabelas,
primeiro apague os relacionamentos.
USE CLINICA_SGBD_2023;
GO
--TABELA ESPECIALIDADE
CREATE TABLE TBL_ESPECIALIDADE
(COD_ESPECIALIDADE INT IDENTITY (1,1) PRIMARY KEY NOT NULL,
DESCRICAO VARCHAR(40));
GO
--[2]TABELA MEDICO
CREATE TABLE TBL_MEDICO
(COD_MEDICO INT IDENTITY (1,1) PRIMARY KEY NOT NULL, NOME_MEDICO
VARCHAR(40) NOT NULL, MORADA VARCHAR(40), COD_ESPECIALIDADE INT,
CONSTRAINT FK_ESPEC_MEDICO FOREIGN KEY (COD_ESPECIALIDADE)
REFERENCES TBL_ESPECIALIDADE (COD_ESPECIALIDADE));
GO
--[6]TABELA CONSULTA
CREATE TABLE TBL_CONSULTA
(COD_CONSULTA INT IDENTITY (1,1) PRIMARY KEY NOT NULL, DATA DATE,
COD_PACIENTE INT, CONSTRAINT FK_COD_PACIENTE FOREIGN KEY
(COD_PACIENTE) REFERENCES TBL_PACIENTE (COD_PACIENTE));
GO
--TABELA ESPECIALIDADE
CREATE TABLE TBL_ESPECIALIDADE
(COD_ESPECIALIDADE INT IDENTITY (1,1) PRIMARY KEY NOT NULL,
DESCRICAO VARCHAR(40));
GO
3. Criação de relationship
database diagram
Resultado final
Então, no Management Studio, localize o Object Explorer, clique com o botão direito sobre
a pasta Databases e em seguida em New Database, como mostra a Figura 6.
Feito isso, aparecerá uma janela para criar um banco de dados, como mostra a Figura 7.
Nela, basta preencher o nome do database e clicar em OK.
Com o banco criado, agora adicionar uma tabela a ele. Para isso, expanda o Object
Explorer, clicar com a direita em Tables e depois em New Table, como mostra a Figura 8.
Figura 8. Adicionando nova tabela ao banco
Feito isso, será exibida uma tela na qual devemos preencher os campos da tabela,
selecionando também o seu tipo, e se ela aceita valores nulos, como vemos na Figura 9.
Inclua as chaves se possível.
Para confirmar a criação da tabela, clique botão com o ícone de um disquete. Em seguida
aparecerá uma janela para nomear a tabela, como mostra a Figura 10. Depois disso ela é
criada.
Chave Primária
As Chaves primárias (em inglês, Primary keys ou “PK”) de um banco de dados relacional são
o (s) conjunto (s) de um ou mais campos, cujos valores, considerando a combinação de
valores em caso de mais de uma chave primária, nunca se repetem na mesma tabela.
Desta forma, elas podem ser usadas como um índice de referência para criar relacionamentos
com as demais tabela do banco de dados (daí vem o nome banco de dados relacional).
Portanto, uma chave primária nunca pode ter valor nulo, nem repetição.
Ela tem que ser um número de identificação único para cada registo e possibilitar a consulta e
o relacionamento dos dados.
É uma boa prática definir a Chave Primária como a primeira coluna da tabela.
Em outras palavras, normalmente, as tabelas possuem uma coluna ou mais contendo valores
capazes de identificar uma linha de forma exclusiva.
Essa (s) coluna (s) recebem o nome de chave primária, cuja finalidade é assegurar a
integridade dos dados da tabela.
Ao atribuímos essa propriedade a uma coluna, o SQL Server cria números em sequência para
linhas que forem posteriormente inseridas na tabela em que a coluna de identidade está
localizada.
É importante destacar que uma tabela pode ter somente uma coluna de identidade.
Além disso, o valor de uma coluna desse tipo é gerado automaticamente pelo SQL Server;
não podemos alterá-lo ou inseri-lo.
Criação de tabelas
A partir do SSMS selecione tabela e com clique direito do mouse, escolha a opção tabela.
Será aberta a janela em tela, para que seja informado o nome da coluna, o seu data type e se
ele aceita nulo ou não.
Criar tabela cliente
Ao criar a tabela cliente, observe que a coluna cliente_id é uma chave primaria,
portanto não aceita campos nulos e deve ser definido como chave primária para isso
clique com o botão direito do mouse e escolha a opção set primary key e ainda defina
como identity.
Para isso utilize o column propriety da janela do sql SSMS. Na opção identity
especification informe que o campo é identity com incremento 1. Introduza os restantes
campos de acordo com a tabela desenhada.
Após informar todos os dados clique no botão save e será aberta uma janela para
informar o nome da tabela neste caso cliente. Veja que ao clicar em tabelas no object
explorer aparece a tabela cliente criada no banco de dados.
Crie as demais tabelas do nosso modelo do banco de dados
Observe que somente o tipo int é válido para ser uma PK.
Para fazer referência, em outra tabela, a essa chave como chave estrangeira, vá na outra
tabela e clique com o botão direito na pasta Keys e em New Foreign Key.
Clique no quadrado com três pontos, lá, poderá encontrar graficamente, a chave primária a
ser referida.
Na primeira coluna, deve indicar a fonte da chave estrangeira e, na segunda, para onde será
copiada na tabela onde ela é estrangeira (por consequência, deve, também, criar uma coluna
para receber a chave estrangeira sendo do tipo int).
4. IMAGINE QUE FOI CONTRATADO POR UMA EMPRESA DE CONSULTORIA PARA CRIAR UM SISTEMA
DE GESTAO DE BASE DE DADOS DAS SUAS VENDAS. CRIE A RESPECTIVA BASE DE DADOS DE
NOME EXEMPLO20032023 COM O SEGUINTE:
a) UM ARQUIVO PRINCIPAL
b) CINCO ARQUIVOS SECUNDARIOS
c) UM ARQUIVO DE LOG.
d) ESTA BASE DE DADOS DEVE TER DOIS FILEGROUP DOS QUAIS o PRIMEIRO FILEGROUP
DENOMINADO VENDAS GROUP 1 CONTEM OS ARQUIVOS 2 e 3 E o SEGUNDO FILEGROUP
DENOMINADO VENDAS GROUP 2 CONTEM OS ARQUIVOS 4 e 5
e) Certifique-se que vai usar o caminho certo para o alojamento desta base de
dados.
Resolução
(
NAME = exemplo_sec2, FILENAME = 'C:\Program Files\Microsoft SQL Server\
MSSQL13.SQLEXPRESS\MSSQL\DATA\testlog_exemplo_sec2.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5%
),
(
NAME = exemplo_sec3, FILENAME = 'C:\Program Files\Microsoft SQL Server\
MSSQL13.SQLEXPRESS\MSSQL\DATA\testlog_exemplo_sec3.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 15%
),
(
NAME = exemplo_sec5, FILENAME = 'C:\Program Files\Microsoft SQL Server\
MSSQL13.SQLEXPRESS\MSSQL\DATA\testlog_exemplo_sec5.ndf',
SIZE = 10, MAXSIZE = 50, FILEGROWTH = 5%
)
LOG ON
(
NAME = exemplo_log, FILENAME = 'C:\Program Files\Microsoft SQL Server\
MSSQL13.SQLEXPRESS\MSSQL\DATA\testlog_exemplo.ldf',
SIZE = 5MB, MAXSIZE = 25MB, FILEGROWTH = 5MB);
5. Criar database Incluindo filestream
-- Crie uma base de dados com default filegoup, flegroup filestream e log
file. Especifique o autocrescimento, tamanho minimo e maximo.
USE master;
GO
-- primary data file.
CREATE DATABASE escola
ON PRIMARY
( NAME='escola_Primary',
FILENAME=
'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\
escola_Prm.mdf',
SIZE=4MB, MAXSIZE=10MB, FILEGROWTH=1MB),
FILEGROUP escola_FG1
( NAME = 'escola_FG1_Dat1',
FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\
escola_FG1_1.ndf',
SIZE = 1MB, MAXSIZE=10MB, FILEGROWTH=1MB),
( NAME = 'escola_FG1_Dat2',
FILENAME =
'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\
escola_FG1_2.ndf',
SIZE = 1MB, MAXSIZE=10MB, FILEGROWTH=1MB),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM
( NAME = 'escola_FG_FS',
FILENAME = 'c:\Data\filestream1')
LOG ON
( NAME='escola_log',
FILENAME =
'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\data\
escola.ldf',
SIZE=1MB, MAXSIZE=10MB, FILEGROWTH=1MB);
GO
),
FILEGROUP FgTesteSave
),
LOG ON
GO
nota: filestream - armazena dados binários ou dados não estruturados como documentos e
imagens,. Armazena objetos do tipo (BLOB -Binary Large Object ) com o tipo
VARBINARY(MAX).
7. Um supermercado pretende entrar para o mercado oferecendo melhores servicos. Para tal,
contratou a turma A para implementar o sistema.
Utilize a sintaxe a seguir para criar a tabela do exercicio e insira os produtos “arroz”, “feijao” e
“ovos”, tendo em conta que para cada um deles, o cliente solicitou 5 Kg, 4 KG, 2 duzias
respectivamente.
Referir que o preco unitario do arroz é 50 MT, do feijao são 100 MT e os ovos 105 MT. O tipo de
produtos de cada item deve ser “produtos alimentares”.
COPIE O CODIGO PARA O SQL SERVER E UTILIZE ESTA TABELA PARA OS EXERCICIOS
CREATE TABLE tbl_produto_super;
(
Codigo_produto INT PRIMARY KEY IDENTITY (1,1),
Nome_produto VARCHAR (50) NOT NULL,
Tipo_produto VARCHAR (30) NOT NULL UNIQUE,
Preco_unitario MONEY
Quantidade DATATIME NOT NULL,
Preco_total MONEY NOT NULL
)
Resolucao:
Para solucionar o problema, primeiro cria a tabela no sql server
a) Criar a tabela TBL_PRODUTO_SUPERMERCADO no sql server e insira os valores solicitados no
exercício 1.
CREATE TABLE TBL_PRODUTO_SUPERMERCADO;
(
Codigo_produto INT PRIMARY KEY IDENTITY (1,1),
Nome_produto VARCHAR (50) NOT NULL,
Tipo_produto VARCHAR (30) NOT NULL UNIQUE,
Preco_unitario MONEY,
Quantidade INT NOT NULL,
Preco_total MONEY NOT NULL
)
AO CRIAR A TABELA GEROU UM ERRO. O PRIMEIRO ERRO ENCONTRADO FOI PORQUE EXISTE UM PONTO
E VIRGULA (;) QUE ESTA NA PRIMEIRA LINHA (linha do create). REMOVA O PONTO E VIRGULA
(;) E TENTE CRIAR DE NOVO.
O SEGUNDO ERRO VAI OCORRER PORQUE FALTA UMA VIRGULA APOS O TIPO DE DADOS “MONEY”
Como pode ver, a tabela foi criada. Agora insira os produtos que o ciente solicitou.
COMO VE, NÃO FOI POSSIVEL INSERIR OS DADOS PORQUE ESTA TENTANDO INSERIR TRES PRODUTOS
DA CATEGORIA “PRODUTOS ALIMENTARES” ENQUANTO FOI DEFINIDO O TIPO DE PRODUTO COMO
UNIQUE E UNIQUE SIGNIFICA QUE O REGISTO DEVE SER ÚNICO.
CORRIJA O ERRO.
DE FACTO A RESTRICAO SERA APAGADA NA TABELA MAS NÃO VAI CONSEGUIR INSERIR, POIS AINDA
EXISTEM REFERENCIAS ASSOCIADAS A CONSTRAINT. UMA DAS SOLUCOES PODE SER EXECUTAR UM
PROCEDIMENTO ARMAZENADO (exec sp_helpconstraint) PARA PROCURAR A CONTRAINT FICANDO:
--ALTERAR A CONSTRAINT
alter table TBL_PRODUTO_SUPERMERCADO DROP CONSTRAINT UQ__TESTE__B6FCAAA252F153FA
d) Modificar a coluna referente ao tipo de dados UNIQUE para NOT NULL apenas.
Sp_rename 'TBL_PRODUTO.quantidade','quant','COLUMN';
g) Excluir a coluna “observações”
PARTE II - VIEWS
10. Insira os seguintes dados na tabela padrao e veja o que acontece com a view.
insert into TBL_Produto_VIEW
(Nome_produto, Tipo_produto, Preco_unitario, Quantidade, Preco_total)
values ('televisor', 'eletrodomestico', '5000', '2', '10000')
12. CRIA UMA VIEW QUE MOSTRE OS PRODUTOS COMPRADOS PELO CLIENTE CUJO TIPO_PRODUTO
SEJA DETERGENTE
CONSULTE A VIEW
UPDATE lista_produtos_exercicio
set nome_produto = 'batata doce'
where tipo_produto = 'PRODUTO ALIMENTAR' and preco_total = 150
UPDATE TBL_Produto_VIEW
set nome_produto = 'ALHO PORO'
where tipo_produto = 'CEREAL VERDE' and preco_total = 500
Passo 1:
a) criar um grupo de arquivo (filegroup)
--adicione quatro novos filegroups na base de dados SISTEMA_SAUDE_TESTE_PARTICAO
ALTER DATABASE SISTEMA_SAUDE_TESTE_PARTICAO
ADD FILEGROUP test1fg;
GO
b) --criar um arquivo de dados que vai ser veinculado ao grupo de arquivos test1fg.
--Adicionar um file para cada filegroup
ALTER DATABASE SISTEMA_SAUDE_TESTE_PARTICAO
ADD FILE
( name = test1dat1,
Filename = 'C:\Program Files\Microsoft SQL Server\MSSQL13.SQLEXPRESS\MSSQL\DATA\
arquiv_2024.ndf', size = 5MB, maxsize = 100MB, FILEGROWTH =5MB )
to filegroup test1fg
Passo 2:
--criar a funcao de particao chamada myRangePF1
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT for VALUES (100, 300, 1000);
GO
Passo 3:
--cria o esquema de particao chamado myRangePS1 que aplica myRangePF1 aos quatro
filegroups criados abaixo
to (test1fg,test1fg, test1fg, test1fg)- neste caso armazena tudo num unico filegroup.
Se pretender armazenar em varios faça: to (test1fg,test2fg, test3fg, test4fg)
Execute o script
Passo 4
--Cria a tabela particionada chamada partitiontable que usa myRangePS1 Na particao
col1
CREATE TABLE PartitionTable (col1 int PRIMARY KEY, col2 char (10))
ON myRangePS1 (col1);
GO
Criar a tabela
CREATE TABLE tbl_produto_super
(
Codigo_produto INT PRIMARY KEY IDENTITY (1,1),
Nome_produto VARCHAR (50) NOT NULL,
Tipo_produto VARCHAR (30) NOT NULL,
Preco_unitario MONEY,
Quantidade INT NOT NULL,
Preco_total MONEY NOT NULL
)
END;
Chamada do procedimento
EXEC LISTA_PRODUTOS_LOJA;
Resultado
--CHAMADA DO PROCEDIMENTO
exec LISTA_PRODUTOS_LOJA;
Resultado:
4. Altere o procedimento para que ele possa passar oum parametro cujo produto faz
parte da categoria de DETERGENTES.
ALTER PROCEDURE LISTA_PRODUTOS_LOJA (@Tipo_produto AS varchar (20))
AS
BEGIN
select Codigo_produto, Nome_produto,Tipo_produto, Preco_unitario, Quantidade,
Preco_total
FROM tbl_produto_super
Where Tipo_produto = (@Tipo_produto)
order by Nome_produto
END;
use loja_brinquedos;
exec LISTA_PRODUTOS_LOJA detergente;
O resultado é o mesmo
localizar o produto cujos preços são maiores ou iguais a 500 e os nomes contêm a
palavra brinquedo.
--Exercicio
1) Crie um SP de nome “spTotalFuncionarios ” para obter o número total de funcionários
da tabela detalhe de funcionários usando um parâmetro de saída.
Resolucao
--PRIMEIRO CRIAR A TABELA E INSERIR OS DADOS
--TERCEIRO PARA EXECUTAR PRECISA DECLARAR A VARIAVEL QUE VAI RECEBER O VALOR
DECLARE @Count int;
Execute spTotalFuncionarios @FuncCount = @Count output;
SELECT @Count AS 'Numero Total de Funcionários';
--Exercicio
2) agora crie um SP denominado “spTotal_produtos ” para obter o número total de
produtos da tabela tbl_produto_super usando um parâmetro de saída.
--execute
DECLARE @Count int;
Execute spTotalprodutos @Countproduto = @Count output;
SELECT @Count AS 'Total de produtos disponiveis';
--actualizar salario
CREATE PROCEDURE Updatesalario (@codigo int, @salario money)
AS
BEGIN
UPDATE dbo.salario_trabalhador
SET Salario = @salario
WHERE codigo = @codigo
END