Académique Documents
Professionnel Documents
Culture Documents
Conceitos bsicos
Contedo
Introduo................................................................................................................................................................... 10 Captulo 1 .................................................................................................................................................................... 11 O Que SQL?.......................................................................................................................................................... 11 O Que Banco De Dados Relacional?........................................................................................................... 11 SQL Server e o Transact-SQL ........................................................................................................................... 11 Exerccios ................................................................................................................................................................ 12 Captulo 2 .................................................................................................................................................................... 13 Conhecendo o SQL Server 2005 Management Studio Express .......................................................... 13 Captulo 3 .................................................................................................................................................................... 15 Objetos do SQL Server 2005 ............................................................................................................................ 15 Manipulando e Conhecendo os Objetos DATATYPEs, DATABASEs e TABLEs ............................. 16 DATATYPES ....................................................................................................................................................... 16 DATABASE ......................................................................................................................................................... 17 TABLE .................................................................................................................................................................. 20 Exerccios ................................................................................................................................................................ 22 Captulo 4 .................................................................................................................................................................... 23 DML Simples .......................................................................................................................................................... 23 INSERT................................................................................................................................................................. 23 UPDATE ............................................................................................................................................................... 25 DELETE................................................................................................................................................................ 26 SELECT ................................................................................................................................................................ 26 Exibindo Todas as Colunas da Tabela ..................................................................................................... 27 Exibindo Colunas com ALIAS ...................................................................................................................... 27 Colunas Virtuais ............................................................................................................................................... 28 Exibindo um Clculo com o Comando SELECT .................................................................................... 29 Exibindo Apenas Uma Vez Registros Repetidos (DISTINCT) ......................................................... 29 Copiando Dados De Uma Tabela Para Outra Com INSERT e SELECT.............................................. 31 INSERT Com SELECT Quando as Tabelas So Iguais ......................................................................... 31 INSERT Com SELECT Quando as Tabelas No So Iguais ................................................................ 32 Exerccios ................................................................................................................................................................ 33 Laboratrio ............................................................................................................................................................ 34 Captulo 5 .................................................................................................................................................................... 38 A Clusula WHERE .............................................................................................................................................. 38
2
Sintaxe Bsica........................................................................................................................................................ 39 Selecionando Registros Especficos .............................................................................................................. 39 Atualizando Registros Especficos ................................................................................................................ 39 A Clusula WHERE Com os Operadores AND e OR................................................................................. 40 A clusula WHERE com o operador IN ........................................................................................................ 40 A Clusula WHERE Com os Operadores NOT IN ..................................................................................... 41 A Clusula WHERE Com o Operador BETWEEN ..................................................................................... 41 A Clusula WHERE Com os Operadores NOT BETWEEN..................................................................... 42 A Clusula WHERE Com o Operador LIKE ................................................................................................. 43 A Clusula WHERE Com os Operadores NOT LIKE ................................................................................ 44 Exerccios ................................................................................................................................................................ 45 Laboratrio ............................................................................................................................................................ 46 Captulo 6 .................................................................................................................................................................... 47 A Clusula ORDER BY ......................................................................................................................................... 47 Ordenando Por Colunas .................................................................................................................................... 47 Ordenando Por Mais de Uma Coluna ........................................................................................................... 48 ORDER BY ASC e DESC....................................................................................................................................... 48 ASC e DESC ............................................................................................................................................................. 49 A Clusula TOP ...................................................................................................................................................... 49 A Clusula TOP Com ORDER BY ..................................................................................................................... 50 A Clusula TOP WITH TIES Com ORDER BY ............................................................................................. 51 Exerccios ................................................................................................................................................................ 52 Laboratrio ............................................................................................................................................................ 53 Captulo 7 .................................................................................................................................................................... 54 Integridade E Consistncia - Parte 1 ............................................................................................................ 54 CONSTRAINTS....................................................................................................................................................... 54 Chaves Primrias (PRIMARY KEY) ............................................................................................................... 54 Chaves Secundrias ou nicas (UNIQUE) .................................................................................................. 56 Chave Estrangeira (FOREIGN KEY / REFERENCES) .............................................................................. 56 Regras de Validao (CHECK) ......................................................................................................................... 57 Valor Padro (DEFAULT).................................................................................................................................. 58 Valores NULL ......................................................................................................................................................... 59 Regras de constraints ......................................................................................................................................... 60 Criando Tabelas Com Todas as Regras de Integridade e Consistncia ........................................... 60
3
Modelo Entidade - Relacionamento (MER) ............................................................................................... 62 Relacionamento .................................................................................................................................................... 62 Relacionamento 1 : 1 ...................................................................................................................................... 63 Relacionamento 1 : N ..................................................................................................................................... 63 Relacionamento N : N..................................................................................................................................... 64 Exerccios ................................................................................................................................................................ 67 Laboratrio ............................................................................................................................................................ 68 Captulo 8 .................................................................................................................................................................... 79 Associando tabelas .............................................................................................................................................. 79 JOIN ........................................................................................................................................................................... 79 INNER JOIN ........................................................................................................................................................ 80 LEFT JOIN ........................................................................................................................................................... 81 RIGHT JOIN ........................................................................................................................................................ 81 Associando Mais de Duas Tabelas............................................................................................................. 82 FULL OUTER JOIN ........................................................................................................................................... 83 CROSS JOIN ........................................................................................................................................................ 83 Os Comandos UPDATE e DELETE Com Utilizao do JOIN ................................................................. 84 Exerccios ................................................................................................................................................................ 87 Laboratrio ............................................................................................................................................................ 88 Captulo 9 .................................................................................................................................................................... 90 UNION ALL ............................................................................................................................................................. 90 Regras de Utilizao ....................................................................................................................................... 91 Subquery ................................................................................................................................................................. 91 Formatos Apresentados Comumente Pelas Subqueries .................................................................. 92 Exemplo de Subquery .................................................................................................................................... 92 Regras de Utilizao ....................................................................................................................................... 93 Exerccios ................................................................................................................................................................ 94 Captulo 10 .................................................................................................................................................................. 95 Totalizando Dados ............................................................................................................................................... 95 GROUP BY ............................................................................................................................................................... 95 HAVING Com GROUP BY ............................................................................................................................... 96 WITH ROLLUP Com GROUP BY.................................................................................................................. 97 WITH CUBE Com GROUP BY ....................................................................................................................... 98 Exerccios ............................................................................................................................................................. 100
4
Laboratrio ......................................................................................................................................................... 101 Captulo 11 ............................................................................................................................................................... 103 Entendendo os Arquivos de Dados ............................................................................................................ 103 Arquivo Primrio (PRIMARY DATA FILE) .............................................................................................. 103 Arquivo Secundrio (SECONDARY DATA FILE) ................................................................................... 103 Arquivo de Log (LOG DATA FILE) .............................................................................................................. 104 Nome Fsico e Lgico................................................................................................................................... 104 Grupos de Arquivos (FILEGROUP)............................................................................................................. 104 Regras dos FILEs e FILEGROUPs ............................................................................................................ 105 Recomendaes de Uso .................................................................................................................................. 105 Tamanho dos Arquivos .............................................................................................................................. 105 Mltiplos Arquivos....................................................................................................................................... 105 Tabelas.............................................................................................................................................................. 105 Separando o Log e Arquivo de Dados ................................................................................................... 106 Exemplo de Criao de Database ................................................................................................................ 106 Criando Tabelas Dentro de FILEGROUPs ................................................................................................ 107 Transaction Log ................................................................................................................................................. 108 Exerccios ............................................................................................................................................................. 109 Laboratrio ......................................................................................................................................................... 113 Captulo 12 ............................................................................................................................................................... 114 Integridade e Consistncia - Parte 2.......................................................................................................... 114 UDDT (User-Defined Datatypes) ................................................................................................................ 114 NULL / NOT NULL ............................................................................................................................................ 115 PRIMARY KEY .................................................................................................................................................... 115 FOREIGN KEY / REFERENCES ..................................................................................................................... 115 DEFAULT .............................................................................................................................................................. 116 RULEs .................................................................................................................................................................... 116 Ao Em Cadeia ................................................................................................................................................. 117 Removendo Uma Constraint Com o Comando ALTER TABLE ........................................................ 118 Adicionando Uma Constraint Com o Comando ALTER TABLE ....................................................... 118 Adicionando Uma Coluna a Tabela ............................................................................................................ 118 Removendo Uma Coluna da Tabela ........................................................................................................... 119 Habilitando e/ou Desabilitando TRIGGERs de Uma Tabela............................................................. 119 Habilitando e/ou Desabilitando Constraints ......................................................................................... 119
5
IDENTITY ............................................................................................................................................................. 120 Adicionando Uma Coluna IDENTITY Com ALTER TABLE ............................................................ 120 SET IDENTITY_INSERT ................................................................................................................................... 120 Obtendo Informaes da Coluna IDENTITY ........................................................................................... 121 DBCC CHECKIDENT ..................................................................................................................................... 121 IDENTITYCOL ................................................................................................................................................ 121 IDENT_CURRENT.......................................................................................................................................... 121 IDENTITY_INCR............................................................................................................................................. 122 IDENTITY_SEED ............................................................................................................................................ 122 @@IDENTITY ................................................................................................................................................ 122 SCOPE_IDENTITY ......................................................................................................................................... 122 Exerccios ............................................................................................................................................................. 123 Laboratrio ......................................................................................................................................................... 125 Captulo 13 ............................................................................................................................................................... 126 O Que Uma Views? ........................................................................................................................................ 126 Criando Uma VIEW........................................................................................................................................... 126 Vantagem das VIEWs....................................................................................................................................... 127 WITH ENCRYPTION ......................................................................................................................................... 128 WITH CHECK OPTION ..................................................................................................................................... 128 Excluindo Uma VIEW ...................................................................................................................................... 129 Alterando Uma VIEW ...................................................................................................................................... 129 VIEWs Indexadas .............................................................................................................................................. 129 Diretrizes Para Criao de ndices Sobre Uma VIEW ..................................................................... 129 Criando e Indexando VIEWs..................................................................................................................... 130 Exerccios ............................................................................................................................................................. 131 Captulo 14 ............................................................................................................................................................... 132 Programando Com Transact-SQL ............................................................................................................... 132 Variveis de Usurio ........................................................................................................................................ 132 Atribuindo Valor a Uma Varivel ................................................................................................................ 132 Controle de Fluxo .............................................................................................................................................. 133 EXECUTE .............................................................................................................................................................. 136 STORED PROCEDURE ..................................................................................................................................... 137 Tipos de STORED PROCEDUREs ................................................................................................................. 137 System Stored Procedure .............................................................................................................................. 138
6
Extended Stored Procedures ........................................................................................................................ 139 Stored Procedures Temporrias ................................................................................................................. 140 Stored Procedures Remotas ......................................................................................................................... 140 Stored Procedures Locais .............................................................................................................................. 141 Parmetros .......................................................................................................................................................... 141 Passagem de Parmetro Por Referncia .................................................................................................. 142 Retornando Um Valor ..................................................................................................................................... 142 A Criao de Uma STORED PROCEDURE................................................................................................. 143 Execuo de Uma Procedure ........................................................................................................................ 143 Otimizao da Procedure............................................................................................................................... 143 Compilao da Procedure .............................................................................................................................. 144 As Prximas Execues da Procedure ...................................................................................................... 144 Vantagem das Procedures ............................................................................................................................. 144 Consideraes na Criao de STORED PROCEDURES ........................................................................ 144 Excluindo Uma Procedure ............................................................................................................................. 145 Alterando Uma STORED PROCEDURE...................................................................................................... 145 Recompilando Uma STORED PROCEDURE............................................................................................. 145 Observaes Quando ao Uso de STORED PROCEDUREs ................................................................... 145 Exerccios ............................................................................................................................................................. 147 Laboratrio ......................................................................................................................................................... 150 Captulo 15 ............................................................................................................................................................... 159 Transaes........................................................................................................................................................... 159 Exemplo de Transao .................................................................................................................................... 160 Transaes Explcitas ...................................................................................................................................... 161 Transaes Implcitas ..................................................................................................................................... 161 Consideraes Sobre Transaes ............................................................................................................... 162 Manipulando Erros .......................................................................................................................................... 162 SET XACT_ABORT ............................................................................................................................................. 162 RAISERROR ......................................................................................................................................................... 163 A Varivel @@ERROR..................................................................................................................................... 164 Criando Uma Mensagem de Erro ................................................................................................................ 165 Eliminando Uma Mensagem de Erro......................................................................................................... 166 Batch ...................................................................................................................................................................... 167 Exerccios ............................................................................................................................................................. 168
7
Laboratrio ......................................................................................................................................................... 171 Captulo 16 ............................................................................................................................................................... 172 Funes ................................................................................................................................................................. 172 Regras Para Utilizao de Funes ............................................................................................................ 172 Funes Built-In ................................................................................................................................................ 173 Tipos de USER DEFINED FUNCTIONS ...................................................................................................... 173 Funes Escalares............................................................................................................................................. 173 Funes Table-Valued ..................................................................................................................................... 174 Funes Que Contm Vrios Comandos e Que Retornam Dados de Uma Tabela.................... 175 Exerccios ............................................................................................................................................................. 176 Captulo 17 ............................................................................................................................................................... 179 TRIGGERs ............................................................................................................................................................. 179 TRIGGER x Transao ..................................................................................................................................... 179 TRIGGERs So Reativas .................................................................................................................................. 182 Tabelas Criadas Em Tempo de Execuo ................................................................................................ 182 TRIGGER DDL ..................................................................................................................................................... 182 Alterando ou Eliminando Um TRIGGER ................................................................................................... 183 TRIGGERs Aninhados ...................................................................................................................................... 183 INSTEAD OF ........................................................................................................................................................ 184 Exerccios ............................................................................................................................................................. 185 Labortorio ......................................................................................................................................................... 188 Captulo 18 ............................................................................................................................................................... 189 Concorrncia....................................................................................................................................................... 189 LOCKs .................................................................................................................................................................... 189 Tipos de LOCKs .................................................................................................................................................. 190 SHARED (S) LOCKs ...................................................................................................................................... 190 UPDATE (U) LOCKs ...................................................................................................................................... 190 EXCLUSIVE (X) LOCKs ................................................................................................................................ 191 INTENT (I) LOCKs ........................................................................................................................................ 191 EXTENT LOCKs .............................................................................................................................................. 191 SCHEMA (SCH) LOCKs ................................................................................................................................ 192 Granularidade .................................................................................................................................................... 192 Problemas de Concorrncia Impedidos Pelos LOCKs......................................................................... 193 LOST UPDATE ................................................................................................................................................ 193
8
UNCOMMITED DEPENDENCY ................................................................................................................. 193 INCONSISTENT ANALYSIS (NONREPEATABLE READ)................................................................. 193 PHANTOMS ..................................................................................................................................................... 193 Customizando o LOCK ..................................................................................................................................... 194 Customizando LOCKs na Seo ................................................................................................................... 194 LOCK Dinmico .................................................................................................................................................. 195 TIMEOUT.............................................................................................................................................................. 196 Exerccios ............................................................................................................................................................. 197 Captulo 19 ............................................................................................................................................................... 199 Distribuio de Dados ..................................................................................................................................... 199 Acessando Dados de um SQL Server Remoto ........................................................................................ 199 Conectando-se a um SQL Server Remoto ................................................................................................ 199 Conectando-se a Uma Origem OLEDB ...................................................................................................... 200 Segurana............................................................................................................................................................. 200 Acessando Dados do Servidor Conectado Com o Nome Totalmente Qualificado.................... 201 Acessando Dados do Servidor Conectado Com a Funo OPENQUERY()................................... 202 Comando e Aes Proibidos no Servidor Conectado .......................................................................... 202 Opes Para Configurar o Servidor Conectado ..................................................................................... 202 Modificando Dados em Um Servidor Remoto........................................................................................ 203 Como as Transaes So Distribudas ...................................................................................................... 204 Participando de Transaes Distribudas ............................................................................................... 205 Consideraes .................................................................................................................................................... 205 MS DTC (Microsoft Distributed Transaction Coordinator) .............................................................. 205 Exerccios ............................................................................................................................................................. 207 Apndice ................................................................................................................................................................... 210 Banco de Dados de Sistema .......................................................................................................................... 210 RESOURCE ....................................................................................................................................................... 210 MASTER............................................................................................................................................................ 210 TEMPDB ........................................................................................................................................................... 210 MODEL .............................................................................................................................................................. 210 MSDB ................................................................................................................................................................. 211 BACKUP ................................................................................................................................................................ 211 Stored Procedures teis................................................................................................................................. 211
Introduo
Criei essa apostila com o intuito de compartilhar o pouco de conhecimento que possuo sobre essa ferramenta, o SQL Server 2005 Express. No de meu interesse cobrar sobre esse material qualquer tipo de quantia ou valor de qualquer gnero, tendo em vista que retirei boa parte do material aqui contido, de outras apostilas que possuo, de meus prprios conhecimentos sobre essa ferramenta to poderosa e outros lugares (revistas, sites, arquivos de ajuda, etc).
10
Captulo 1
O Que SQL?
SQL significa Structured Query Language (ingls), ou Linguagem Estruturada de Pesquisa (portugus). Baseia-se em um modelo de dados relacional criado pelo ingls Edgard F. Codd no incio dos anos 70 para ser usado no trabalho com banco de dados.
Num BDR pode-se fazer uso de vrias tabelas. Essas tabelas, ou entidades, podem ter suas informaes combinadas por meio de relacionamentos formados por chaves primrias, secundrias ou estrangeiras.
Os comandos so relativamente simples, mas possuem clusulas que podem torn-los complexos. Os comandos DCL tratando de permisses dos usurios dentro do banco de dados. Os DDL so para criao de objetos dentro do sistema. E os DML so utilizados no tratamento dos dados de um sistema.
11
Exerccios
1. O que SQL? Resposta:
3. A linguagem SQL subdividida em trs grupos. Quais so e quais os principais comandos de cada grupo? Resposta:
12
Captulo 2
Conhecendo o SQL Server 2005 Management Studio Express
Antes de iniciarmos o nosso curso, vejamos a interface do programa que ir nos ajudar na montagem de um banco de dados no SQL Server 2005, esse programa o SQL Server 2005 Management Studio Express ou simplesmente SSMSE. Ser nossa IDE com o SQL Server. Depois de instalar o SMSSE, para inici inici-lo, clique em INICIAR / PROGRAMAS / MICROSOFT SQL SERVER 2005 / SQL SERVER MANAGEMENT STUDIO EXPRESS. Ao iniciar o programa, ir aparecer uma janela como esta abaixo pedindo para que o SSMSE seja conectado a alguma instncia do SQL Server presente na mquina local ou em uma mquina remota. No nosso caso, a mquina ser local e no ser preciso fazer nenhum tipo de identificao agora, pois usaremos o modo Windows Authentication que nada mais que usar o prprio usurio da mquina local como usurio do SQL Server Express. rio
13
Depois de conectar-se a instncia do SQL Server, teremos essa tela abaixo. Server,
1. Barra de Menu: Aqui esto os principais menus do SSMSE. 2. Barra de Ferramentas: Os comandos mais freqentemente utilizados esto dispostos : nessa regio para um acesso rpido. Aqui tambm se encontra uma drop list chamada Available Databases, por meio da qual podemos escolher o banco de dados que , desejamos acessar. 3. SQL Editor: Nessa barra iremos encontrar os principais comandos do SQL Server para analisar nossos scripts SQL. 4. Object Explorer: Encontra ncontra-se esquerda. Aqui se localizam as databases, opes de segurana, objetos e servios extras. Caso voc feche o Object Explorer basta clicar F8 Explorer, para que ele reaparea. 5. rea do Editor: Toda vez que criamos uma nova query, clicando no boto New Query, ir se abrir uma rea para que possamos digitar nosso script. 6. Barra de Status do SQL Server Nessa barra de status temos as principais Server: informaes, como: Modo de trabalho, Instncia, Usurio, Database, Tempo de trabalho, execuo e Linhas afetadas. 7. Barra de Status do Editor: Nessa barra temos informaes como: Posio do cursor (Horizontal e Vertical), Posio em relao ao caractere, etc.
14
Captulo 3
Objetos do SQL Server 2005
Dentro do SQL Server h vrios tipos de objetos. Abaixo esto listados alguns desses objetos: DATABASE - Os objetos de um sistema so criados dentro de uma estrutura lgica que corresponde ao objeto database. TABLE - Os dados de um sistema so inclusos nesse objeto de duas dimenses, que formado por linhas e colunas. CONSTRAINTs, DEFAULTs e RULEs - Consistem em regras utilizadas para implementar a consistncia e a integridade dos dados. Datatypes e User-Defined Datatypes - Os dados so armazenados no disco sob uma formato representado pelos datatypes. Um datatype dever ser atribudo a cada coluna de uma tabela. VIEW - Este objeto oferece uma visualizao lgica dos dados de uma tabela, de modo que diversas aplicaes possam compartilh-las. INDEX - Objetos responsveis pela otimizao de acesso aos dados de uma tabela. PROCEDURE - Nesse objeto, encontramos um bloco de comandos Transact-SQL, responsvel por uma determinada tarefa. Sua lgica pode ser compartilhada por vrias aplicaes. TRIGGER - Esse objeto tambm possui um bloco de comandos Transact-SQL. O objeto TRIGGER criado sobre uma tabela e ativado no momento da execuo dos comandos UPDATE, INSERT e/ou DELETE. FUNCTION - Nesse objeto, encontramos um bloco de comando Transact-SQL responsvel por uma determinada tarefa. Sua lgica pode ser compartilhada por vrias aplicaes. Vale ressaltar que uma funo sempre retornar um valor.
Nota: Os objetos PROCEDURE, TRIGGER e FUNCTION so processados rapidamente, uma vez que seu cdigo tende a ficar "compilado" na memria. Isso acontece porque tais objetos so executados no servidor de dados.
15
Cada coluna, expresso, parmetro ou varivel local do SQL Server referenciado a um atributo que determina um tipo de dado. Por meio do MS .Net Framework ou do TransactSQL, tambm possvel que os usurios definam seus prprios tipos de dados. Aqui veremos os tipos de dados, datatypes, padres do SQL Server. Built-in datatypes baseados em caracteres CHAR(n): Trata-se de um datatype que aceita como valor qualquer dgito, sendo que o espao ocupado no disco de um dgito por caractere. possvel utilizar at oito mil dgitos. VARCHAR(n): Permite o uso de qualquer dgito, sendo que o espao ocupado de um dgito por caractere. Com valor mximo de oito mil dgitos. TEXT: Qualquer dgito por ser usado neste datatype, sendo ocupado um byte a cada caractere, o que corresponde a 232 - 1 byte ou 2.147.483.647 bytes. Built-in datatypes baseados em caracteres UNICODE (internacionalizao) NCHAR(n): Pode utilizar qualquer dgito, sendo ocupados dois bytes a cada caractere. possvel at oito mil bytes. NVARCHAR(n): Aceita qualquer tipo de dgito. So ocupados dois bytes por caractere, sendo um mximo de oito mil bytes. NTEXT: Aceita qualquer dgito ocupando dois bytes por caractere. Mximo de 230 - 1 bytes ou 1.073.741.823 bytes. Built-in datatypes baseados em numricos inteiros BIGINT: Aceita valores entre -263 a 263 - 1, ocupando oito bytes. INT: Aceita valores entre -231 a 231 - 1, ocupando quatro bytes. SMALLINT: Aceita valores entre -215 a 215 - 1, ocupando dois bytes. TINYINT: Aceita valores entre 0 e 255, ocupando um byte. BIT: Trata-se de um tipo de dado integer (inteiro), cujo valor pode corresponder a NULL, 0 (zero) ou 1. Ocupa um bit. Built-in datatypes baseados em numricos de preciso DECIMAL(p, s): Aceita valores entre -1038 a 1038 - 1, sendo que o espao ocupado vria de acordo com a preciso. Se a preciso est entre 1 e 9, o espao ocupado de cinco bytes. Se a preciso est entre 10 e 19, o espao ocupado de nove bytes. Se a preciso est entre 20 e 28, o espao ocupado de treze bytes. Caso a preciso seja de 29 a 38, o espao ocupado de dezessete bytes. NUMERIC(p, s): Idem ao DECIMAL(p, s). Built-in datatypes baseados em numricos aproximados FLOAT(n): Esse datatype aceita valores entre -1.79 x 10308 e 1.79 x 10308. O espao ocupado varia de acordo com o valor de n. Se esse valor est entre 1 e 24, a preciso ser de 7 dgitos, sendo que o espao ocupado ser de 4 bytes.
16
Caso o valor de n esteja entre 25 e 53, sua preciso ser de 15 dgitos, fazendo com que sejam ocupados 8 bytes. Built-in datatypes baseados em numricos monetrios MONEY: Esse datatype aceita valores entre -263 e 263 - 1 sendo que 8 bytes so ocupados para aloc-lo. SMALLMONEY: possvel utilizar valores entre -231 e 231 - 1. Ocupa 4 bytes. Built-in datatypes baseados em data e hora DATETIME: Permite o uso de valores entre 1/1/1753 e 31/12/9999. Esse datatype ocupa 8 bytes, sendo que sua preciso atinge 333 mili segundos. SMALLDATETIME: Permite o uso de valores entre 1/1/1900 e 6/6/2079, sendo que sua preciso de 1 minuto. O espao ocupado de 4 bytes. Built-in datatypes baseados em binrios BINARY(n): Este datatype representa os dados que so utilizados no formato binrio. O espao ocupado de n+4 bytes, sendo que n pode variar entre 1 e 8000 bytes. VARBINARY(n): Descrio idntica ao BINARY(n). IMAGE: O espao ocupado por esse datatype de 2.147.483.647 bytes ou 2 Gbytes. Built-in datatypes especiais UNIQUEIDENTIFIER: O formato hexadecimal utilizado para armazenamento de dados binrios. O espao ocupado de 16 bytes. TIMESTAMP: Um valor binrio gerado pelo SQL Server, sendo que esse datatype ocupa 8 bytes. BIT: Ocupa um bit. Representa 0 (zero), 1 ou NULL. SQL_VARIANT: O valor pode ser qualquer datatype. Pode armazernar valores de at 8016 bytes.
DATABASE
Os objetos que fazem parte de um sistema so criados dentro de um objeto denominado database, ou seja, uma estrutura lgica formada, basicamente, por dois tipos de arquivo, um responsvel pelo armazenamento de dados e outro que armazenamento de dados e outro que armazena as transaes feitas. Para que o SQL Server crie um database, necessrio utilizar a instruo CREATE DATABASE [nome_database]. Por exemplo, suponhamos que ser criado um banco de dados com o nome MINHA_DB. Assim, clique em New Query, isso ir abrir o editor. No editor digite esse comando abaixo:
CREATE DATABASE MINHA_DB GO
17
Aps digitar, selecione o texto digitado e clique em Execute ou pressione a tecla F5. , Isso ir executar somente o comando selecionado, caso existam outros comando abaixo esses sso no sero executados. Agora se verificarmos o Object Explorer, no n Databases, veremos que nossa , database MINHA_DB foi criada com sucesso. (Caso a database MINHA_DB no esteja aparecendo, clique com o boto direito sob o n Databases e depois em Refresh) sobre
H tambm uma aba de mensagens ( (Messages) abaixo do editor que mostrar as ditor mensagens decorrentes das execues de scripts. Nesse caso, ela mostra a mensagem "Command(s) completed sucessfully." nos informando que o comando passado ao SQL Command(s) sucessfully." Server foi completado com sucesso e criamos nossa primeira database. Veremos mais a frente que essa aba de mensagens, Messages, ser muito til quando ocorrer algum tipo de erro na Messages, nossa instruo SQL. Apesar de termos criado nossa database, ela ainda no se encontra em uso para que possamos criar outros objetos dentro dela. Logo, para coloc la em uso utilizaremos o coloc-la comando USE [nome_database] como vemos abaixo: [nome_database],
USE MINHA_DB GO
Agora nossa database est em uso, como podemos ver na lista de databases Available Databases (Databases Disponveis):
18
Com esse exemplo, queramos demonstrar os comandos bsicos para a criao e utilizao de uma database. Feito isso, nosso exemplo tem apenas mais uma serventia, demonstrar a utilizao do comando DROP DATABASE [nome_database] Esse comando [nome_database]. exclui qualquer vestgio da nossa database de exemplo do SQL Server. Mas antes que ele possa ser executado, devemos colocar outra database em uso para que o SQL Server perca o vnculo com a database que desejamos excluir. Podemos colocar em uso a database MASTER, que uma database padro do SQL Server. Para isso, faamos:
USE [MASTER] GO
Como resposta ao comando acima, temos que nossa database em uso agora a database MASTER.
Agora podemos usar o comando DROP DATABASE [nome_database] para "dropar" o nosso exemplo:
DROP DATABASE MINHA_DB GO
CUIDADO: AO UTILIZAR O COMANDO DROP DATABASE [nome_database]!!! [nome_database] POIS ELE IRREVERSVEL!
19
TABLE
Os dados de um sistema so armazenados em objetos denominados tabelas. Cada uma das colunas de uma tabela refere se a um atributo associado a uma determinada entidade. Os refere-se datatypes, ou seja, os formatos utilizados para a gravao dos dados no disco devero ser especificados para cada coluna da tabela. A instruo CREATE TABLE que possui a seguinte sintaxe bsica: TABLE, CREATE TABLE [nome_tabela a] ( [campo1] [datatype], ..., [campoN] [datatype] ) Como exclumos nossa database de exemplo, crie outra database e ponha-a em uso para que nela possamos criar nossa tabela, d a database o nome de MINHA_DB como no MINHA_DB, exemplo. Para criar nossa tabela, faamos:
CREATE TABLE TELEFONES ( CODIGO INT, INT NOME VARCHAR(50), VARCHAR TELEFONE CHAR(15) CHAR ) GO
Para localizar a tabela, no Object Explorer, expanda o n Databases localize a nossa Databases, database MINHA_DB, expanda Dentro da database MINHA_DB existem pastas onde ficam , expanda-a.
20
alocados todos os objetos referentes a essa database. Procure a pasta Tables e expanda-a. L, voc localizar a tabela TELEFONES que acabamos de criar. O comando DROP TABLE [nome_tabela] executa um comando parecido com o comando que executamos para excluir a nossa database de exemplo, mas ao invs de excluir a database inteira, ela exclui apenas a tabela a qual fazemos referncia. necessrio salientar que esse comando exclui a tabela permanentemente. A partir de agora j podemos inserir registros em nossa tabela recm criada. Nesse caso, no necessrio usar o comando USE para que possamos ter acesso tabela, pois como ela est dentro da database MINHA_DB, o SQL Server j entende que qualquer comando direcionado a essa tabela admite que a database em que ela se encontra j est em uso.
21
Exerccios
1. Qual o comando usado para se criar uma database? Resposta:
22
Captulo 4
DML Simples
Os comandos DML so utilizados para manipular os dados dentro de uma tabela. Essa manipulao pode ser do tipo: Incluso (INSERT), atualizao (UPDATE), excluso (DELETE) ou seleo (SELECT). Dentre esses comandos, o mais complexo, devido a inmeras quantidades de clusulas, o comando de seleo (SELECT). Pois ele alm de ter suas prprias clusulas, pode entrar como clusula dos comandos de incluso, atualizao e excluso. (Ser visto mais adiante).
INSERT
Primeiramente veremos o comando INSERT. Que nos ajudar a inserir registros em nossa tabela recm criada. O comando INSERT segue a seguinte sintaxe: INSERT INTO [nome_tabela] ([nome_campo1], ..., [nome_campoN]) VALUES ([valor1], ..., [valorN]) Como exemplo prtico, tomemos o seguinte comando dentro do SSMSE:
INSERT INTO TELEFONES ( CODIGO, NOME, TELEFONE ) VALUES ( 1, 'MARCO TEIXEIRA', '(11)5555-5555' ) GO
23
Observando na imagem acima, podemos perceber que nossa aba Messages diz o seguinte: (1 row(s)) affected), ou seja, "uma linha afetada". Isso nos mostra que o registro foi , inserido com sucesso. Quando executarmos os comandos UPDATE e DELETE, caso esses sejam bem sucedidos, uma mensagem similar aparecer na aba Messages Basicamente o essages. comando INSERT isso, mas possvel modificarmos um pouco esse comando Existe a , comando. possibilidade de se fazer um INSERT posicional. Isso significa que podemos escolher quais . campos sero preenchidos pelo INSERT. Vejamos:
INSERT INTO TELEFONES ( CODIGO, TELEFONE ) VALUES ( 2, '(11)7777-7777' ) GO
Utilizando o comando:
24
Nesse caso inserimos apenas o cdigo e o telefone da pessoa. Ficou sem o nome. Isso s possvel se o campo permitir, ou seja, se nele no contiver nenhuma restrio ao NOME ser um valor nulo. Veremos mais a frente como criar essa restrio.
UPDATE
Os dados pertencentes a mltiplas linhas de uma tabela podem ser alterados por meio do comando UPDATE. O comando UPDATE tem a seguinte sintaxe: . UPDATE [nome_tabela] SET [nome_ nome_campo1] = [valor1], ..., [nome_campoN] = [valorN] campoN] WHERE [nome_campo] = [valor] Supondo que desejamos atualizar o registro '2' da nossa tabela de telefones e incluir o nome da pessoa que est faltando. Vejamos como:
UPDATE TELEFONES SET NOME = 'DONA CAMELIA' WHERE CODIGO = 2 GO
Ao executarmos esse comando o registro '2' da tabela telefones ser atualizado com o NOME = 'DONA CAMELIA'. Para que o SQL Server entenda que estamos querendo atualizar o . registro '2', precisamos inform lo. Essa informao vem depois da clusula WHERE. inform-lo.
CUIDADO: CASO A CLUSULA WHERE SEJA OMITIDA NO COMANDO UPDATE, ISSO FAR COM QUE TODOS OS UPDATE, REGISTROS DA TABELA SEJAM ATUALIZADOS COM O MESMO VALOR.
25
DELETE
O comando DELETE deve ser utilizado quando desejamos eliminar os dado de uma tabela. Para isso, temos o seguinte comando: DELETE FROM [nome_tabela] WHERE [nome_campo] = [valor] ] Dessa forma iremos eliminar o registro '2' da nossa tabela TELEFONES TELEFONES:
DELETE FROM TELEFONES WHERE CODIGO = 2 ERE GO
A aba Messages nos informa que o comando foi executando com sucesso e o registro foi eliminado da tabela. Da mesma forma que a clusula WHERE foi utilizada no comando UPDATE, ela ser utilizada no comando DELETE. ,
CUIDADO: CASO A CLUSULA WHERE SEJA OMITIDA, ISSO FAR COM QUE TODOS OS REGISTROS DA TABELA MENCIONADA SEJAM ELIMINADOS.
SELECT
Talvez o comando SELECT seja o mais importante comando dentro dos DMLs. utilizado para realizar consultas a dados pertencentes a uma tabela. Por meio dele, podemos retornar dados para outros comandos SQL e, tambm, para outras aplicaes. A sintaxe bsica do comando : SELECT [nome_campo1], ..., [nome_campoN] FROM [nome_tab [nome_tabela] Vejamos como isso ficaria aplicado nossa tabela TELEFONES:
SELECT CODIGO, NOME, TELEFONE FROM TELEFONES GO
26
Como podemos ver, ao executar o comando de SELECT nos campos especificados, o retorno foi uma linha da nossa tabela TELEFONES. Podemos ver o retorno ao observar a nova aba que apareceu, a aba Results. Ela nos mostra o resultado de um comando de seleo ou esults. comandos que tenham relao ao comando de seleo. Nesse caso, o retorno foi apenas uma linha, pois quando vimos o comando DELETE havamos excludo o registro '2'.
possvel realizar um comando de seleo que retorne todas as colunas de uma tabela. Para isso basta que se substituam os nomes dos campos da tabela pelo caractere asterisco (*). Vejamos:
SELECT * FROM TELEFONES GO
Esse comando nos retornar o mesmo resultado do anterior, mostrar as trs colunas mesmo da tabela TELEFONES e os registros que ela contm. No caso anterior, nos especificamos as trs colunas que queramos como retorno.
ALIAS so as legendas d colunas. Na nossa tabela as alias das colunas so CODIGO, das NOME, TELEFONE. Mas podemos por meio da instruo SELECT modificar essas legendas . temporariamente, para efeito de relatrio. Vejamos como seria a sintaxe do comando: SELECT [nome_campo1] AS [nome_alias1], ..., [nome_campoN] AS [nome_aliasN] FROM [nome_tabela] Aplicando isso no editor do SSMSE teramos esse resultado: ditor
SELECT CODIGO AS [Cdigo da Linha] Linha], NOME AS [Nome da Pessoa] Pessoa], TELEFONE AS [Telefone da Pessoa] FROM TELEFONES GO 27
Se observarmos a aba R Results, veremos que as legendas das colunas foram alteradas. , Isso interessante caso os nomes dos campos sejam muito longos e foram abreviados por medida de normalizao. Assim, quando for necessrio emitir um relatrio, por exemplo, podemos modificar novamente a legenda das colunas da forma que elas deveriam ter originalmente. No caso de utilizarmos espaos em branco entre as palavras na alias, ser necessrio utilizar colchetes para conter os nomes. Dessa forma: [nome da alias com espaos em branco].
Colunas Virtuais
SELECT, Por meio da instruo SELECT, podemos exibir colunas existentes em uma tabela e tambm criar colunas virtuais que no existem fisicamente na tabela. Essas colunas virtuais sero preenchidas com dados que sero passados por ns. A seguir vamos mostrar a coluna AMIGO com o contedo 'SIM' em nosso SELECT. Atente para o fato que a coluna AMIGO no . existe na tabela TELEFONES.
SELECT CODIGO AS [Cdigo da Linha] Linha], NOME AS [Nome da Pessoa] Pessoa], TELEFONE AS [Telefone da Pessoa] Pessoa], 'Sim' AS [Amigo] FROM TELEFONES GO
28
Observe a aba Results. Voc perceber que ela mostra a coluna AMIGO, mas essa . coluna no existe na nossa tabela TELEFONES.
Nem sempre necessrio gravar um resultado de um clculo para que esse seja exibido na tabela ou retornado a alguma aplicao. Imagine que a partir do CODIGO da linha de um registro, voc deseje aplicar uma soma multiplicao, diviso ou subtrao No nosso caso, soma, subtrao. usaremos o campo CODIGO e iremos multiplic pelo valor de (pi). P multiplic-lo Poderemos fazer isso da seguinte forma:
SELECT CODIGO AS [Cdigo da Linha] Linha], NOME AS [Nome da Pessoa] Pessoa], TELEFONE AS [Telefone da Pessoa] Pessoa], CODIGO * 3.141692 AS [Cdigo vezes PI] FROM TELEFONES GO
Observando novamente a aba Results, vemos que agora existe uma coluna virtual com , o resultado da multiplicao. Se existisse um segundo registro, ele iria mostrar o clculo para ele tambm, por exemplo, 2 * 3.141692 = 6.283384.
Para que possamos observar a clusula DISTINCT, iremos adicionar um novo registro , a nossa tabela. Mais precisamente um registro idntico a qualquer um existente nela. Faamos:
INSERT INTO TELEFONES ( CODIGO, NOME, TELEFONE ) 29
Isso ir inserir um novo registro com o mesmo nome na nossa tabela TELEFONES.
O comando SELECT mostra apenas um resultado, quando na nossa tabela existem dois registros idnticos. Nesse caso fizemos uso dos campos NOME e TELEFONE no comando esse SELECT, pois eram nesses campos que os registros estavam duplicados. Caso utilizemos o campo CODIGO, os dois registros sero retornados. Vejamos: ,
SELECT DISTINCT CODIGO, NOME TELEFONE FROM TELEFONES NOME, GO
30
Iniciemos criando uma nova tabela com a mesma estrutura da tabela TELEFONES, s s que o nome dessa tabela ser AGENDA AGENDA.
CREATE TABLE AGENDA ( CODIGO INT, NOME VARCHAR(50 50), TELEFONE CHAR(15) ) GO
Como os dados que iremos inserir na tabela AGENDA j esto disponveis na tabela TELEFONES, iremos usar uma instruo de INSERT com uma instruo de SELECT para , preench-la. E como ambas possuem a mesma estrutura, usaremos a marcao asterisco (*) la. na instruo SELECT para indicar que queremos que todos os campos sejam copiados de uma os tabela a outra. Vejamos:
INSERT INTO AGENDA SELECT * FROM TELEFONES GO
Observe na aba Messages a mensagem "(2 row(s) affected)". Isso indica . indica-nos que as linhas da tabela TELEFONES foram inseridas em AGENDA. Execute um SELECT na tabela AGENDA para conferir o resultado. Nesse caso em especial, s foi possvel copiar dessa forma o contedo da tabela TELEFONES para AGENDA pois as duas tabelas tinha a mesma estrutura mesma tinham estrutura, quantidade de campos e mesmos datatype datatypes.
31
Para que possamos observar esse tipo de comando, iremos criar uma nova tabela chamada CADASTROS. Segue cdigo abaixo: .
CREATE TABLE CADASTROS ( CODIGO INT, NOME VARCHAR(50 50), ENDERECO VARCHAR(50 50), BAIRRO VARCHAR(25 25), CIDADE VARCHAR(25 25), ESTADO CHAR(2), TELEFONE CHAR(15) ) GO
Embora a tabela TELEFONES contenha dados, nem todas as colunas de CADASTROS podem ser encontradas nela. Nesse caso, para copiar os dados de TELEFONES para nela. CADASTROS utilizaremos o SELECT de colunas virtuais e o INSERT posicional (Aps, faa um SELECT na tabela CADASTROS para ver o resultado). Vejamos:
INSERT INTO CADASTROS SELECT CODIGO, NOME, 'NO TEM', 'NO TEM', 'NO TEM', 'XX', TELEFONE FROM TELEFONES GO
32
Exerccios
1. Para que usamos os comandos DML? Resposta:
3. Qual sintaxe devemos utilizar para copiar todos os dados de uma tabela para outra quando essas possuem a mesma estrutura? Resposta:
33
Laboratrio
1. Crie uma database chamada ZOOLOGICO. Resposta:
2. Na database ZOOLOGICO, crei uma tabela chamada ANIMAIS com os seguintes campos: campo datatype valor valor valor valor valor valor valor valor valor valor Resposta: CODIGO INT 1 2 3 4 5 6 7 8 9 10 TIPO CHAR(15) cachorro cachorro cachorro gato gato gato coruja coruja sapo peixe NOME CHAR(30) Djudi Sula Sarina Pipa Sarangue Clarences Agnes Arabela Quash Fish IDADE TINYINT 3 5 7 2 2 1 0 1 1 0 VALOR DECIMAL(10,2) 300.00 300.00 300.00 500.00 500.00 500.00 700.00 700.00 100.00 100.00
3. Escreva um comando que exiba todas as colunas e todas as linhas da tabela ANIMAIS. Resposta:
34
4. Escreva um comando que exiba apenas as colunas TIPO e NOME da tabela ANIMAIS, apresentando todos os registros da tabela. Resposta:
5. Escreva um comando que exiba apenas as colunas TIPO, NOME e IDADE da tabela ANIMAIS, apresentado todos os registros. Resposta:
6. Escreva um comando que exiba apenas as colunas TIPO e NOME da tabela ANIMAIS apresentando todos os registros. Apresente a legenda da coluna TIPO com o alias [Tipo de Animal] e a coluna nome com o alias [Nome do Animal]. Resposta:
7. Escreva um comando que exiba apenas as colunas TIPO, NOME e IDADE da tabela ANIMAIS apresentando todos os registros. Apresente a legenda da coluna TIPO com o alias [Tipo de Animal], da coluna nome com o alias [Nome do Animal] e da coluna IDADE com o alias [Tempo de Vida]. Resposta:
35
8. Escreva um comando que apresente os dados da tabela ANIMAIS da seguinte forma: Procedncia Animal Domstico Animal Domstico Animal Domstico Animal Domstico Animal Domstico Animal Domstico Animal Domstico Animal Domstico Animal Domstico Animal Domstico Resposta: Tipo cachorro cachorro cachorro gato gato gato coruja coruja sapo peixe Nome Djudi Sula Sarina Pipa Sarangue Clarences Agnes Arabela Quash Fish Tempo de Vida 3 5 7 2 2 1 0 1 1 0
9. Escreva um comando que apresente os dados da tabela ANIMAIS da seguinte forma: Tipo cachorro cachorro cachorro gato gato gato coruja coruja sapo peixe Resposta: Nome Djudi Sula Sarina Pipa Sarangue Clarences Agnes Arabela Quash Fish Idade 3 5 7 2 2 1 0 1 1 0 Valor Original 300.00 300.00 300.00 500.00 500.00 500.00 700.00 700.00 100.00 100.00 Valor de Venda 330.00 330.00 330.00 550.00 550.00 550.00 770.00 770.00 110.00 110.00
36
10. Escreva um comando que apresente os dados da tabela ANIMAIS como vemos a seguir, apresentando uma vez os dados repetidos. Tipo cachorro gato coruja sapo peixe Resposta: Valor Original 300.00 500.00 700.00 100.00 100.00 Valor de Venda 330.00 550.00 770.00 110.00 110.00
37
Captulo 5
A Clusula WHERE
Vimos no captulo anterior um pouco dessa clusula, nesse captulo iremos nos aprofundar na forma como ela trata os dados. A utilidade da clusula WHERE determinar quais os dados de uma tabela que sero afetados pelos comandos SELECT, UPDATE ou DELETE. Podemos dizer, ento, que essa clusula determina o escopo de uma consulta a algumas linhas, realizando a filtragem dos dados que estejam de acordo com as condies definidas. Para que possamos fazer um uso mximo dessa clusula, iremos criar uma nova database, tabela e registros. Segue script:
CREATE TABLE PRODUTOS ( CODIGO INT, NOME VARCHAR(50), TIPO VARCHAR(25), QUANTIDADE INT, VALOR DECIMAL(10,2) ) GO INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'IMPRESSORA', 'INFORMATICA', 200, 600.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'CAMERA DIGITAL', 'DIGITAIS', 300, 400.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, PLAYER', 'ELETRONICOS', 250, 500.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'MONITOR', 'INFORMATICA', 400, 900.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'TELEVISOR', 'ELETRONICOS', 350, 650.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'FILMADORA DIGITAL', 'DIGITAIS', 500, 700.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'CELULAR', 'TELEFONE', 450, 850.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'TECLADO', 'INFORMATICA', 300, 450.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'VIDEOCASSETE', 'ELETRONICOS', 200, 300.00 ) INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, 'MOUSE', 'INFORMATICA', 400, 60.00 ) GO VALOR ) VALUES ( 1, VALOR ) VALUES ( 2, VALOR ) VALUES ( 3, 'DVD VALOR ) VALUES ( 4, VALOR ) VALUES ( 5, VALOR ) VALUES ( 6, VALOR ) VALUES ( 7, VALOR ) VALUES ( 8, VALOR ) VALUES ( 9, VALOR ) VALUES ( 10,
38
Sintaxe Bsica
A sintaxe bsica de qualquer comando que utilize a clusula WHERE a seguinte: [comando] WHERE [nome_campo] [operador_ [operador_comparacao] [valor] Os operadores de comparao podem ser: = (igual ), > (maior que), < (menor que), <> (diferente de), >= (maior ou igual ), <= (menor ou igual ). H a possibilidade de se usar os . operadores IN, AND e OR em conjunto com a clusula WHERE, mas veremos isso mais a , frente.
Executando o comando, podemos observar que quatro registros foram alterados. Faa um SELECT somente nos itens os quais o tipo seja 'INFORMATICA' para visualizar a alterao.
Utilize um SELECT com a clusula WHERE para retornar somente os produtos do tipo 'ELETRONICOS' e veja as alteraes. Para que vejamos o OR em operao, imaginemos que vamos diminuir o valor dos produtos, em 20%, que sejam maiores que 1000,00 ou que estejam do tipo 'DIGITAIS'. Ento teramos o seguinte:
UPDATE PRODUTOS SET VALOR = VALOR * 0.80 WHERE TIPO = 'DIGITAIS' OR VALOR > 1000.00 GO
Observe que a vantagem dessa forma de escrita, com o operador IN, a legibilidade. Ao executarmos ambos os comandos a sada ser a mesma. Vejamos com o operador IN:
40
41
Por meio do operador AND e dos operadores relacionais =, < e > tambm possvel consultar uma determinada faixa de valores. No entanto, por meio do BETWEEN esta consulta tornar-se mais simples. Esse operador permite checar se o valor de uma coluna encontra e encontra-se em um determinado intervalo. Ele pode ser utilizado para verificar intervalos de data, caracteres, entre outros.
42
Perceba que aps o nosso caractere de busca, usamos um caractere coringa. Que no caso do SQL Server o caractere porcentagem (%). Isso especifica ao SQL Server que desejamos retornar todos os valores que se iniciem com a letra 'T'. Caso quisssemos todos os valores que terminassem com a letra 'T', usaramos essa busca da seguinte forma:
SELECT * FROM PRODUTOS WHERE NOME LIKE '%T' GO
Ou, no caso da letra 'T' ser encontrada em qualquer posio do valor, usaramos esta encontrada forma:
SELECT * FROM PRODUTOS WHERE NOME LIKE '%T%' GO
Com os caracteres coringas rodeando o nosso caractere de consulta. Vale lembrar que no apenas o primeiro caractere que pode ser determinado para uma consulta. Caso desejamos obter como resultado todos os nomes iniciados com a letra 'M' e que contenha a letra 'S' em qualquer outra posi posio:
SELECT * FROM PRODUTOS WHERE NOME LIKE 'M%S%' GO
43
Podemos restringir uma consulta com o operador LIKE determinando no apenas um caractere como, tambm, uma slaba que deva estar presente no valor do campo. Agora, usaremos o operador LIKE em conjunto com o operador AND para obter como resultado os produtos cujos nomes possuam a slaba 'RA' e os tipos que possuam a slaba 'CA' 'CA'.
SELECT * FROM PRODUTOS WHERE NOME LIKE '%RA%' AND TIPO LIKE '%CA%' GO
Nota: Caso em uma procura seja necessrio localizar um registro que possua : o caractere coringa (%), usa o LIKE nesta forma: usa-se [comando] LIKE '%^%%' ESCAPE '^' ^%%' Isso informa ao SQL Server que nesta consulta o caractere que estiver direita do caractere de ESCAPE, no caso o caractere '^', ser o caractere a ser procurado.
44
Exerccios
1. Qual a utilidade de clusula WHERE? Resposta:
2. Quais os operadores utilizados com a clusula WHERE quando se deseja usar mais de uma condio de comparao? Resposta:
3. Que operador utilizado para selecionar uma faixa de valores a ser atingida por um determinado comando? Resposta:
5. Que operador permite checar se o valor de uma coluna est presente em uma lista de elementos e pode ser utilizado no lugar do operador OR em determinadas situaes? Resposta:
45
Laboratrio
Para fazer os exerccios do laboratrio utilize a tabela PRODUTOS 1. Aumente em 12% o valor dos produtos cujos nomes iniciem com a letra 'F' Resposta:
2. Aumentar em 50 unidades todos os produtos cujo valor seja maior que 400 e inferior a 600 Resposta:
3. Aplicar um desconto de 50% (*0.5) em todos os produtos que as unidades de estoque sejam maiores que 300 Resposta:
6. Exibir todos os produtos que se iniciem com nome 'MO' e tenham como tipo as letras 'MA' Resposta:
46
Captulo 6
A Clusula ORDER BY
Por vezes necessrio que o resultado de uma consulta seja mostrado em uma ordem especfica, de acordo com determinado critrio. Para tal, contamos com opes e clusulas de ordenao. Uma delas a clusula ORDER BY (ordernar por). Utilizamos a clusula em conjunto com o comando SELECT a fim de retornar resultados de uma consulta a uma tabela em determinada ordem.
Isso ir nos retornar como resultado da consulta, todos os itens da tabela PRODUTOS da ordenados pelo campo TIPO. Vejamos: .
47
Veja que executado, ordena primeiramente pelo NOME e depois pela coluna TIPO.
A seguir, um exemplo ordenando a tabela PRODUTOS pelo campo VALOR de forma descendente:
SELECT * FROM PRODUTOS ORDER BY VALOR DESC GO
48
ASC e DESC
Tambm possvel mesclar as duas opes. Vejamos:
SELECT * FROM PRODUTOS ORDER BY NOME ASC, VALOR DESC GO
A Clusula TOP
Como resultado de uma consulta a uma tabela de um banco de dados, temos a opo de retornar a quantidade de linhas desejadas, a partir da primeira linha selecionada. Para isso, utilizamos a clusula TOP.
49
Vamos novamente nos basear na tabela PRODUTOS. Para obter como resultado as ra primeiras cinco linhas da tabela, utilizamos o seguinte comando:
SELECT TOP 5 * FROM PRODUTOS GO
Observe que a consulta retornou apenas os primeiros cinco registros da tabela. Consideraes sobre a utilizao de TOP: Em Partitioned Views TOP no pode ser aplicada junto s instrues UPDATE e Views, INSERT No h ordem das linhas referenciadas na expresso TOP utilizada como as instrues INSERT, DELETE ou UPDATE sendo que TOP n retorna linhas aleatrias n como UPDATE, resposta.
A clusula WITH TIES retornou a primeira linha da tabela, alm de todas as linhas que apresentam quantidades idnticas quantidade do produto que a clusula TOP 1 selecionou.
51
Exerccios
1. Qual a funo da clusula ORDER BY? Resposta:
2. Que comando utilizamos em conjunto com a clusula ORDER BY a fim de permitir que os dados sejam exibidos na ordem desejada? Resposta:
3. Qual a finalidade de utilizarmos as opes ASC e DESC com a clusula ORDER BY? Resposta:
5. A clusula ORDER BY permite que os dados sejam ordenados somente por uma coluna. Esta afirmao verdadeira? Resposta:
52
Laboratrio
Utilize a tabela PRODUTOS para realizar os exerccios do laboratrio. 1. Escreva uma consulta que exiba os dados da tabela PRODUTOS na forma crescente pelo campo NOME. Resposta:
2. Escreva uma consulta que exiba o NOME dos produtos ordenado de forma decrescente e o VALOR de forma crescente. Resposta:
3. Escreva uma consulta que exiba os trs produtos mais caros. Resposta:
4. Escreva uma consulta que exiba o VALOR do produto mais barato. Resposta:
53
Captulo 7
Integridade E Consistncia - Parte 1
Para que um sistema de banco de dados sempre possa fornecer informaes confiveis aos usurios, o administrador deve filtrar algumas aes realizadas sobre essas informaes a fim de evitar a ocorrncia de possveis erros relacionados s mesmas. Alm disso, esse sistema deve ser capaz de receber informaes de forma constante sem ter que sofrer alteraes com a mesma freqncia. O banco de dados deve possibilitar a insero de uma grande quantidade de dados sem que o mesmo precise ser alterado em sua estrutura.
CONSTRAINTS
Constraints so objetos utilizados com a finalidade de estabelecer regras referentes integridade e consistncia nas colunas das tabelas pertencentes a um sistema de bando de dados. Isso muito importante porque, para planejar e criar tabelas, devemos garantir a integridade dos dados presentes nas colunas e identificar os valores vlidos para tais dados. A fim de assegurar a integridade dos dados de uma tabela, o SQL Server oferece cinco tipos diferentes de constraints, os quais so relacionados a cinco tipos diferentes de integridades. Segue abaixo: Tipo de Integridade Chave Primria Chave Estrangeira Chave nica Regras de Validao Valor Padro Tipo de CONSTRAINT PRIMARY KEY FOREIGN KEY / REFERENCES UNIQUE CHECK DEFAULT
representa no pode aceitar valores nulos. Esse tipo de constraint capaz de assegurar que os esenta dados sejam identificados de forma nica e exclusiva, portanto, comum que a coluna que a represente seja chamada de coluna de identidade. O Database Engine responsvel por assegurar essa exclusividade. No nosso exemplo da tabela de PRODUTOS, temos um campo chamado CODIGO que , serve como "chave" para que no existam linhas repetidas. Mas veremos que se quisermos inserir um novo produto com o cdigo '5' isso possvel, pois esse campo no possui uma possvel, constraint do tipo PRIMARY KEY Vejamos: KEY.
INSERT INTO PRODUTOS ( CODIGO, NOME, TIPO, QUANTIDADE, VALOR ) VALUES ( 5, 'CAIXA DE SOM', 'ELETRONICOS', 150, 200.00 ) GO
Aps inserirmos o registro acima, realizamos uma consulta na tabela PRODUTOS. Observe que existem dois produtos com o mesmo CODIGO:
Em um caso real, no poderamos ter cdigos idnticos para produtos diferentes. A constraint PRIMARY KEY evita isso, no momento em que tentamos inserir um registro com momento um cdigo j existente, o SQL Server retorna um aviso de inconsistncia para o usurio avisando-o que o processo no pde ser realizado. o
55
Nota: A chave primria deve fazer parte da integridade referencial que se estabelece entre duas tabelas relacionadas. Mais detalhes a respeito deste assunto sero vistos adiante.
Nota: As constraints UNIQUE poder ser utilizadas para referenciar uma chave estrangeira.
Para entendermos melhor, tomemos um cenrio em que tenhamos uma tabela de cadastro de pessoas, CADASTROS. Nessa tabela teremos a coluna CODIGO que ser nossa coluna identidade, uma coluna NOME, RG e DATA_NASCIMENTO. Como j sabemos, o fato de existir uma coluna identidade na nossa tabela nos impede de acrescentar duas pessoas com o mesmo cdigo, mas no nos impede de acrescentar a mesma pessoa mais de uma vez. Nesse caso usaramos uma constraint do tipo UNIQUE para a coluna RG, j que no existem pessoas diferentes com o mesmo nmero de RG. Assim, a linha fica identificada pelo campo CODIGO e pelo campo RG. (Isso no nos impede de deixar o campo RG nulo, desde que s exista um nulo).
Vale destacar, no entanto, que no necessrio que uma constraint FOREIGN KEY / REFERENCES em uma tabela seja vinculada apenas a uma constraint PRIMARY KEY em outra tabela. Alm disso, embora a FOREIGN KEY / REFERENCES possa conter valores nulos, possvel que, nessa situao, a verificao dos valores que forma esta constriant no ocorra. Podemos assegurar que a verificao dos valores de FOREIGN KEY / REFERENCES ocorra por meio da especificao do valor NOT NULL em todas as colunas que fazem parte deste tipo de constraint.
Cenrio: A nossa tabela do cenrio anterior, CADASTROS, referente a uma locadora de vdeo. Nessa locadora de vdeo no necessrio que parentes de uma primeira pessoa j cadastrada faam cadastro efetivo. Elas simplesmente podem ser adicionadas como DEPENDENTES da primeira pessoa. Portanto, seria criada uma nova tabela chamada DEPENDENTES com os campos CODIGO, COD_CAD, NOME, RG e DATA_NASCIMENTO. Onde CODIGO seria um campo de PRIMARY KEY, pois s podem existir registros exclusivos, COD_CAD seria um campo FOREIGN KEY / REFERENCES para o campo CODIGO na tabela CADASTROS e o campo RG seria um UNIQUE, para que fosse evitado o cadastro da mesma pessoa mais de uma vez.
Como podemos observar, nas colunas SEXO e SALARIO, os valores inseridos para os cadastros MARISTELA DIAS e MARIA JUNQUEIRA esto inadequados, pois no existe sexo X e, tampouco, salrio negativo. (Exceto aquelas pessoas que "pagam" para trabalhar).
57
Quando pesquisarmos pelas pessoas do sexo feminino, receberemos o seguinte resultado: CODIGO (PRIMARY KEY) 1 NOME Maria Junqueira RG (UNIQUE) 23.456.789 SEXO F SALARIO -1900.00
Ou, no caso de necessitarmos da soma de todos os salrios, teramos o seguinte: CODIGO (PRIMARY KEY) 1 2 3 4 NOME Maria Junqueira Jos Almeida Maristela Dias Joo Barbosa RG (UNIQUE) 23.456.789 98.765.432 45.678.912 32.654.987 SEXO F M X M SALARIO -1900.00 900.00 2000.00 1000.00 2000.00
Temos, ento, que aplicar a constraint DEFAULT para a coluna SEXO e a coluna SALARIO. Com os valores padres 'F' e 0 (zero) respectivamente. Se adicionarmos um novo registro tabela, omitindo os valores para SEXO e SALARIO, o novo registro ficar dessa forma:
58
NOME Maria Junqueira Jos Almeida Maristela Dias Joo Barbosa Fernanda Casta
Valores NULL
Alm dos valores padres, tambm possvel atribuir valores nulos a uma coluna. Por exemplo, na tabela de FUNCIONARIOS, podemos atribuir valores nulos a coluna SALARIO. Com isso, podemos inserir todas as informaes da pessoa, mas, omitindo o valor do salrio dessa pessoa. Vejamos: SALARIO (DEFAULT 0 e admite valor NULL) -1900.00 900.00 2000.00 1000.00 0.00 NULL
NOME
Maria Junqueira Jos Almeida Maristela Dias Joo Barbosa Fernanda Casta Manuel Ferraz
Atribuir valor nulo a uma coluna significa que ela no ter valor algum. Assim, de acordo com as regras de integridade e consistncia dos dados, preciso atribuir nulabilidade das colunas de uma tabela a fim de determinar se elas aceitaro valores nulos (NULL) ou no (NOT NULL). Quando atribumos um valor nulo a uma coluna, esta pode ocupar espao no banco de dados, mas isso depende de seu datatype.
59
Regras de constraints
Cada tipo de constraint possui uma regra especfica. Vejamos essas regras: Tipo de constraint PRIMARY KEY Descrio Uma coluna que definida como chave primria no pode aceitar valores nulos. Em cada tabela, pode haver somente uma constraint de chave primria. Vrias colunas podem ser definidas como chave estrangeira. No entanto, para que uma coluna seja definida dessa forma, preciso que ela j tenha sido definida como chave primria em outra tabela. As colunas definidas como chaves estrangeiras podem aceitar valores nulos (apenas um), e os datatypes das colunas relacionadas devem ser iguais. Vrias colunas de uma tabela podem ser definidas como sendo chave nica e, ainda, aceitar valores nulos (apenas um). Diversas colunas de uma tabela podem ser definidas como constraint CHECK. Essas colunas podem aceitar valores nulos, mas isso depende das regras que so determinadas para elas. Vrias colunas de uma tabela podem ser definidas como constraint DEFAULT. Essas colunas podem aceitar valores nulos.
UNIQUE
CHECK
DEFAULT
NOT NULL,
60
CEP BAIRRO CIDADE ESTADO RG SALARIO SEXO CONSTRAINT CONSTRAINT CONSTRAINT CONSTRAINT ) GO
NOT NULL,
PK_CADASTROS_CODIGO PRIMARY KEY (CODIGO), UQ_CADASTROS_RG UNIQUE (RG), CK_CADASTROS_SALARIO CHECK (SALARIO >= 0), CK_CADASTROS_SEXO CHECK (SEXO IN ('F','M'))
CREATE TABLE DEPENDENTES ( CODIGO INT COD_CAD INT NOME VARCHAR(50), RG CHAR(12) DATA_NASCIMENTO SMALLDATETIME, SEXO CHAR(1)
CONSTRAINT PK_DEPENDENTES_CODIGO PRIMARY KEY (CODIGO), CONSTRAINT FK_DEPENDENTES_COD_CAD FOREIGN KEY (COD_CAD) REFERENCES CADASTROS(CODIGO), CONSTRAINT UQ_DEPENDENTES_RG UNIQUE (RG), CONSTRAINT CK_DEPENDENTES_SEXO CHECK (SEXO IN ('F','M')) ) GO INSERT INTO CADASTROS VALUES (1, 'MARIA JUNQUEIRA','RUA CAMBOJA, 100','02345123','AGUA LONGE','SO PAULO','SP','23.456.789',1900.00,'F') INSERT INTO CADASTROS VALUES (2, 'JOSE ALMEIRA','RUA BALBUCIA, 120','05498987','AGUA PERTO','SO PAULO','SP','98.765.432',1000.00,'M') INSERT INTO CADASTROS VALUES (3, 'MARISTELA DIAS','AVENIDA LINDOMAR, 520','05412-369','BAIXAQUI','MINAS GERAIS','MG','45.678.912',2000.00,'F') INSERT INTO CADASTROS VALUES (4, 'JOAO BARBOSA','RUA CASA DO BARBEIRO, 220','03526-333','BAIXALI','SO PAULO','SP','32.654.987',1500.00,'M') INSERT INTO CADASTROS VALUES (5, 'FERNANDA CASTA','ALAMEDA VICENTINO, 360','05255-002','MORRO ALTO','RIO DE JANEIRO','RJ','56.987.123',900.00,'F') INSERT INTO CADASTROS VALUES (6, 'MANUEL FERRAZ','TRAVESSA PASSA TRES, 10','01411-222','MORRO BAIXO','SO PAULO','SP','25.897.664',3000.00,'M') INSERT INTO CADASTROS VALUES (7, 'PRIMO ROSSI','RUA CONGLOMERADO, 500','08744001','MORRO MEDIO','MINAS GERAIS','MG','52.986.741',2100.00,'M') INSERT INTO CADASTROS VALUES (8, 'GLAUBER DOS SANTOS','RUA GRANADA, 1','06352544','FAZENDA PEQUENA','MINAS GERAIS','MG','22.369.147',2300.00,'M') INSERT INTO CADASTROS VALUES (9, 'MURILO BEBEBENICIO','AVENIDA MOTO ROLA, 650','04144-547','FAZENDA GRANDE','SO PAULO','SP','98.365.125',800.00,'M') INSERT INTO CADASTROS VALUES (10, 'CACILDA CACILDES','AVENIDA SARGENTO BIGODAO, 522','08524-963','CHACARA MEDIA','RIO DE JANEIRO','RJ','41.411.441',800.00,'F') INSERT INTO CADASTROS VALUES (11, 'VERONICA VENTANIA','RUA MORENA FURACAO, 666','01472-564','VILA TORMENTA','SO PAULO','SP','45.859.423',350.00,'F') GO INSERT INTO DEPENDENTES VALUES (1, 1,'MARCIO JUNQUEIRA FERMAT','54.698.321','11/12/78','M') INSERT INTO DEPENDENTES VALUES (2, 1,'FERNANDO JUNQUEIRA FERMAT','54.698.322','25/5/2000','M') INSERT INTO DEPENDENTES VALUES (3, 2,'JOSE ALMEIDA JUNIOR','12.369.741','3/3/1983','M') 61
INSERT INTO DEPENDENTES VALUES (4, 3,'CAROLINA DIAS CACAPAVA','56.454.654','29/2/1992','F') INSERT INTO DEPENDENTES VALUES (5, 7,'FERNANDA BEATRIZ MONTEIRO ROSSI','98.754.548','21/7/1987','F') INSERT INTO DEPENDENTES VALUES (6, 8,'GLOBENILDO MULERA DOS SANTOS','21.455.469','23/9/2001','M') INSERT INTO DEPENDENTES VALUES (7, 8,'GLOBALINA MULERA DOS SANTOS','21.712.842','11/7/2001','F') INSERT INTO DEPENDENTES VALUES (8, 8,'GLOBERTO MULERA DOS SANTOS','98.721.379','18/11/1982','M') INSERT INTO DEPENDENTES VALUES (9, 11,'ROBERTO VENTANIA E TEMPESTADE','32.198.712','28/10/1985','M') GO
Relacionamento
Os relacionamentos so responsveis por definir uma ligao entre dois objetos pertencentes ao mundo real. Quando trabalhamos com aplicaes construdas e administradas por um SGBD (Sistema Gerenciador de Banco de Dados), o relacionamento o responsvel por unir duas ou mais tabelas de banco de dados. Vale destacar que o grau de relacionamento entre duas entidades determinado pela quantidade de ocorrncias de uma entidade que est relacionada outra. O grau de relacionamento entre entidades tambm chamado de cardinalidade.
62
Relacionamento 1 : 1
No relacionamento 1 : 1 (um-para-um), cada um dos elementos de uma entidade est relacionado com um nico elemento de outra entidade. Para compreendermos de forma adequada, considere duas tabelas CONVIDADOS e CONJUGES. Na tabela CONVIDADOS, temos a seguinte estrutura: COD_CONV 1 2 3 NOME Carlos da Silva Joaquim Nabuco Carla Moreno Costa SEXO M M F
E na tabela CONJUGUES temos essa estrutura: COD_CONV_CONJ 1 3 NOME Maria Teresa da Silva Fernando Costa SEXO F M
Perceba que o COD_CONV_CONJ faz referncia ao COD_CONV, j que cada convidado tem apenas um cnjuge. Esse um caso de uma relacionamento 1 : 1.
Relacionamento 1 : N
Para compreendermos o relacionamento 1 : N (um-para-muitos), consideremos duas entidades, as quais sero chamadas de A e B. Nesse tipo de relacionamento, cada elemento da entidade A pode ter relacionamento com vrios elementos da entidade B. Mas o inverso falso. As tabelas PAIS e FILHOS so exemplos de relacionamentos 1 : N. Vejamos a tabela PAIS. COD_PAI 1 2 3 4 NOME Marislia dos Santos Braga Esgrumilda Argentina Fernando Porto Pedro Pedreira
63
Agora a tabela FILHOS: COD_FIL COD_PAI 1 2 3 1 1 4 NOME Marcelo Braga Fernando Braga Silva Monte Pedreira
Perceba que um pai pode ter vrios filhos, mas um filho tem apenas um pai. Para que se estabeleam relacionamentos de 1 : N (um-para-muitos), devemos contar com duas tabelas, em que a primeira (1) obrigatoriamente deve ter uma coluna que utilize a chave primria. Vale recordar que colunas com chave primria no aceitam a insero de valores repetidos. J na tabela que representa o relacionamento para muitos (N), dever haver uma consulta referente primeira tabela, a qual deve utilizar a chave estrangeira para que, dessa forma, seja estabelecido o relacionamento entre ambas as tabelas. Devemos estar atentos ao fato de que, diferentemente das chaves primrias, colunas que utilizam chave estrangeira aceitam a insero de valores duplicados.
Relacionamento N : N
O relacionamento N : N (muitos-para-muitos) possui uma caracterstica diferente dos outros. Neste caso, os dados sero diretamente relacionados ao fato, e no s entidades, como observamos em outros tipos de relacionamento. importante destacar que pode no haver associao de fatos nas situaes em que os relacionamentos so de carter condicional. Neste caso, a cardinalidade deve ser determinada por meio de ampla anlise quanto possibilidade de ocorrerem relacionamentos. Para compreendermos esse modo de relacionamento, tomemos como exemplo duas entidades: ALUNOS e CURSOS. Com elas, temos a seguinte situao: um aluno pode fazer diversos cursos e um curso pode ter diversos alunos. Vejamos a ilustrao:
64
Tabela ALUNOS: COD_ALUNO 1 2 3 4 NOME Fernando Fernandes Carlos Carvalho Maria Garcia Ins Pereira SEXO M M F F
Agora, a partir dessas duas tabelas podemos traar o seguinte relacionamento: COD_ALUNO COD_CURSO 1 1 2 2 3 3 3 4 4 2 5 1 3 2 4 5 1 2
65
Para estabelecer este tipo de relacionamento, devemos ter trs tabelas, sendo que a terceira responsvel por relacionar as outras duas. Para isso, preciso que essas duas primeiras tabelas tenham uma coluna que seja chave primria. As colunas que so chaves primrias na primeira e na segunda tabela devem ser colunas com chave estrangeira na terceira. Com isso, esta tabela ter duas chaves estrangeiras, as quais formam uma chave primria composta.
66
Exerccios
1. O que so constraints? Resposta:
67
Laboratrio
Nesse laboratrio iremos criar um sistema simplificado de venda de CDs. Para isso ser necessrio criar uma nova database. 1. Crie uma database com o nome DB_CDS Resposta:
3. Crie as tabelas especificadas a seguir com as respectivas constraints: TABELA: ARTISTAS COLUNA COD_ART NOME_ART DESCRIO Cdigo do Artista Nome do Artista DATATYPE INT VARCHAR(100) NULABILIDADE NOT NULL NOT NULL CONSTRAINT PRIMARY KEY UNIQUE
TABELA: GRAVADORAS COLUNA COD_GRAV NOME_GRAV DESCRIO Cdigo da Gravadora Nome da Gravadora DATATYPE INT VARCHAR(50) NULABILIDADE NOT NULL NOT NULL CONSTRAINT PRIMARY KEY UNIQUE
TABELA: CATEGORIAS COLUNA COD_CAT NOME_CAT DESCRIO Cdigo da Categoria Nome da Categoria DATATYPE INT VARCHAR(50) NULABILIDADE NOT NULL NOT NULL CONSTRAINT PRIMARY KEY UNIQUE
68
TABELA: ESTADOS COLUNA SIGLA_EST NOME_EST DESCRIO Sigla do Estado Nome do Estado DATATYPE CHAR(2) VARCHAR(50) NULABILIDADE NOT NULL NOT NULL CONSTRAINT PRIMARY KEY UNIQUE
TABELA: CIDADES COLUNA COD_CID DESCRIO Cdigo da Cidade DATATYPE INT NULABILIDADE NOT NULL CONSTRAINT PRIMARY KEY FOREIGN KEY / REFERENCES (SIGLA_EST de ESTADOS)
SIGLA_EST
Sigla do Estado
CHAR(2)
NOT NULL
NOME_CID
Nome da Cidade
VARCHAR(50)
NOT NULL
TABELA: CLIENTES COLUNA COD_CLI DESCRIO Cdigo do Cliente Cdigo da Cidade Nome do Cliente Endereo do Cliente Renda do Cliente DATATYPE INT NULABILIDADE NOT NULL CONSTRAINT PRIMARY KEY FOREIGN KEY / REFERENCES (COD_CID de CIDADES)
COD_CID
INT
NOT NULL
NOME_CLI END_CLI
VARCHAR(50) VARCHAR(100)
NOT NULL NOT NULL CHECK >= 0 e DEFAULT 0 CHECK ('F','M') e DEFAULT 'F'
RENDA_CLI
DECIMAL(9,2)
NOT NULL
SEXO_CLI
Sexo do Cliente
CHAR(1)
NOT NULL
69
TABELA: CONJUGE COLUNA DESCRIO DATATYPE NULABILIDADE CONSTRAINT PRIMARY KEY e FOREIGN KEY / REFERENCES (COD_CLI de CLIENTES)
COD_CLI
Cdigo do Cliente
INT
NOT NULL
NOME_CONJ
VARCHAR(50)
RENDA_CONJ
DECIMAL(9,2)
NOT NULL
SEXO_CONJ
Sexo do Cnjuge
CHAR(1)
NOT NULL
TABELA: FUNCIONARIOS COLUNA COD_FUNC NOME_FUNC END_FUNC DESCRIO Cdigo do Funcionrio Nome do Funcionrio Endereo do Funcionrio Renda do Funcionrio Sexo do Funcionrio DATATYPE INT VARCHAR(50) VARCHAR(100) NULABILIDADE NOT NULL NOT NULL NOT NULL CHECK >= 0 e DEFAULT 0 CHECK ('F','M') e DEFAULT 'F' CONSTRAINT PRIMARY KEY
SAL_FUNC
DECIMAL(9,2)
NOT NULL
SEXO_FUNC
CHAR(1)
NOT NULL
70
TABELA: DEPENDENTES COLUNA COD_DEP DESCRIO Cdigo do Dependente Cdigo do Funcionrio Nome do Dependente Sexo do Dependente DATATYPE INT NULABILIDADE NOT NULL CONSTRAINT PRIMARY KEY FOREIGN KEY / REFERENCES (COD_FUNC de FUNCIONARIOS)
COD_FUNC
INT
NOT NULL
NOME_DEP
VARCHAR(100)
SEXO_DEP
CHAR(1)
NOT NULL
TABELA: TITULOS COLUNA COD_TIT DESCRIO Cdigo do Ttulo Cdigo da Categoria DATATYPE INT NULABILIDADE NOT NULL CONSTRAINT PRIMARY KEY FOREIGN KEY / REFERENCES (COD_CAT de CATEGORIAS) FOREIGN KEY / REFERENCES (COD_GRAV de GRAVADORAS) UNIQUE CHECK > 0 CHECK >= 0
COD_CAT
INT
NOT NULL
COD_GRAV
INT
NOT NULL
71
TABELA: PEDIDOS COLUNA NUM_PED DESCRIO Nmero do Pedido Cdigo do Cliente DATATYPE INT NULABILIDADE NOT NULL CONSTRAINT PRIMARY KEY FOREIGN KEY / REFERENCES (COD_CLI de CLIENTES) FOREIGN KEY / REFERENCES (COD_FUNC de FUNCIONARIOS)
COD_CLI
INT
NOT NULL
COD_FUNC
INT
NOT NULL
DATA_PED
SMALLDATETIME
VAL_PED
DECIMAL(9,2)
NOT NULL
TABELA: TITULOS_PEDIDO Obs.: Esta tabela ter uma chave primria composta por duas colunas: NUM_PED e COD_TIT COLUNA DESCRIO Nmero do Pedido DATATYPE NULABILIDADE CONSTRAINT FOREIGN KEY / REFERENCES (NUM_PED de PEDIDOS) FOREIGN KEY / REFERENCES (COD_TIT de TITULOS) CHECK >= 1 CHECK > 0
NUM_PED
INT
NOT NULL
COD_TIT
INT
NOT NULL
QTD_CD VAL_CD
INT DECIMAL(9,2)
72
TABELA: TITULOS_ARTISTA Obs.: Esta tabela ter uma chave primria composta por duas colunas: COD_TIT e COD_ART COLUNA DESCRIO Cdigo do Ttulo DATATYPE NULABILIDADE CONSTRAINT FOREIGN KEY / REFERENCES (COD_TIT de TITULOS) FOREIGN KEY / REFERENCES (COD_ART de ARTISTAS)
COD_TIT
INT
NOT NULL
COD_ART
Cdigo do Artista
INT
NOT NULL
4. Agora insira os seguintes dados nas respectivas tabelas: TABELA: ARTISTAS COD_ART 1 2 3 4 5 6 7 NOME_ART MARISA MONTE GILBERTO GIL CAETANO VELOSO MILTON NASCIMENTO LEGIO URBANA THE BEATLES RITA LEE
TABELA: GRAVADORAS COD_GRAV NOME_GRAV 1 2 3 4 POLYGRAM EMI SOM LIVRE SOM MUSIC
73
TABELA: CATEGORIAS COD_CAT 1 2 3 4 NOME_CAT MPB TRILHA SONORA ROCK INTERNACIONAL ROCK NACIONAL
TABELA: CIDADES COD_CID SIGLA_EST 1 2 3 4 5 6 7 SP SP SP SP SP MG ES NOME_CID SO PAULO SOROCABA JUNDIA AMERICANA ARARAQUARA OURO PRETO CACHOEIRA DO ITAPEMIRIM
74
TABELA: CLIENTES COD_CLI COD_CID 1 2 3 4 5 6 7 8 9 10 1 1 1 1 1 2 2 2 3 3 NOME_CLI JOS NOGUEIRA NGELO PEREIRA ALM MAR PARANHOS CATARINA SOUZA VAGNER COSTA ANTENOR DA COSTA MARIA AMLIA DE SOUZA PAULO ROBERTO SILVA FTIMA SOUZA JOEL DA ROCHA END_CLI RENDA_CLI SEXO_CLI RUA A RUA B RUA C RUA D RUA E RUA F RUA G RUA H RUA I RUA J 1500.00 2000.00 1500.00 892.00 950.00 1582.00 1152.00 3250.00 1632.00 2000.00 M M M F M M F M F M
TABELA: CONJUGE COD_CLI 1 2 6 7 NOME_CONJ CARLA NOGUEIRA EMILIA PEREIRA ALTIVA DA COSTA CARLOS DE SOUZA RENDA_CLI SEXO_CLI 2500.00 5500.00 3000.00 3250.00 F F F M
TABELA: FUNCIONARIOS COD_FUNC 1 2 3 4 5 NOME_FUNC VNIA GABRIELA PEREIRA NORBERTO PEREIRA DA SILVA OLAVO LINHARES PAULA DA SILVA ROLANDO ROCHA END_FUNC SAL_FUNC SEXO_FUNC RUA A RUA B RUA C RUA D RUA E 2500.00 300.00 580.00 3000.00 2000.00 F M M F M
75
TABELA: DEPENDENTES COD_DEP COD_FUNC 1 2 3 4 5 6 1 1 1 3 3 4 NOME_DEP ANA PEREIRA ROBERTO PEREIRA CELSO PEREIRA BRISA LINHARES MARI SOL LINHARES SONIA DA SILVA SEXO_CLI F M M F F F
TABELA: TITULOS COD_TIT COD_CAT COD_GRAV 1 2 3 4 5 6 7 8 9 10 1 1 1 1 1 1 1 4 3 4 1 2 1 2 3 3 2 3 2 1 NOME_CD TRIBALISTAS TROPICLIA AQUELE ABRAO REFAZENDA TOTALMENTE DEMAIS TRAVESSIA COURAGE LEGIO URBANA THE BEATLES RITA LEE VAL_CD QTD_ESTQ 30.00 50.00 50.00 60.00 50.00 55.00 30.00 20.00 30.00 30.00 1500 500 600 1000 2000 500 200 100 300 500
76
TABELA: PEDIDOS NUM_PED COD_CID COD_FUNC DATA_PED VAL_PED 1 2 3 4 5 6 7 8 9 10 1 3 4 1 7 4 5 8 2 7 2 4 7 4 5 4 5 2 2 1 02/05/02 02/05/02 02/06/02 02/02/03 02/03/03 02/03/03 02/03/03 02/03/03 02/03/03 02/03/03 1500.00 50.00 100.00 200.00 300.00 100.00 50.00 50.00 2000.00 3000.00
77
TABELA: TITULOS_PEDIDO NUM_PED COD_TIT QTD_CD VAL_CD 1 1 2 2 3 4 5 6 6 7 8 9 10 1 2 1 2 1 2 1 2 3 4 1 2 7 2 3 1 3 2 3 2 3 1 2 4 3 2 30.00 20.00 50.00 30.00 40.00 20.00 25.00 30.00 35.00 55.00 60.00 15.00 15.00
78
Captulo 8
Associando tabelas
A associao de tabelas pode ser realizada para diversas finalidades, por exemplo, converter em informaes os dados encontrados em duas ou mais tabelas. Essa associao pode ser realizada por meio da clusula WHERE e JOIN. importante ressaltar que as tabelas devem ser associadas em pares, embora seja possvel utilizar um nico comando para combinar vrias tabelas. importante ressaltar que a tabelas devem ser associadas em pares, embora seja possvel utilizar um nico comando para combinar vrias tabelas. Um procedimento muito comum a associao da chave primria da primeira tabela com a chave estrangeira da segunda tabela. Aprenderemos a utilizar as clusulas INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN e CROSS JOIN para promover a associao das tabelas. Tambm falaremos sobre o uso dos comandos UPDATE e DELETE em parceria com a clusula JOIN para alterao e eliminao de dados nas tabelas relacionadas.
JOIN
A clusula JOIN permite que os dados de vrias tabelas sejam combinados com base na relao existente entre elas. Por meio dessa clusula, os dados de uma tabela so utilizados para selecionar os dados pertencentes outra tabela. A partir da clusula FROM, devemos indicar as tabelas que sero combinadas. A seleo de linhas de dados dessas tabelas, por sua vez, ser controlada por meio de uma ao conjunta entre as condies de associao e de buscas como HAVING e WHERE.
Veja a sintaxe bsica para associao: ... FROM [nome_tabela1] [tipo_associacao] [nome_tabela2] ON (condicao_associacao)
79
INNER JOIN
A partir da database criada no laboratrio anterior, veremos um exemplo. Associaremos a tabela CLIENTES e a tabela CIDADES, como na tabela CLIENTES existe um campo com o cdigo da cidade, por esse campo retornaremos o nome da cidade. Vejamos:
SELECT NOME_CLI, END_CLI, CID.NOME_CID FROM CLIENTES AS CLI INNER JOIN CIDADES AS CID ON CID.COD_CID = CLI.COD_CID GO
comum que duas tabelas tenham campos com o mesmo nome, como o caso da chave estrangeira da tabela CLIENTES e a chave primria da tabela CIDADES. Para que possamos informar ao SQL Server de quais tabelas os campos esto sendo relacionados, podemos "apelidar" as tabelas. No caso descrito acima, a tabela CLIENTES foi apelidada de idar" CLI e a tabela CIDADES foi apelidada de CID. "Apelidar" uma tabela muito parecido com a . criao de ALIAS para campos da tabela, s que nesse caso estamos nos referenciando ao nome das tabelas. O processamento de uma associao atende a uma seqncia lgica, sendo que, em primeiro lugar, so executadas as condies de associao da clusula FROM. Depois so aplicadas as condies de busca e de associao encontradas na clusula WHERE. Por ltimo, so executadas as condies de busca da clusula HAVING, que veremos mais adiante. , Os tipos de dados das colunas vindas de tabelas associadas no precisam ser necessariamente idnticos, mas sim compatveis, de modo que o SQL Server possa realizar
80
uma converso. A condio de associao pode, ainda, utilizar a funo CAST para converter tipos de dados que no podem ser transformados facilmente. LEFT JOIN
A clusula LEFT JOIN permite obter no apenas dados relacionados de duas tabelas, mas tambm os dados no-relacionados encontrados na tabela esquerda da clusula JOIN. relacionados Caso no existam dados relacionados entre as tabelas esquerda e direita do JOIN, os valores resultantes de todas as colunas de lista de seleo da tabela direita sero nulos. s Vejamos um exemplo aplicado ao nosso database DB_CDS. Iremos retornar o nome de . todos os clientes, com seus respectivos cnjuges e tambm aqueles clientes que no possuem cnjuge.
SELECT CLIENTES.NOME_CLI, CONJUGES CONJUGES.NOME_CONJ FROM CLIENTES LEFT JOIN CONJUGES ON CLIENTES.COD_CLI = CONJUGES.COD_CLI COD_CLI GO
RIGHT JOIN
Ao contrrio do LEFT JOIN a clusula RIGHT JOIN retorna todos os dados JOIN, encontrados na tabela direita de JOIN. Caso no existam dados associados entre as tabelas . esquerda e direita de JOIN, sero retornados valores nulos. Aplicando o mesmo exemplo do , LEFT JOIN para o RIGHT JOIN teremos o seguinte:
SELECT CLIENTES.NOME_CLI, CONJUGES CONJUGES.NOME_CONJ FROM CLIENTES RIGHT JOIN CONJUGES ON CLIENTES.COD_CLI = CONJUGES.COD_CLI COD_CLI GO
81
Observe que foram retornados todos os dados da tabela CONJUGES com os respectivos relacionamentos. Como no existem cadastros de cnjuges sem clientes, no foi apresentado nenhum valor nulo na tabela esquerda do JOIN.
Como vimos anteriormente, podemos fazer a associao de duas ta tabelas distintas para que possamos obter dados de uma "mescla" das duas. Agora, mostraremos como associar mais de duas tabelas. Vale lembrar que esse tipo de associao no tem limite. Agora iremos retornar os dados de trs tabelas: CLIENTES, CIDADES e CONJUGES. Iremos ter como resultado o nome do cliente que possui cnjuge, junto com o nome deste, e a cidade onde moram. Vejamos:
SELECT CLI.NOME_CLI, CONJ.NOME_CONJ CID.NOME_CID FROM CLIENTES AS CLI NOME_CONJ, INNER JOIN CONJUGES AS CONJ ON CONJ.COD_CLI = CLI.COD_CLI COD_CLI INNER JOIN CIDADES AS CID ON CID.COD_CID = CLI.COD_CID GO
82
Todas as linhas de dados da tabela esquerda de JOIN e da tabela direita sero retornadas pela clusula FULL OUTER JOIN. Caso uma linha de dados no esteja associada a JOIN. qualquer linha da outra tabela, os valores das colunas da lista de seleo sero nulos. Caso contrrio, os valores obtidos sero baseados nas tabelas utilizadas como referncia. Vejamos:
SELECT CLI.NOME_CLI, CONJ.NOME_CONJ FROM CLIENTES AS CLI NOME_CONJ FULL OUTER JOIN CONJUGES AS CONJ ON CONJ.COD_CLI = CLI.COD_CLI COD_CLI GO
CROSS JOIN
Todos os dados da tabela esquerda de JOIN so cruzados com os dados da tabela direita de JOIN por meio do CROSS JOIN, tambm conhecido como produto cartesiano. JOIN, possvel cruzar informaes de duas ou mais tabelas. Para facilitar a compreenso a respeito desse tipo de associao, utilizaremos as tabelas CLIENTES e CONJUGES Vejamos: CONJUGES.
SELECT CLI.NOME_CLI, CONJ.NOME_CONJ FROM CLIENTES AS CLI NOME_CONJ CROSS JOIN CONJUGES AS CONJ ORDER BY CLI.NOME_CLI GO
83
Perceba que existem quatro funcionrios nesta listagem, mas existem cinco registros na tabela FUNCIONARIOS. Veja a tabela funcionrios: .
SELECT * FROM FUNCIONARIOS GO
Observe o salrio dos funcionrios antes de utilizarmos o comando UPDATE. Iremos aumentar em 10% todos os salrios, exceto o do registro nmero '3', 'OLAVO LINHARES', pois este funcionrio no fez nenhuma venda.
84
Agora, usaremos o comando UPDATE para realizar o aumento de salrio para esses zar funcionrios. Para isso, iremos fazer o comando de UPDATE e utilizaremos a parte do JOIN do comando de SELECT para fazer nossa restrio. Vejamos:
UPDATE FUNCIONARIOS SET SAL_FUNC = SAL_FUNC * 1.1 FROM FUNCIONARIOS AS FUNC INNER JOIN PEDIDOS AS PED ON PED.COD_FUNC = FUNC.COD_FUNC COD_FUNC GO
Observe que todos os funcionrios tiveram um aumento de 10% em seus salrios, exceto o funcionrio 'OLAVO LINHARES'. Com o comando DELETE no h muitas diferenas. Para visualizarmos um exemplo, crie uma database chamada IDIOMAS ponha-a em uso e crie as tabelas ALUNOS e CURSOS: IDIOMAS, Tabela: ALUNOS COD_ALUNO PRIMARY KEY 1 2 3 4 NOME NOT NULL JOAQUIM MANUEL MARIA MADALENA CARLITOS AMARAL JOS DA BRAGA E TINO COD_CURSO INT 1 1 3 3
Tabela: CURSOS COD_CURSO PRIMARY KEY 1 2 3 NOME NOT NULL INGLES ESPANHOL ALEMAO
85
Aps criadas as tabelas e inseridos os registros, iremos utilizar um comando de SELECT com a clusula JOIN para retornar todos os cursos que tenham alunos matriculados. Vejamos:
SELECT AL.NOME, CR.NOME FROM ALUNOS AS AL JOIN CURSOS AS CR ON CR.COD_CURSO = AL.COD_CURSO GO
Agora iremos excluir todos os alunos do curso de ingls e para esse caso usaremos a clusula restritiva WHERE. Vejamos o comando: .
DELETE ALUNOS FROM ALUNOS AS AL JOIN CURSOS AS CR ON CR.COD_CURSO = AL.COD_CURSO WHERE CR.NOME = 'INGLES' GO
Como podemos observar, em nossa aba Messages, os alunos do curso de ingls foram excludos. Utilize um SELECT para verificar a tabelas ALUNOS e confirmar a excluso.
86
Exerccios
1. Quais so as clusulas utilizadas para fazer a associao de tabelas? Resposta:
3. Que clusula gera os dados relacionados entre duas tabelas e os dados norelacionados localizados na tabela posicionada direita de JOIN? Resposta:
5. Quais comandos utilizar com o JOIN para alterar ou remover informaes de uma tabela, tendo como base os dados de uma segunda tabela e estando elas interrelacionadas? Resposta:
87
Laboratrio
Utilizando o banco de dados DB_CDS: 1. Selecione o nome dos CDs e o nome da gravadora de cada CD. Resposta:
3. Selecione o nome dos CDs, o nome das gravadoras de cada CD e o nome da categoria de cada CD. Resposta:
4. Selecione o nome dos clientes e os ttulos dos CDs vendidos em cada pedido que o cliente fez. Resposta:
5. Selecione o nome do funcionrio, nmero, data e valor dos pedidos que este funcionrio registrou, alm do nome do cliente que est fazendo o pedido. Resposta:
88
6. Selecione o nome dos funcionrios e o nome de todos os dependentes de cada funcionrio. Resposta:
7. Selecione o nome dos clientes e o nome dos cnjuges de cada cliente. Resposta:
8. Selecione o nome de todos os clientes. Se estes possuem cnjuges, mostrar os nomes de seus cnjuges tambm. Resposta:
9. Selecione nome do cliente, nome do cnjuge, nmero do pedido que cada cliente fez, valor de cada pedido que cada cliente fez e cdigo do funcionrio que atendeu a cada pedido. Resposta:
89
Captulo 9
No SQL Server, podemos consultar informaes pertencentes a mais de uma tabela e que so obtidas com a execuo de mais de um comando SELECT. Isso pode ser feito por meio . da clusula UNION ALL, que facilita a exibio de dados de tabelas distintas. , Uma consulta aninhada em uma instruo SELECT, INSERT, DELETE ou UPDATE nsulta chamada de subquery (subconsulta), ou O-QUE-NO-SE-DEVE-FAZER-NO-SQL-SERVER. O limite mximo de aninhamentos de uma subquery de 32 nveis, limite este que varia de acordo com a complexidade de outras instrues que compem a consulta e da quantidade de ade memria disponvel.
UNION ALL
A UNION ALL uma clusula responsvel por unir informaes obtidas a partir de diversos comandos de SELECT. Basicamente o UNION ALL concatena vrios SELECTs a fim de . montar um nico comando que traga os dados de vrias tabelas distintas. Para entender o UNION ALL considere a tabela CLIENTES e FUNCIONARIOS do nosso banco de dados DB_CDS. Supondo que precisamos obter o cdigo, nome, endereo, renda/salr e sexo de renda/salrio cada pessoa nessas tabelas, podemos proceder da seguinte forma:
SELECT COD_CLI, NOME_CLI, END_CLI RENDA_CLI, SEXO_CLI FROM CLIENTES END_CLI, UNION ALL SELECT COD_FUNC, NOME_FUNC, END_FUNC, SAL_FUNC, SEXO_FUNC FROM FUNCIONARIOS , GO
90
Nota: Para que a consulta possa ser realizada, fundamental que as colunas sejam do mesmo tipo.
Regras de Utilizao O nome (alias) das colunas, quando realmente necessrio, deve ser includo no primeiro SELECT. A incluso de WHERE pode ser feita em qualquer comando SELECT. possvel escrever qualquer SELECT com JOIN ou subquery, caso seja necessrio. necessrio que todos os comandos SELECT utilizados apresentem o mesmo nmero de colunas. necessrio que todas as colunas dos comandos SELECT tenham o mesmo datatype em seqncia. Por exemplo, uma vez que a segunda coluna do primeiro SELECT baseia-se no datatype decimal, preciso que as segundas colunas dos outros SELECTs tambm apresentem o mesmo tipo de datatype decimal. Para que tenhamos dados ordenados, o ltimo SELECT deve ter uma clusula ORDER BY adicionada em seu final. Devemos utilizar a clusula UNION sem ALL para exibio nica de dados repetidos em mais de uma tabela.
Subquery
As principais caractersticas das subquerys so: Pelo fato de podermos trabalhar com consultas estruturadas, as subquerys permitem que partes de um comando sejam separadas das demais. Se uma instruo permitida em um local, esse local aceita a utilizao de uma subquery. Uma subquery, pode ser includa dentro de uma outra subquery (aninhamento), identificada por estar entre parnteses, o que a diferencia da consulta principal. Quando temos uma subquery aninhada na instruo SELECT externa, ela formada por uma clusula FROM regular com um ou mais nomes de visualizao ou tabela, uma consulta SELECT regular junto dos componentes da lista de seleo regular e as clusulas opcionais WHERE, HAVING e GROUP BY. Uma consulta SELECT de uma subquery no pode ter uma clusula FOR BROWSE ou COMPUTE (veremos frente) includa. Alm disso, caso a clusula TOP seja especificada, tal consulta, que est sempre entre parnteses, pode incluir apenas uma clusula ORDER BY. As subquerys pode ser classificadas em: subqueries includas junto de um operador de comparao no modificado e que devem retornar um valor nico, subqueries que so
91
testes de existncia acrescentados com EXISTS, e subqueries que operam em listas introduzidas com IN ou que foram alteradas por um operador de comparao com ALL ou ANY. Por oferecer diversas formas de obter resultados, as subqueries eliminam a necessidade de utilizarmos as clusulas JOIN e UNION de maior complexidade. Mas isso tem um preo, a performance das subqueries so extremamente baixas. Uma subquery tambm chamada de INNER QUERY ou INNER SELECT. Chamamos de OUTER QUERY ou OUTER SELECT a instruo que possui a subquery. Alternativamente, possvel formular muitas instrues Transact-SQL com subqueries como JOINs. Uma instruo que possui uma subquery, bem como uma verso semanticamente semelhante a essa instruo mas que no possui subquery, normalmente no apresenta muitas diferenas de performance. No entanto, uma JOIN apresenta melhor desempenho nas situaes em que se precisa verificar a existncia de um dado. As colunas de uma tabela no podero ser includas na sada, ou seja, a lista de seleo da OUTER QUERY, caso essa tabela aparea apenas em uma subquery e no na OUTER QUERY.
WHERE [expressao] [NOT] IN (subquery) WHERE [expressao] [operador_comparacao] [ANY | ALL] (subquery) WHERE [NOT] EXISTS (subquery)
Exemplo de Subquery
Como vimos em um exemplo anterior, com a clusula JOIN podemos retornar todos os clientes que possuem cnjuge. Vejamos essa instruo:
SELECT CLI.NOME_CLI, CONJ.NOME_CONJ FROM CLIENTES AS CLI INNER JOIN CONJUGES AS CONJ ON CONJ.COD_CLI = CLI.COD_CLI GO
Fazendo uso de uma subquery, a nossa instruo SQL ficaria dessa forma:
SELECT CLIENTES.NOME_CLI, (SELECT NOME_CONJ FROM CONJUGES WHERE COD_CLI = CLIENTES.COD_CLI) AS [NOME_CONJ] FROM CLIENTES WHERE CLIENTES.COD_CLI IN (SELECT COD_CLI FROM CONJUGES) GO
92
Como podemos ver, as duas nos retornaram os mesmos dados. E como podemos ver, tambm, a soluo mais elegante utilizar o JOIN.
Regras de Utilizao
As subqueries devem ser utilizadas entre parnteses. Ao utilizarmos subqueries, podemos obter apenas uma coluna por subquery. Um nico valor ser retornado ao utilizarmos o sinal (=) no incio da subquery.
93
Exerccios
1. Qual o objetivo da clusula UNION ALL? Resposta:
4. Cite as regras bsicas para que as subqueries retornem o valor esperado. Resposta:
94
Captulo 10
Totalizando Dados
Veremos como a clusula GROUP BY pode ser utilizada para agrupar vrios dados, tornando mais prtica a totalizao dos mesmos. Tambm conheceremos outras clusulas que podem ser empregadas em parceria com o GROUP BY, como HAVING, WITH ROLLUP e JOIN.
GROUP BY
Com a clusula GROUP BY possvel agrupar diversos registros com base em uma ou mais colunas. Por exemplo, na nossa database DB_CDS, mais de um ttulo produzido por uma gravadora, caso seja necessrio saber qual a quantidade de ttulos que essa gravadora produziu, podemos usar o GROUP BY em associao com o JOIN para obtermos esses dados. importante lembrar que o GROUP BY freqentemente utilizado em conjunto com as funes: SUM(): Funo que permite a soma dos registros. COUNT(): Permite a contagem de registros. MAX(): Retorna o maior valor de um conjunto de valores. MIN(): Retorna o menor valor de um conjunto de valores. AVG(): Calcula a mdia dos valores de um conjunto.
Nas situaes em que se especfica a clusula GROUP BY, deve ocorrer uma das seguintes situaes: a expresso GROUP BY deve ser correspondente expresso da lista de seleo ou cada uma das colunas presentes em uma expresso no-agregada na lista de seleo deve ser adicionada lista de GROUP BY. Quando utilizamos o GROUP BY, nos retornado grupos em ordem aleatria, nesse caso podemos utilizar a clusula ORDER BY em conjunto para orden-los. A sintaxe bsica da clusula GROUP BY a seguinte: [comando] [ GROUP BY [ ALL ] expressao_group_by [ ,...n] [ WITH { CUBE | ROLLUP } ] ] Em que: ALL: Trata-se do argumento que determina a incluso de todos os grupos e conjuntos de resultados. Vale destacar que valores nulos so retornados s colunas resultantes dos grupos que no correspondem aos critrios de busca quando o argumento ALL especificado.
95
expressao_group_by: expressao_group_by: Tambm conhecida como coluna agrupada, trata trata-se de uma expresso na qual o argumento realizado. Ela pode ser especificada como uma coluna ou como uma expresso no agregada que faz referncia c no-agregada coluna que a clusula FROM retornou, mas no possvel especific com uma alias especific-la de coluna determinado na lista de seleo. Alm disso, no podemos utilizar a expressao_group_by as colunas dos seguintes tipos: IMAGE TEXT e NTEXT. IMAGE,
Nota: importante considerar que as queries que acessam tabelas remotas : no so capazes de suportar a clusula GROUP BY ALL caso essas queries tambm possam uma clusula WHERE. Devemos ter em mente, ainda, que o . argumento ALL no pode ser utilizado em conjunto com os operadores CUBE conjunto e ROLLUP. A quantidade de itens da expressao_group_by limitada de . acordo com o tamanho apresentado pelas colunas GROUP BY com as BY, colunas agregadas e com os valores referentes query nas situaes em que a clusula GROUP BY no possuem os operadores CUBE e ROLLUP Nas ROLLUP. situaes em que tais operadores so especificados, so permitidas at 10 expresses de agrupamento. Para compreender, vejamos o exemplo citado acima:
SELECT GRAV.NOME_GRAV, COUNT COUNT(*) AS [QTD_TITULOS] FROM TITULOS AS TIT INNER JOIN GRAVADORAS AS GRAV ON GRAV.COD_GRAV = TIT.COD_GRAV COD_GRAV GROUP BY GRAV.NOME_GRAV ORDER BY GRAV.NOME_GRAV NOME_GRAV GO
A clusula HAVING determina uma condio de busca para um grupo ou um conjunto de registros, definindo critrios para limitar os resultados obtidos a partir do agrupamento de registros. importante lembrar que essa clusula s pode ser utilizada em parceria com GROUP BY.
restringe os resultados obtidos aps a aplicao da clusula FROM ao passo FROM, que a clusula HAVING filtra o retorno do agrupamento. Como exemplo, iremos agrupar todos os ttulos de CDs que venderam mais de 100.00:
SELECT TIT.NOME_CD, SUM(TP. .VAL_CD) AS [VALOR] FROM TITULOS_PEDIDO AS TP INNER JOIN TITULOS AS TIT ON TIT.COD_TIT = TP.COD_TIT GROUP BY TIT.NOME_CD HAVING SUM(TP.VAL_CD) > 100.00 NOME_CD GO
Esta clusula determina que, alm das linhas normalmente oferecidas por GROUP BY, tambm sejam obtidas como resultado as linhas de sumrio. O sumrio dos grupos feito em uma ordem hierrquica, a partir do nvel mais baixo at o mais alto. A ordem que define a hierarquia do grupo determinada pela ordem na qual so definidas as colunas agrupadas. Caso esta ordem seja alterada, a quantidade de linhas produzidas pode ser afetada. Utilizada em parceria com a clusula GROUP BY, a clusula WITH ROLLUP , acrescentar uma linha na qual so exibidos os subtotais e totais dos registros j distribudos scentar em colunas agrupadas. Dessa forma, possvel analisar diversas informaes em uma s coluna, por exemplo, a gravadora que possui a menor quantidade de ttulos em e estoque. Vejamos:
SELECT GRAV.NOME_GRAV, TIT.NOME_CD, TIT.QTD_ESTQ QTD_ESTQ, SUM(TIT.QTD_ESTQ) AS [TOTAL_ESTQ] FROM TITULOS AS TIT INNER JOIN GRAVADORAS AS GRAV ON GRAV.COD_GRAV = TIT.COD_GRAV COD_GRAV GROUP BY GRAV.NOME_GRAV TIT.NOME_CD, TIT.QTD_ESTQ WITH ROLLUP NOME_GRAV, GO
97
A clusula CUBE tem a finalidade de determinar que as linhas de sumrio sejam inseridas no conjunto de resultados. A linha de sumrio retornada para cada combinao possvel e de subgrupos no conjunto de resultados. Visto que a clusula CUBE responsvel por retornar todas as combinaes possveis de grupos e subgrupos, a quantidade de linhas no est relacionada ordem em que so determinadas as colunas de agrupamento, sendo, portanto, mantida a quantidade de linhas j apresentadas. A quantidade de linhas de sumrio no conjunto de resultados especificada de acordo com a quantidade de colunas includas na clusula GROUP BY. Cada uma dessas colunas . vinculada sob o valor NULL do agrupamento, o qual aplicado a todas as outras coluna colunas. A clusula WITH CUBE, em conjunto GROUP BY, gera toais e subtotais, apresentando , , vrios agrupamentos de acordo com as colunas definidas com o GROUP BY Vejamos o BY. mesmo exemplo anterior, s que com WITH CUBE:
98
SELECT GRAV.NOME_GRAV, TIT.NOME_CD, TIT.QTD_ESTQ QTD_ESTQ, SUM(TIT.QTD_ESTQ) AS [TOTAL_ESTQ] FROM TITULOS AS TIT INNER JOIN GRAVADORAS AS GRAV ON GRAV.COD_GRAV = TIT.COD_GRAV COD_GRAV GROUP BY GRAV.NOME_GRAV TIT.NOME_CD, TIT.QTD_ESTQ WITH CUBE NOME_GRAV, GO
Observe que o retorno de linhas superior ao exemplo anterior, pois nas linhas abaixo, a clusula WITH CUBE fez todas as combinaes possveis com os dados passados.
99
Exerccios
1. Qual o objetivo da clusula GROUP BY? Resposta:
3. Qual a clusula que, utilizada em parceria com a clusula GROUP BY, acrescenta uma linha na qual so exibidos os subtotais e totais dos registros j distribudos em colunas agrupadas? Resposta:
100
Laboratrio
Para realizar esse laboratrio, utilize o banco de dados DB_CDS. 1. Exiba quantos pedidos cada cliente fez. Resposta:
6. Exiba quantos pedidos cada cliente fez, mostrando o nome dos clientes. Resposta:
101
7. Exiba quantos CDs possui cada categoria, mostrando o nome das mesmas. Resposta:
8. Exiba quantos CDs possui cada gravadora, mostrando o nome das mesmas. Resposta:
9. Exiba quantos pedidos cada funcionrio atendeu, mostrando o nome dos funcionrios. Resposta:
10. Exiba quantos dependentes cada funcionrio possui, mostrando seus nomes. Resposta:
102
Captulo 11
A partir deste captulo, iremos mais afundo nos aspectos tcnicos do SQL Server 2005 e veremos a complementao de comandos vistos anteriormente.
103
Um arquivo do SQL Server formado por dois nomes: um nome fsico e outro lgico. O nome fsico utilizado para se referir ao arquivo fsico no disco, enquanto o nome lgico o nome utilizado para nos referirmos aos arquivos fsicos em todas as instrues do TransactSQL.
que no foram atribudos a outros FILEGROUPs e aloca as pginas das tabelas do sistema. Vale ressaltar que possvel alterar o FILEGROUP padro, porm a alocao de tabelas e objetos de sistema mantida no FILEGROUP primrio. J os FILEGROUPs definidos pelo usurio tem como objetivo armazenar os dados, para fins administrativos, de posicionamento ou performance de dados.
Pelo fato de os espaos de log e de dados serem controlados separadamente, os arquivos de log nunca ocupam um FILEGROUP. Mais de um database no pode utilizar um mesmo arquivo ou FILEGROUP. Nunca pode haver, simultaneamente, mais de um FILEGROUP como padro. Um arquivo no pode ser membro de mais de um FILEGROUP.
Recomendaes de Uso
Tamanho dos Arquivos
Ao definirmos um arquivo no SQL Server, podemos especificar um incremento para o seu crescimento. Isso porque os arquivos do SQL Server possuem a capacidade de aumentar seu tamanho, de forma automtica. O arquivo aumentar de tamanho de acordo com o incremento especificado e toda vez que seu espao for preenchido. Mas possvel especificar o tamanho do crescimento.
Mltiplos Arquivos
Armazenamento de tabelas e objetos do sistema no PRIMARY DATA FILE. Armazenamento de objetos criados pelo usurio no SECONDARY DATA FILE.
Tabelas
Grandes dados de objetos, assim como tabelas e ndices, podem ser associados a um FILEGROUP especfico. Essas tabelas e ndices podem ser particionados. Quando isso feito, os dados so separados em unidades, sendo que cada uma das unidades pode ser colocada em um FILEGROUP distinto, no database.
105
Para obter uma performance melhor, recomenda-se separar em FILEGROUPs distintos as diferentes tabelas utilizadas nas mesmas consultas JOIN, para se obter um acesso paralelo aos dados. Tambm aconselhvel separar em FILEGROUPs distintos as tabelas de maior acesso e os ndices NONCLUSTERED pertencentes a essas tabelas. Com os arquivos localizados em discos diferentes, temos um acesso I/O paralelo, o que melhora em muito a performance do sistema.
recomendvel manter em discos rgidos separados os arquivos de log dos outros arquivos de dados. Podemos tambm manter tabelas especficas, muito pouco utilizadas, em arquivos de FILEGROUPs distintos e posicionar cada um desses FILEGROUPs em discos distintos. Dessa forma as operaes de I/O de tabelas especficas ficam de forma paralela.
FILEGROUP FG_02 ( NAME = 'CAP_11_DADOS_5', FILENAME = 'G:\CAP_11_DADOS_5.NDF', SIZE = 10MB, MAXSIZE = 1000MB, FILEGROWTH = 20% ) LOG ON ( NAME = 'CAP_11_LOG_1', FILENAME = 'H:\CAP_11_LOG_1.LDF', SIZE = 50MB, MAXSIZE = 250MB, FILEGROWTH = 50MB ), ( NAME = 'CAP_11_LOG_2', FILENAME = 'I:\CAP_11_LOG_2.LDF', SIZE = 50MB, MAXSIZE = 250MB, FILEGROWTH = 50MB ) GO
107
Transaction Log
O Transaction Log, ou log de transaes, definido como um registro seria de todas as alteraes sofridas pelo database. O log de transaes mantido no arquivo de log (LOG DATA FILE) do database.
O procedimento a seguir demonstra o que acontece no Transaction Log no momento em que uma transao iniciada: 1. A aplicao envia uma transao de dados 2. No momento em que a transao executada, as pginas de dados afetadas so carregadas do disco para o DATA CACHE (memria). Caso uma query anterior j tenha carregado essas pginas no DATA CACHE, o carregamento no ir ocorrer. 3. O WRITE-AHEAD LOG registra as alteraes antes delas serem encaminhadas para o database. 4. Por um processe denominada CHECKPOINT, as alteraes registradas no Transaction Log so escritas nas tabelas correspondentes, no database. Caso exista algum problema no meio de uma transao, quando o SQL Server iniciado novamente, ele procura pelo Transaction Log as transaes no finalizadas (transaes no marcadas com o CHECKPOINT). Esse processo denominado RECOVERY. Para que seja possvel identificar uma transao, necessrio informar o SQL Server. Para tal, usamos as instrues BEGIN TRANSACTION, para marcar o incio da transao e COMMIT TRANSACTION para finalizar a transao com sucesso. Caso seja necessrio abortar a transao, usamos o comando ROLLBACK TRANSACTION.
108
Exerccios
1. Que significa nome fsico e nome lgico de um arquivo? Resposta:
109
5. Quais das alternativas a seguir so caractersticas dos FILEGROUPs? a. Melhorar o gerenciamento e a localizao de tabelas e objetos. b. Podemos ter simultaneamente mais de um FILEGROUP como padro. c. Um database possui pelo menos um FILEGROUP, trata-se do FILEGROUP primrio. Outros FILEGROUPs adicionais podem ser criados pelo usurio para atender a necessidades especficas, como alocao e administrao de dados. d. Um arquivo pode ser membro de mais de um FILEGROUP. e. Podemos fazer cpias de segurana de arquivos e grupos de arquivos especficos sem precisar fazer o backup de todo o database.
6. Qual das alternativas a seguir uma afirmativa correta com relao s regras atribudas aos files e FILEGROUPs? a. Pelo fato de os espaos de log e de dados serem controlados juntos, os arquivos de log sempre ocupam um FILEGROUP. b. Podemos ter simultaneamente mais de um FILEGROUP como padro. c. Um arquivo no pode ser membro de mais de um FILEGROUP d. Dois ou mais databases no podem utilizar o mesmo arquivo, porm, podem utilizar o mesmo FILEGROUP. e. Todas as alternativas anteriores esto erradas.
7. Qual das alternativas a seguir correta com relao aos arquivos fsicos gerados pelo SQL Server? a. Ao definirmos um arquivo no SQL Server 2005, no podemos especificar um incremento para o crescimento de um arquivo. b. O arquivo poder aumentar de tamanho de acordo com o incremento especificado pelo administrador do banco de dados. c. Um banco de dados criado pelo SQL Server deve obrigatoriamente ter como nome fsico o mesmo nome atribudo ao nome lgico. d. aconselhvel manter em um mesmo FILEGROUP tabelas que so muito acessadas. e. Para que os arquivos aumentem automaticamente o seu tamanho, no necessrio que eles sejam totalmente preenchidos.
110
8. Qual a definio de Transaction Log? a. O Transaction Log ou log de transaes, definido como um local no qual registrada a localizao de todos os arquivos no database b. O Transaction Log um arquivo que guarda somente as tabelas de um database. c. O Transaction Log, ou log de transaes, definido como um registro serial de todas as alteraes que o database sofreu. O log de transaes mantido no arquivo de log de transaes do database. d. O Transaction Log uma tabela que guarda informaes sobre erros ocorridos em transaes. e. Transaction Log um TRIGGER que dispara quando ocorre erro nas transaes correntes.
9. Qual o procedimento correto de registro no Transaction Log? A. i. ii. A aplicao envia uma transao de dados No momento em que a transao executada, as pginas de dados afetadas so carregadas do disco para o DATA CACHE (memria). Caso uma query anterior j tenha carregado essas pginas no DATA CACHE, o carregamento no ocorrer. Ocorre o WRITE-AHEAD LOG Ocorre o CHECKPOINT
A aplicao envia uma transao de dados No momento em que a transao executada, as tabelas afetadas so carregadas do disco para o Transaction Log. Caso uma query anterior j tenha carregado essas pginas no DATA CACHE, o carregamento no ocorrer. Ocorre o WRITE-AHEAD LOG Ocorre o CHECKPOINT
iii. iv.
A aplicao envia uma transao de dados No momento em que a transao executada, as pginas de dados afetadas so carregadas do disco para o DATA CACHE (memria). Caso uma query anterior j tenha carregado essas pginas no DATA CACHE, o carregamento no ocorrer. Ocorre o CHECKPOINT Ocorre o WRITE-AHEAD LOG
111
D. i. ii. A aplicao envia uma transao de dados No momento em que a transao executada, as pginas de dados afetadas so carregadas do disco para o DATA CACHE (memria). Caso uma query anterior j tenha carregado essas pginas no DATA CACHE, o carregamento no ocorrer. Ocorre o RECOVERY Ocorre o WRITE-AHEAD LOG
iii. iv.
A aplicao envia uma transao de dados No momento em que a transao executada, as pginas de dados afetadas so carregadas do disco para o DATA CACHE (memria). Caso uma query anterior j tenha carregado essas pginas no DATA CACHE, o carregamento no ocorrer. Ocorre o WRITE-AHEAD LOG Ocorre o RECOVERY
112
Laboratrio
1. Crie um database chamado CARROS com quatro arquivos: um para os dados no FILEGROUP primrio, outro arquivo de dados em um FILEGROUP chamado FG_CARROS_1 e outros dois para o log. Os valores de SIZE, MAXSIZE e FILEGROWTH dos arquivos devem ser 6Mb, 12Mb e 2Mb respectivamente. Resposta:
113
Captulo 12
Integridade e Consistncia - Parte 2 UDDT (User-Defined Datatypes)
O usurio pode definir seus prprios datatypes com base nos tipos de dados fornecidos pelo SQL Server. Conhecidos como UDDTs, o tipo de dado definido pelo usurio tambm pode ser considerado sinnimo de um tipo j disponvel. Para trabalharmos com os UDDTs devemos empregar o uso de duas STORED PROCEDURES. SP_ADDTYPE: responsvel pela criao do tipo de dado. Sendo que contm os seguintes parmetros: @TYPENAME: define o nome do datatype. @PHYTYPE: define o tipo de dado do UDDT. @NULLTYPE: define a aceitao de valores nulos pelo UDDT. SP_DROPTYPE: responsvel pela remoo do UDDT. O nico parmetro que devemos informar @TYPENAME, para que o SQL Server identifique o tipo de dado a ser removido. Observe a utilizao desse mtodo de UDDT no script abaixo:
EXEC SP_ADDTYPE 'MOEDA', 'DECIMAL(9,2)', 'NULL' GO CREATE TABLE BANCO ( COD_CONTA INT, NOME_CORRENTISTA VARCHAR(50), SALDO MOEDA ) GO
Para que possamos descart-la, necessrio que nenhuma tabela esteja usando esse UDDT. Caso contrrio impossvel.
114
PRIMARY KEY
Para que uma linha seja identificada como nica dentro de uma tabela, devemos garantir a integridade de entidades por meio da constraint PRIMARY KEY. Assim que essa constraint definida no momento da criao ou da alterao de uma tabela, podemos definir tambm a chave primria. importante lembrar que cada tabela pode apresentar apenas uma constraint deste tipo. Uma vez definida como chave primria, uma coluna no deve aceitar valores nulos. Caso essa constraint seja atribuda para mais de uma coluna, a combinao de valores dessas duas colunas dever ser nica.
115
DEFAULT
As colunas que fazem parte de um registro de dados devem conter valores independentes se eles so nulos ou no. Porm, nem sempre recomendvel trabalhar com colunas que aceitam esses valores. Nesse caso, precisamos definir valores padres que preencheram essa coluna. Como vimos anteriormente, no captulo 7, podemos adicionar um valor padro no momento de criao de uma tabela, mas tambm possvel criar um objeto DEFAULT para ser utilizado nas tabelas. Vejamos:
CREATE DEFAULT DF_AUTOR AS 'DESCONHECIDO' GO
O procedimento acima cria um objeto chamado AUTOR como um objeto DEFAULT. Depois de criado, necessrio lig-lo a uma coluna que o utilize. Para efeito de exemplo, temos uma tabela chamada AUTORES e nessa tabela existe a coluna NOME_AUTOR que no tem um valor padro. Portanto, utilizaremos o objeto DEFAULT DF_AUTOR, que acabamos de criar, como DEFAULT dessa coluna. Para isso, fazemos uso da stored procedure SP_BINDEFAULT. Essa stored procedure recebe dois parmetros: @DEFNAME: Nome dado ao DEFAULT criado. @OBJNAME: Coluna da tabela que receber os valores padres. Vejamos a utilizao da SP_BINDEFAULT:
EXEC SP_BINDEFAULT DF_AUTOR, 'AUTORES.NOME_AUTOR' GO
A diferena entre essa utilizao e a utilizao no momento da criao da tabela, que o objeto criado por esse mtodo fica disponvel para o uso em qualquer outra tabela no database em que ele foi criado. Caso queiramos remover o DEFAULT de uma coluna, usamos a stored procedure SP_UNBINDEFAULT, com o parmetro @OBJNAME. Vejamos:
EXEC SP_UNBINDEFAULT 'AUTORES.NOME_AUTOR' GO
RULEs
Similares a constraint CHECK, os RULEs no fazem parte da estrutura da tabela. Primeiramente, preciso cri-los para que depois estes objetos sejam ligados coluna de uma tabela. O objeto RULE deve ser associado a uma coluna ou a um UDDT.
116
Ao Em Cadeia
A ao em cadeia abrange a utilizao de dois comandos diferentes: ON DELETE CASCADE e ON UPDATE CASCADE. Para compreend-los, utilizaremos o exemplo de duas tabelas: tabela PAIS e tabela FILHOS. Como j podemos imaginar, o tipo de relacionamento dessas duas tabelas ser 1 : N, ou seja, um-para-muitos, j que um pai pode ter vrios filhos, mas o contrrio no possvel. Vejamos:
CREATE TABLE PAIS ( COD_PAI INT NOT NULL, NOME_PAI VARCHAR(30) NOT NULL, CONSTRAINT PK_PAIS_COD_PAI PRIMARY KEY (COD_PAI) ) GO CREATE TABLE FILHOS ( COD_FILHO INT NOT NULL, COD_PAI INT NOT NULL, NOME_FILHO VARCHAR(30) NOT NULL, CONSTRAINT PK_FILHOS_COD_FILHO PRIMARY KEY (COD_FILHO), CONSTRAINT FK_FILHOS_COD_PAI FOREIGN KEY (COD_PAI) REFERENCES PAIS(COD_PAI) ON DELETE CASCADE ) GO INSERT INTO PAIS VALUES (1,'JOSE MACHADO') INSERT INTO PAIS VALUES (2,'CARLOS SERROTE') INSERT INTO PAIS VALUES (3,'ASTROBALDO MARTELO') GO INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO FILHOS FILHOS FILHOS FILHOS FILHOS VALUES VALUES VALUES VALUES VALUES (1,1,'JOSIAS MACHADO') (2,1,'CARLITA MACHADO') (3,1,'FERROLHO MACHADO') (4,1,'JOSE MACHADO JUNIOR') (5,2,'CARLITOS SERROTE') 117
INSERT INTO FILHOS VALUES (6,2,'CAROLINA SERROTE') INSERT INTO FILHOS VALUES (7,3,'GUMERCINA MARTELO') GO
Como as tabelas PAIS e FILHOS esto relacionadas, caso faamos a excluso de um registro na tabela PAIS, os registros da tabela FILHOS correspondentes tambm sero excludos em cascata. Faa o teste: Exiba o nome do pai com os respectivos filhos, aps, exclua o registro nmero '1' da tabela PAIS e exiba novamente todos os pais com os respectivos filhos e veja o que foi alterado. Com o comando ON UPDATE CASCADE a idia a mesma, s que nesse caso, os registros sero atualizados em cascata.
118
possvel a incluso de constraints do tipo FOREIGN KEY / REFERENCES e CHECK em colunas que j apresentam dados inconsistentes. Para isso usamos o comando ALTER TABLE da seguinte forma: Para a constraint FOREIGN KEY / REFERENCES: ALTER TABLE [nome_tabela] WITH NOCHECK ADD CONSTRAINT [nome_constraint] FOREIGN KEY [nome_coluna] REFERENCES [nome_tabela]([nome_coluna]) Para a constraint CHECK: ALTER TABLE [nome_tabela] WITH NOCHECK ADD CONSTRAINT [nome_constraint] CHECK ([nome_coluna][operador_comparacao][valor])
119
IDENTITY
IDENTITY uma propriedade que permite a criao de nmeros a partir de um nmero inteiro. Trata-se, portanto, de um contador automtico capaz de gerar nmeros ao longo de uma coluna. Para que IDENTITY seja utilizado, devemos atribuir uma origem, tambm chamado de SEED ou semente, e um incremento ou INCREMENT. Qualquer nmero inteiro por ser definido para representar a semente ou o incremento. Vejamos um exemplo:
CREATE TABLE CARROS ( CODIGO INT IDENTITY(1,1) NOT NULL, MARCA VARCHAR(20), MODELO VARCHAR(20), CONSTRAINT PK_CARROS_CODIGO PRIMARY KEY (CODIGO) ) GO
Podemos adicionar uma coluna IDENTITY a uma tabela j criada da seguinte forma: ALTER TABLE [nome_tabela] ADD [nome_coluna] [datatype] IDENTITY Apesar de este mtodo poder inserir uma coluna IDENTITY, ele no modifica a propriedade de uma coluna em especfico.
SET IDENTITY_INSERT
A propriedade SET IDENTITY_INSERT pode ser definida como ON apenas para uma tabela que possua uma coluna IDENTITY de um database. Caso essa propriedade j esteja configurada como ON em uma tabela e o comando SET IDENTITY_INSERT ON esteja relacionado outra tabela uma mensagem de erro ser retornada pelo SQL Server. Sintaxe: SET IDENTITY_INSERT [nome_tabela] { ON | OFF }
120
DBCC CHECKIDENT DBCC CHECKIDENT ('[nome_tabela]') IDENTITYCOL IDENT_CURRENT IDENT_INCR IDENT_SEED @@IDENTITY SCOPE_IDENTITY SELECT IDENTITYCOL FROM [nome_tabela] SELECT IDENT_CURRENT('[nome_tabela]') SELECT IDENT_INCR('[nome_tabela]') SELECT IDENT_SEED('[nome_tabela]') SELECT @@IDENTITY SELECT SCOPE_IDENTITY() AS [alias]
DBCC CHECKIDENT
O valor corrente do IDENTITY da tabela corrigido caso necessrio. A sintaxe completa de utilizao a seguinte: DBCC CHECKIDENT ('[nome_tabela]', { NORESEED | RESEED }, [novo_valor_reseed]) [WITH NO_INFOMSGS] Caso o parmetro RESEED seja informado, isso determinar que ser preciso reinicializar o valor do IDENTITY. J o parmetro NORESEED informa que no ser preciso reinicializar o valor do IDENTITY.
IDENTITYCOL
IDENT_CURRENT
121
IDENTITY_INCR
IDENTITY_SEED
@@IDENTITY
SCOPE_IDENTITY
Retorna o valor mais recente atribudo a uma coluna IDENTITY. Esta coluna pode pertencer a qualquer tabela que faa parte de um escopo de uma PROCEDURE ou qualquer TRIGGER.
122
Exerccios
1. Que User Defined Datatype? Resposta:
5. Quanto integridade e consistncia de dados incorreto afirmar: a. NULL (o mesmo que nulo) determina que uma coluna no dever receber valor algum, enquanto NOT NULL (no nulo) indica que uma coluna dever sempre receber um valor no momento em que uma linha acrescentada. b. A integridade de entidade determinada pelas chaves estrangeiras, enquanto a integridade referencial definida pelas chaves primrias. c. Para preservar tanto a integridade como a consistncia dos dados no SQL Server, podemos utilizar objetos criados justamente para esta finalidade: so as chamadas constraints. d. Outros objetos, como TRIGGERs, RULEs e default tambm podem ser utilizados, porm, as constraints podem ser definidas no momento em que a tabela criada. e. Quando limitamos os valores de uma tabela estamos restringindo os dados que sero inseridos. Por exemplo, uma coluna com dados sobre Sexo s deve aceitar valores como F e M. Para que esta limitao seja definida, devemos implementar a integridade de domnio.
123
6. Qual das alternativas a seguir possui Built-in Datatypes baseados em caracters? a. char, nchar, bigint b. varchar, char, bit c. ntext, char, nvarchar d. varchar, char, text e. bit, int, text
7. Que alternativa apresenta as diferentes constraints que podem ser utilizadas no SQL Server para otimizar a integridade dos dados encontrados nas colunas de uma tabela? a. PRIMARY KEY, FOREIGN KEY/REFERENCES, UNIQUE, CHECK E DEFAULT b. IDENTITY, UNIQUE, CHECK, ON DELETE CASCADE, DEFAULT c. PRIMARY KEY, IDENTITY, DEFAULT, FOREIGN KEY/REFERENCES, CHECK d. ON DELETE CASCADE, PRIMARY KEY, FOREIGN KEY/REFERENCES, CHECK e. CHECK, REFERENCES, IDENTITY, PRIMARY KEY, UNIQUE
8. Que alternativa contm o comando que exibe o valor mais recente que foi definido para uma coluna Identity pelo SQL Server? a. IDENTITY_SEED b. IDENTITYCOL c. SCOPE_IDENTITY d. SET IDENTITY_INSERT_ON e. IDENT_INCR
9. Que alternativa apresenta as palavras que devem ser inseridas nos espaos em branco da afirmativa a seguir? Derivados dos system datatypes, os _________ so voltados especificamente para o banco de dados no qual esses esto sendo criados. Portanto, no possvel utiliz-los em outros bancos de dados. A exceo fica por conta dos ___________ criados no database ____________, pois os databases subsequentes tambm possuiro esses datatypes. a. Rules / UDDTs / TempDB b. Defaults / Rules / TempDB c. User Definided Datatypes / Defautls / Master d. User Definided Datatypes / UDDTs / Model e. Rules / Defaults / Model
124
Laboratrio
No database MINHA_DB, crie os seguintes UDDTs:
Nulabilidade NOT NULL NOT NULL NOT NULL NULL NULL NOT NULL
Resposta:
125
Captulo 13
O Que Uma Views?
Definimos uma VIEW como sendo uma tabela virtual composta por linhas e colunas de dados, os quais so provenientes de tabelas referenciadas em uma query que define a VIEW. Essas linhas e colunas so geradas de forma dinmica no momento em que feita uma referncia a uma VIEW. A query que determina a VIEW pode ser proveniente de uma ou mais tabelas ou de outras VIEWs. Para determinar uma VIEW que utiliza dados provenientes de fontes distintas, podemos utilizar as queries distribudas. Ao criarmos uma VIEW, podemos filtrar o contedo de uma tabela a ser exibido, visto que ela um filtro de tabelas que pode auxiliar no agrupamento de dados das tabelas, protegendo certas colunas e simplificando o cdigo de uma programao. Mesmo que o SQL Server seja desligado, depois de criada, a VIEW no deixa de existir no sistema. Embora sejam internamente compostas por SELECTs, as VIEWs no ocupam espao no banco de dados.
126
Tabela: CARGOS COD_CARGO (INT IDENTITY) NOME_CARGO (VARCHAR(15)) 1 2 3 4 FAXINEIRO ESTAGIARIO GERENTE PRESIDENTE
Iremos criar uma VIEW que nos retornar o nome do funcionrio e o cargo ocupado por este. Criando nossa VIEW, essa fica da seguinte forma:
CREATE VIEW V_NOME_FUNC_CARGO AS SELECT F.NOME, C.NOME_CARGO FROM FUNCIONARIOS AS F INNER JOIN CARGOS AS C ON F.COD_CARGO = C.COD_CARGO GO
Depois de criada, para execut-la procedemos da mesma forma que procederamos caso existisse uma tabela com o nome do funcionrio e o cargo ocupado por este. Vejamos:
SELECT * FROM V_NOME_FUNC_CARGO GO
127
WITH ENCRYPTION
A clusula WITH ENCRYPTION permite realizar a criptografia das entradas da tabela SYSCOMMENTS (ver Apndice) que contenham o texto do comando CREATE VIEW. Ao utilizarmos esta clusula, a VIEW no pode ser publicada como parte da replicao do SQL Server. Quando uma VIEW, STORED PROCEDURE ou TRIGGER criptografado, o usurio deixa de ter acesso ao cdigo que as gerou. A sintaxe a seguir, mostra a utilizao da clusula WITH ENCRYPTION, vejamos: CREATE VIEW [nome_view] WITH ENCRYPTION AS [comando] No caso do nosso exemplo anterior, esse ficaria desta forma:
CREATE VIEW V_NOME_FUNC_CARGO WITH ENCRYPTION AS SELECT F.NOME, C.NOME_CARGO FROM FUNCIONARIOS AS F INNER JOIN CARGOS AS C ON F.COD_CARGO = C.COD_CARGO GO
Caso o usurio tente inserir, por meio da VIEW um produto com o valor superior a 400,00, o SQL Server ir permitir, pois no h nenhum tipo de checagem com relao ao valor do produto. Mas caso usssemos a clusula WITH CHECK OPTION, isso impediria o usurio de, por meio da VIEW, incluir um produto com o valor superior a 400,00. Vejamos:
CREATE VIEW V_PRODUTOS_VALOR400_WCO AS SELECT * FROM PRODUTOS WHERE VALOR <= 400 WITH CHECK OPTION GO
Agora tentaremos incluir um produto com o valor acima de 400,00 por meio da VIEW. Vejamos:
INSERT INTO V_PRODUTOS_VALOR400_WCO VALUES (11,'GABINETE','INFORMATICA',100,500) GO 128
VIEWs Indexadas
As VIEWs indexadas otimizam o desempenho. Os ndices criados sobre VIEWs ocupam um certo espao em disco, visto que eles tm a finalidade de armazenar os dados no banco de dados.
A criao de ndices sobre uma VIEW uma tarefa que requer a obse observao de algumas regras. Vejamos: A VIEW dever ser criada com a clusula WITH SCHEMABINDING. A VIEW sobre a qual o ndice ser criado no poder fazer referncia a outra VIEW.
129
O primeiro ndice a ser criado sobre uma VIEW deve ser do tipo CLUSTERED e UNIQUE. Os nomes de tabelas e funes que se encontram dentro de uma VIEW devem ser formados por duas partes.
130
Exerccios
1. O que uma VIEW? Resposta:
4. Qual comando podemos utilizar para alterar uma VIEW sem excluir as permisses j atribudas a ela? Resposta:
131
Captulo 14
Programando Com Transact-SQL
A programao por meio da linguagem Transact-SQL envolve a criao de variveis, a utilizao de elementos de controle de fluxo, como os comandos IF e WHILE, e a utilizao de STORED PROCEDUREs.
Variveis de Usurio
Uma varivel local do Transact-SQL um objeto nos scripts e batches que mantm um valor de dado. Por meio do comando DECLARE, podemos criar variveis locais, sendo isto feito no corpo de um procedimento ou batch. Vejamos alguns exemplos de declarao de variveis: DECLARE @VAR1 INT DECLARE @VAR2 CHAR(10) ou DECLARE @VAR1 INT, @VAR2 CHAR(10) Como podemos observar, todo nome de varivel precedido do caractere '@' (arroba). A sintaxe bsica de declarao a seguinte: DECLARE @[nome_variavel] [datatype]
132
Controle de Fluxo
O SQL Server trabalha com elementos de linguagem denominados "elementos de controle de fluxo", cuja funo possibilitar a criao de programas de grande utilidade para o sistema. Os elementos de controle de fluxo so: BEGIN / END: Tm a finalidade de iniciar e finalizar, respectivamente, um bloco de comandos.
IF / ELSE: Estrutura de deciso. A sintaxe bsica : IF [expressao_booleana] { comando_sql | bloco_comando } [ ELSE { comando_sql | bloco_comando } ] Caso o bloco de comando tenha mais de duas linhas, necessrio o uso de BEGIN / END. Similar a linguagem PASCAL e DELPHI, com exceo da no utilizao do ';' ou '.' no final do END .
CASE / WHEN / THEN / END: O elemento CASE utilizado para conferir uma lista de condies e, ento, retornar uma entre as vrias expresses de resultados possveis. especialmente til quando queremos evitar IFs aninhados. Sintaxe bsica: SELECT CASE [nome_coluna] WHEN [valor1] THEN [novo_valor1] ... WHEN [valorN] THEN [novo_valorN] ELSE [novo_valor] END FROM [nome_tabela] Um exemplo prtico o caso em que desejamos exibir o sexo, por extenso, dos funcionrios da nossa loja de CDs. Usando o database DB_CDS, procederemos da seguinte forma:
133
SELECT COD_FUNC, NOME_FUNC, END_FUNC, SAL_FUNC, 'SEXO_FUNC' = CASE SEXO_FUNC WHEN 'F' THEN 'FEMININO' WHEN 'M' THEN 'MASCULINO' END FROM FUNCIONARIOS GO
WHILE: Este comando faz com que o comando SQL ou bloco de comando seja executado repetidamente ou at o momento em quem uma condio verdadeira. Vejamos a sintaxe: WHILE [condicao_booleana] BEGIN [comando1] ... [comandoN] END
Nota: Por meio dos comandos BREAK e CONTINUE, possvel controlar, de dentro da estrutura de loop, a execuo do comando WHILE.
TRY ... CATCH: Esses comandos so utilizados para tratar e controlar erros em grupos de comandos do SQL Server. Vejamos a sintaxe: BEGIN TRY { comando_sql | bloco_comando } END TRY BEGIN CATCH { comando_sql | bloco_comando } END CATCH [ ; ]
134
A seguir, destacamos algumas consideraes relacionadas aos comandos TRY e CATCH: Qualquer erro de execuo com o valor de severidade superior a 10 e que no finaliza a conexo com o banco de dados capturada por TRY / CATCH. Qualquer comando entre os comandos END TRY e BEGIN CATCH ir provocar um erro de sintaxe. Portanto imprescindvel que o bloco TRY seja imediatamente seguido por um bloco CATCH associado. Uma das limitaes dos comandos TRY / CATCH no poder transpor muitos blocos de comandos do Transact-SQL e diversos batches. A aplicao no ter os erros identificados por um bloco CATCH. Porm, por meio de alguns mecanismos utilizados no bloco CATCH, possvel retornar essas informaes de erro aplicao. Dentre esses mecanismos, temos os comandos RAISERROR e PRINT, e conjuntos de resultados SELECT. O comando que bem logo aps o comando END CATCH ir assumir o controle assim que o cdigo do bloco CATCH tiver sido finalizado. Blocos TRY / CATCH podem conter comandos TRY / CATCH aninhados. Em um bloco CATCH que possui um instruo TRY / CATCH aninhada, caso haja erro no bloco TRY aninhado, ele ir passar o controle para o bloco CATCH aninhado. O erro ser retornado aplicao que fez a chamada caso o bloco CATCH no possua uma construo TRY / CATCH aninhada. TRIGGERs e STORED PROCEDUREs podem alternativamente ter construes TRY / CATCH prprias, cuja funo controlar erros criados pelos TRIGGERs e STORED PROCEDUREs. STORED PROCEDUREs ou TRIGGERs executados pelo cdigo de um bloco TRY podem conter erros no controlados. Estes podem ser identificados por construes TRY / CATCH. Caso a STORED PROCEDURE no tenha uma construo TRY / CATCH prpria, o erro dessa retornar o controle para o bloco CATCH ligado ao bloco TRY que possui o controle EXECUTE. Se tiver o controle transferido pelo erro do bloco CATCH na STORED PROCEDURE. Ento, o controle retornado ao controle localizado logo aps o comando EXECUTE responsvel por chamar a STORED PROCEDURE, assim que o cdigo do bloco CATCH tiver sido executado. O SQL Server possui comandos chamados GOTO, que podem ser utilizados para ir de uma etiqueta a outra no mesmo bloco TRY / CATCH. Os comandos GOTO tambm servem para sair desses mesmos blocos. Em uma funo definida pelo usurio, no possvel utilizar a construo TRY / CATCH.
A fim de obter informaes sobre o erro que provocou a execuo do bloco CATCH, dispomos de vrias funes de sistema que devem ser utilizadas em qualquer parte do escopo de um bloco CATCH. Caso no sejam utilizadas nesse escopo, as funes retornam NULL.
135
A seguir, descrevemos as funes de sistema disponveis para obter informaes de erro a partir do bloco CATCH: Funo de Sistema ERROR_NUMBER() ERROR_SEVERITY() ERROR_STATE() Retorna o nmero do erro. Retorna a severidade do erro. Retorna o estado do erro. Descrio
ERROR_PROCEDURE() Retorna o nome da PROCEDURE que gerou o erro. ERROR_LINE() ERROR_MESSAGE() Retorna a linha em que ocorreu o erro. Retorna uma mensagem descritiva sobre o erro ocorrido. Pode incluir outros atributos como tempo, nome de objetos, extenses.
Porm, existem certos tipos de informaes de erro que no so identificados por uma construo TRY / CATCH, tipos estes descritos abaixo: Aviso de ateno, dentre os quais so includos aqueles referentes a conexo de cliente interrompidas e pedidos de interrupo de cliente. Mensagens informativas ou avisos que apresentam um valor de severidade igual ou inferior a 10. Sesses finalizadas por meio do comando KILL. Erros que finalizam o processamento de tarefas do SQL Server Database Engine para a sesso e que apresentam um valor de severidade igual ou superior a 20. Caso a conexo com o banco de dados no seja afetada, enquanto um erro com severidade igual ou superior a 20 ocorrer, esse erro ser controlado pela construo TRY / CATCH.
EXECUTE
A seguir, temos duas sintaxes da utilizao do comando EXECUTE: EXECUTE [@retorno =] {nome_procedure} ou EXECUTE ( { @variavel_string | [N]'tsql_string' } [+....n] )
136
Na primeira sintaxe, temos @retorno e nome_procedure. @retorno representa uma varivel que armazena o estado de uma STORED PROCEDURE, e deve ser declarada antes de ser utilizada em EXECUTE. @retorno inteira (INT) e opcional. J nome_procedure representa o nome da STORED PROCEDURE a ser executada, nome este que pode ser parcial ou totalmente qualificado. Um aspecto importante em relao nomenclatura das STORED PROCEDUREs que os nomes devem estar de acordo com as regras definidas pelos identificadores, como EXEC @retorno = SP_TESTE. J na segunda sintaxe exibida, temos @variavel_string e [N]'tsql_string'. @variavel_string representa o nome de uma varivel local. Esta varivel por ser do tipo: VARCHAR, CHAR, NCHAR, NVARCHAR. J [N]'tsql_string' representa uma string constante e por ser do seguinte tipo: VARCHAR, NVARCHAR (este ser o tipo caso [N] seja utilizado.)
STORED PROCEDURE
Uma coleo de comando SQL criada para utilizao permanente ou temporria em uma sesso de usurio ou por todos os usurios chamada de STORED PROCEDURE. Podemos programar a execuo de STORED PROCEDUREs das seguintes formas: Execuo no momento em que o SQL Server inicializado. Execuo em perodos especficos do dia. Execuo em um horrio especfico do dia.
Aplicaes criadas por meio do SQL Server podem ser armazenadas como STORED PROCEDUREs. Assim, podemos criar aplicaes com a finalidade de executar essas STORED PROCEDUREs e fazer o processamento dos resultados.
137
General Extended Stored Procedures: A partir de uma instncia do SQL Server, oferece uma interface para programas de diversas atividades de manuteno.
139
Nota: Nas verses posteriores do SQL Server essa opo no ser mais possvel. aconselhvel no utiliz-lo para desenvolver novos projetos.
140
Para execut-la:
EXEC SP_SOMA GO
Para que possamos visualizar essa STORED PROCEDURE, expanda o n MINHA_DB -> PROGRAMMABILITY -> STORED PROCEDURES.
Parmetros
As STORED PROCEDUREs criadas no SQL Server podem receber parmetros tanto de entrada como de sada. A fim de indicar um sucesso ou falha, bem como o motivo da falha, as stored procedures do SQL Server retornam um valor de status para a aplicao (batch ou procedure). As STORED PROCEDUREs no retornam valores no lugar de seus nomes. Alm disso, no podem ser utilizadas no lugar de expresses. Isso difere as STORED PROCEDUREs das FUNCTIONs. A seguir, temos um exemplo de STORED PROCEDURE que recebe dois valores e os soma:
CREATE PROCEDURE SP_SOMA2 ( @A INT, @B INT ) AS BEGIN DECLARE @SOMA INT SET @SOMA = @A + @B RETURN END GO
Para execut-la:
EXEC SP_SOMA2 10, 50 GO
141
Para que possamos receber a sada dessa procedure, devemos proceder da seguinte forma:
DECLARE @X INT EXEC SP_MULTIPLICA 20, 20, @X OUTPUT SELECT @X
Retornando Um Valor
Por meio do comando RETURN, possvel fazer com que a procedure retorne um valor, que deve ser obrigatoriamente um valor inteiro. Vejamos:
CREATE PROCEDURE SP_DIVIDE ( @A INT, @B INT ) AS BEGIN DECLARE @C INT SET @C = @A / @B RETURN @C END GO
Para que possamos receber o retorno dessa procedure, temos o cdigo dessa forma:
DECLARE @X INT EXEC @X = SP_DIVIDE 100, 10 PRINT @X
142
Otimizao da Procedure
Uma procedure sofre um processo de otimizao caso ela tenha atingido o estgio resolution de maneira bem sucedida.O SQL Server possui um otimizador de queries, que desenvolve para a procedure um plano de execuo que possui mtodos de acesso rpido a dados. Para que o otimizador possa realizar essa tarefa, ele analisa os comando internos da procedure. Os ndices, a quantidade de dados que as tabelas apresentam, os JOINs, UNIONs, GROUP BYs e ORDER BYs, e os valores e operadores utilizados na clusula WHERE so os fatores que o processador de queries considera para criar o plano de otimizao para a procedure.
143
Compilao da Procedure
Os processos referentes analise e ao desenvolvimento do plano de query da STORED PROCEDURE compreendem a sua compilao. A procedure ser executada assim que o otimizador de queries inserir o plano j compilado no cache da procedure.
144
Os nveis de aninhamento suportados pelas STORED PROCEDUREs so no mximo 32. Uma STORED PROCEDURE pode chamar outra STORED PROCEDURE. Quando isso ocorre, a segunda procedure tem direito a acessar todos os objetos criados na primeira STORED PROCEDURE. As tabelas temporrias esto entre esses objetos.
146
Exerccios
1. Que uma varivel local e como podemos cri-la? Resposta:
5. Cite alguns aspectos que devemos levar em considerao na criao de uma STORED PROCEDURE. Resposta:
147
6. A qual tipo de STORED PROCEDURE o pargrafo a seguir se refere? So criadas quando o SQL Server instalado nos bancos de dados de sistema. Quando retornam valor 0 (ZERO), isto significa que a operao foi realizada com sucesso. Valores diferentes de 0 (ZERO) indicam falha. a. Stored Procedures Remotas. b. Stored Procedures Locais. c. Extended Stored Procedures. d. System Stored Procedures. e. Stored Procedures Temporrias Locais e Globais.
7. Qual das alternativas a seguir NO uma caracterstica das Extend Stored Procedures a. Podem ser adicionadas apenas ao banco de dados master. b. No permitem a criao de rotinas externas prprias em linguagens de programao. Uma dessas linguagens a C. c. So programadas por meio da API do SQL Server Extended Stored Procedure. d. So executadas diretamente no espao de endereo de uma instncia do SQL Server. e. No devem ser utilizadas para instanciar o tempo de execuo de linguagem comum do Microsoft .NET FrameWork e para execuo do cdigo gerenciado, j que verses futuras do SQL Server no suportaro mais esse tipo de tarefa.
8. Qual das alternativas as seguir apresenta a descrio correta de um valor que pode ser atribudo opo Remote Access? a. Valor 0: Ao ajustarmos Remote Access para esse valor, ser permitido executar STORED PROCEDUREs locais a partir de servidores remotos ou STORED PROCEUDREs remotas a partir do servidor local. b. Valor 1: Ao ajustarmos Remote Access para este valor, STORED PROCEDUREs locais no sero executadas a partir de um servidor remoto e STORED PROCEDUREs remotas no sero executadas no servidor local. c. Valor 1: Ao ajustarmos Remote Access para este valor, no ser permitido executar STORED PROCEDUREs locais a partir de servidores remotos mas podero ser executadas STORED PROCEDUREs remotas a partir do servidor local. d. Valor 0: Ao ajustarmos Remote Access para este valor, STORED PROCEDUREs locais sero executadas a partir de um servidor remoto e STORED PROCEDUREs remotas no sero executadas no servidor local. e. Valor 0: Ao ajustarmos Remote Access para este valor, STORED PROCEDUREs locais no sero executadas a partir de um servidor remoto e STORED PROCEDUREs remotas no sero executadas no servidor local.
148
9. Que palavra utilizada na passagem de parmetros por referncia? a. EXECUTE. b. OUTPUT c. EXISTS d. RETURN e. UNION
10. Que acontece quando executamos a STORED PROCEDURE SP_RECOMPILE? a. Ela criptografa o cdigo de criao da procedure, assim como foi feito com as VIEWS. b. Ela criptografa e recomplia o cdigo antes da execuo da procedure. c. Ela fora a recompilao do cdigo da procedure toda vez que esta for executada. d. Ela recompila a procedure em sua prxima execuo. e. Ela altera o cdigo de criao de uma STORED PROCEDURE.
149
Laboratrio
Para realizar este laboratrio, crie o database SISCOM com o seguinte scritp:
USE MASTER GO IF EXISTS(SELECT * FROM MASTER.DBO.SYSDATABASES WHERE NAME LIKE '%SISCOM%') DROP DATABASE SISCOM GO CREATE DATABASE SISCOM ON PRIMARY ( NAME = 'SISCOM_DADOS1', FILENAME = 'C:\DADOS\SISCOM_DADOS1.MDF', SIZE = 3MB, MAXSIZE= 3MB, FILEGROWTH = 1MB ), FILEGROUP TABELAS ( NAME = 'SISCOM_DADOS2', FILENAME = 'C:\DADOS\SISCOM_DADOS2.NDF', SIZE = 10MB, MAXSIZE= 100MB, FILEGROWTH = 10MB ), FILEGROUP INDICES ( NAME = 'SISCOM_DADOS3', FILENAME = 'C:\DADOS\SISCOM_DADOS3.NDF', SIZE = 10MB, MAXSIZE= 100MB, FILEGROWTH = 10MB ) LOG ON ( NAME = 'SISCOM_LOG', FILENAME = 'C:\DADOS\SISCOM_LOG.LDF', SIZE = 1MB, MAXSIZE= 10MB, FILEGROWTH = 1MB ) GO /* ********************************************************************** */ USE SISCOM GO EXEC SP_ADDTYPE 'CODIGO', 'INT', 'NOT NULL' EXEC SP_ADDTYPE 'NOME', 'CHAR(100)', 'NOT NULL' EXEC SP_ADDTYPE 'MOEDA','DECIMAL(10,2)','NOT NULL' EXEC SP_ADDTYPE 'SEXO', 'CHAR(1)','NOT NULL' EXEC SP_ADDTYPE 'DDD', 'CHAR(3)', 'NOT NULL' EXEC SP_ADDTYPE 'FONE','CHAR(10)', 'NOT NULL' EXEC SP_ADDTYPE 'RG','CHAR(15)', 'NOT NULL' EXEC SP_ADDTYPE 'CPF','CHAR(20)','NOT NULL' EXEC SP_ADDTYPE 'DATA','SMALLDATETIME','NOT NULL' EXEC SP_ADDTYPE 'VALOR','DECIMAL(10,2)','NOT NULL' GO /* ********************************************************************** */ CREATE RULE R_MOEDA AS @MOEDA >= 200.00 150
GO CREATE RULE R_SEXO AS @SEXO IN ('F','M') GO /* ********************************************************************** */ CREATE DEFAULT D_MOEDA AS 200.00 GO CREATE DEFAULT D_SEXO AS 'F' GO /* ********************************************************************** */ EXEC SP_BINDRULE 'R_MOEDA','MOEDA' EXEC SP_BINDRULE 'R_SEXO','SEXO' EXEC SP_BINDEFAULT 'D_MOEDA','MOEDA' EXEC SP_BINDEFAULT 'D_SEXO','SEXO' GO /* ********************************************************************** */ CREATE TABLE TIPOFONE ( COD_TIPOFONE INT IDENTITY NOT NULL, NOME_TIPOFONE CHAR(50) NOT NULL, CONSTRAINT PK_FONE PRIMARY KEY(COD_TIPOFONE), CONSTRAINT UQ_FONE UNIQUE(NOME_TIPOFONE) )ON TABELAS GO INSERT TIPOFONE VALUES('RESIDENCIAL') INSERT TIPOFONE VALUES('COMERCIAL') INSERT TIPOFONE VALUES('RECADO') INSERT TIPOFONE VALUES('CELULAR') GO /* ********************************************************************** */ CREATE TABLE TIPOPROD ( COD_TIPOPROD INT IDENTITY NOT NULL, NOME_TIPOPROD CHAR(50) NOT NULL, CONSTRAINT PK_PROD PRIMARY KEY(COD_TIPOPROD), CONSTRAINT UQ_TIPOPROD UNIQUE(NOME_TIPOPROD) )ON TABELAS GO INSERT TIPOPROD VALUES('ESPECIAL') INSERT TIPOPROD VALUES('CLASSICO') INSERT TIPOPROD VALUES('NORMAL') INSERT TIPOPROD VALUES('REVISADO') INSERT TIPOPROD VALUES('RECICLADO') GO /* ********************************************************************** */ CREATE TABLE CLIENTE ( COD_CLI CODIGO IDENTITY, NOME_CLI NOME, RENDA_CLI MOEDA, DATA_NASCCLI DATA, SEXO_CLI SEXO CONSTRAINT PK_CLI PRIMARY KEY(COD_CLI) 151
)ON TABELAS GO INSERT CLIENTE VALUES('OLGA CRISTINA BONFIGLIOLI',240.00,GETDATE(),'F') INSERT CLIENTE VALUES('MARIA CRISTINA BONFIGLIOLI MARTINS DE SOUZA SANTOS',240.00,GETDATE(),'F') INSERT CLIENTE VALUES('SALVADOR ENEAS FEREDICO',240.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('DOLORES GERREIRO MARTINS',240.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('FABIANA BATAGLIN',240.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('APARECIDA RIBEIRO',240.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('REGINALDO RIBEIRO',240.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('SUELLEN M NUNES',240.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('CARLOS ALBERTO',240.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('ROBERTO ARRUDA',240.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('SANDRA MEDEIROS',240.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('ALICE SANTOS',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('VALTER SANCHES',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('PASCOAL BABIERA',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('LUCIA BACALLA',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('MARIA BELIDO',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('HAMILTON BELICO',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('ALBERTO BELLI',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('MARCIA BUENO',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('MARIA CATTA',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('CARLOS CATTANEO',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('ANDRE CAULA',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('FABIA DVELLO',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('AFONSO FERRARO',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('AKEMI FUKAMIZU',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('BERNADINO GOMES',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('REGIANI HOKI',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('VALTER KOSZURA',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('ALEXANDRE KOZEKI',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('VITTORIO LANNOCCA',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('DOMINGOS LANINI',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('PAULO MELLO',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('ZILDA MELLONE',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('MARLENE MOURA',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('FRANCISCA OLIVEIRA',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('MARLENE PEREIRA',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('MILTON PEREIRA',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('LIGIA RAMOS',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('MARIANGELA RAMOS',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('DORA ROMARIZ',100.00 * @@IDENTITY,GETDATE(),'F') INSERT CLIENTE VALUES('PAULINO ROMELLI',1000.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('FERNANDO SAMPAIO',1000.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('JOS SAMPAIO',1000.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('VICENZO SENATORI',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('GERALDO SENEDEZE',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('MAURO SOARES',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('PAULO SOUZA',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('EMIDIO TRIFONI',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('HEITOR VERNILE',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('CARLOS SAURA',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('ANGELINO SAULLO',100.00 * @@IDENTITY,GETDATE(),'M') INSERT CLIENTE VALUES('ALDO SAVAZZONI',100.00 * @@IDENTITY,GETDATE(),'M') GO SELECT * FROM CLIENTE /* ******************************************************************/ UPDATE CLIENTE 152
SET DATA_NASCCLI = CONVERT(SMALLDATETIME, CONVERT (CHAR(2),DATEPART(MM,'01/01/01')) + '/' + CONVERT(CHAR(2),DATEPART(DD,'01/01/01'))+ '/' + CONVERT(CHAR(4),DATEPART(YY,'01/01/01') - COD_CLI - 30)) GO /* ********************************************************************** */ CREATE TABLE CONJUGE ( COD_CLI CODIGO, NOME_CONJ NOME, RENDA_CONJ MOEDA, SEXO_CONJ SEXO, CONSTRAINT PK_CONJ PRIMARY KEY(COD_CLI), CONSTRAINT FK_CONJ FOREIGN KEY (COD_CLI) REFERENCES CLIENTE(COD_CLI) )ON TABELAS GO /* VOCE INSERE CONJUGE PARA OS 5 PRIMEIROS CLIENTES */ INSERT CONJUGE VALUES(1,'MARINALVA',1200,'F') INSERT CONJUGE VALUES(2,'MARIANO',1500,'M') INSERT CONJUGE VALUES(3,'JOSUALDO',2200,'M') INSERT CONJUGE VALUES(4,'CREUZA',1350,'F') INSERT CONJUGE VALUES(5,'DAMARIS',1200,'F') GO /* ********************************************************************** */ CREATE TABLE FONE ( COD_FONE CODIGO IDENTITY, COD_TIPOFONE CODIGO, COD_CLI CODIGO, NUM_FONE FONE, DDD_FONE DDD, CONSTRAINT PK_F PRIMARY KEY(COD_FONE), CONSTRAINT FK_F_1 FOREIGN KEY(COD_TIPOFONE) REFERENCES TIPOFONE(COD_TIPOFONE), CONSTRAINT FK_F_2 FOREIGN KEY(COD_CLI) REFERENCES CLIENTE(COD_CLI) ) ON TABELAS GO INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE FONE VALUES(1,1,'434-2356','011') VALUES(2,1,'256-4578','011') VALUES(3,1,'256-5623','011') VALUES(4,2,'242-9865','011') VALUES(1,2,'323-8945','011') VALUES(2,2,'232-7845','011') VALUES(3,3,'565-2365','011') VALUES(4,3,'454-1254','011') VALUES(1,3,'898-2345','011') VALUES(2,4,'454-1223','011') VALUES(3,4,'787-4512','011') VALUES(4,5,'525-4578','011') VALUES(1,5,'252-9887','011') VALUES(2,6,'578-6521','011') VALUES(3,6,'568-5421','011') VALUES(1,8,'568-2154','011') VALUES(1,9,'587-3221','011') VALUES(1,10,'863-6598','011') VALUES(1,11,'138-8754','011') VALUES(2,12,'123-6598','011') VALUES(2,13,'321-6357','011') VALUES(2,14,'301-1232','011') VALUES(2,15,'321-4512','011') VALUES(3,16,'333-3221','011') 153
INSERT FONE VALUES(3,17,'555-4578','011') INSERT FONE VALUES(3,18,'666-1245','011') INSERT FONE VALUES(3,19,'777-3265','011') INSERT FONE VALUES(4,20,'888-2154','011') INSERT FONE VALUES(4,21,'999-1111','015') INSERT FONE VALUES(4,21,'202-1222','015') INSERT FONE VALUES(4,22,'254-3333','015') INSERT FONE VALUES(1,23,'458-4444','015') INSERT FONE VALUES(1,23,'874-5555','015') INSERT FONE VALUES(1,24,'313-6666','015') INSERT FONE VALUES(1,24,'587-7777','015') INSERT FONE VALUES(2,25,'589-8888','015') INSERT FONE VALUES(2,26,'999-9999','015') INSERT FONE VALUES(2,27,'999-1010','015') INSERT FONE VALUES(2,27,'111-1111','015') INSERT FONE VALUES(3,28,'222-1212','015') INSERT FONE VALUES(3,28,'333-1313','015') INSERT FONE VALUES(3,28,'444-1414','015') INSERT FONE VALUES(3,29,'555-1515','015') INSERT FONE VALUES(4,29,'666-1616','015') INSERT FONE VALUES(4,30,'777-1717','015') INSERT FONE VALUES(4,31,'888-1818','015') INSERT FONE VALUES(4,32,'999-1919','015') INSERT FONE VALUES(4,33,'101-2020','015') INSERT FONE VALUES(4,34,'555-2121','021') INSERT FONE VALUES(4,35,'333-2222','021') INSERT FONE VALUES(4,36,'717-2323','021') INSERT FONE VALUES(3,37,'656-2424','021') INSERT FONE VALUES(3,38,'374-2525','021') INSERT FONE VALUES(3,39,'859-2626','021') INSERT FONE VALUES(3,40,'222-2727','021') INSERT FONE VALUES(3,41,'256-2828','021') INSERT FONE VALUES(3,42,'542-2929','021') INSERT FONE VALUES(2,43,'578-3030','021') INSERT FONE VALUES(2,44,'896-4041','021') INSERT FONE VALUES(2,45,'369-5050','021') INSERT FONE VALUES(2,46,'132-5151','021') INSERT FONE VALUES(1,47,'321-6161','021') INSERT FONE VALUES(1,48,'542-7171','011') INSERT FONE VALUES(1,49,'201-8181','011') INSERT FONE VALUES(1,50,'301-9191','011') INSERT FONE VALUES(1,50,'401-1919','011') INSERT FONE VALUES(1,50,'501-1818','011') INSERT FONE VALUES(1,51,'601-1212','011') INSERT FONE VALUES(1,52,'701-1313','011') GO /* ********************************************************************** */ CREATE TABLE FUNCIONARIO ( COD_FUNC CODIGO IDENTITY, NOME_FUNC NOME, DATA_CADFUNC DATA NOT NULL DEFAULT GETDATE(), SEXOFUNC SEXO, SAL_FUNC MOEDA, END_FUNC VARCHAR(100) NOT NULL, CONSTRAINT PK_FUNC PRIMARY KEY(COD_FUNC) ) ON TABELAS GO INSERT FUNCIONARIO VALUES('ANTONIO ANTONINO ANTONES','01/02/00','M',1500.00,'RUA A') INSERT FUNCIONARIO VALUES('AMARO MERICO VESPUCIO','02/02/00','M',2500.00,'RUA B') 154
INSERT FUNCIONARIO VALUES('ABLIO ABEL GARCIA','03/02/01','M',1000.00,'RUA C') INSERT FUNCIONARIO VALUES('BIA BIANCA BONES','04/03/01','F',5000.25,'RUA D') INSERT FUNCIONARIO VALUES('BEATRIZ BERTIOGA','05/05/01','F',300.00,'RUA E') INSERT FUNCIONARIO VALUES('CAIO CESAR CEAREZ','06/05/01','M',250.00,'RUA F') INSERT FUNCIONARIO VALUES('CELSO CESARE','07/06/01','M',1542.36,'RUA J') INSERT FUNCIONARIO VALUES('DANILO DOUGLAS','08/06/01','M',1524.56,'RUA K') INSERT FUNCIONARIO VALUES('DENIS DENILO','09/07/01','M',5235.56,'RUA L') INSERT FUNCIONARIO VALUES('EVERTON EVARISTO','10/07/01','M',2542.25,'RUA M') INSERT FUNCIONARIO VALUES('EVANIR EVA','11/08/01','M',4523.54,'RUA N') INSERT FUNCIONARIO VALUES('FABIO FABRICIO','12/08/01','M',1524.25,'RUA O') INSERT FUNCIONARIO VALUES('FABIOLA FABIOLO','02/01/02','F',2554.25,'RUA P') INSERT FUNCIONARIO VALUES('GERALDO GOMES','03/010/02','M',1542.25,'RUA Q') INSERT FUNCIONARIO VALUES('HELIO HELIPOLIS','04/01/02','M',1542.23,'RUA R') INSERT FUNCIONARIO VALUES('IRINEU IRENE','05/02/02','M',2523.00,'RUA S') INSERT FUNCIONARIO VALUES('JONAS JACKES','05/02/02','M',2500.00,'RUA T') INSERT FUNCIONARIO VALUES('LEANDRO LAGO','06/02/02','M',1500.00,'RUA U') INSERT FUNCIONARIO VALUES('LUCIO LACIO','07/03/02','M',2500.00,'RUA V') INSERT FUNCIONARIO VALUES('LECIO LICIO','08/04/02','M',1420.00,'RUA X') INSERT FUNCIONARIO VALUES('MARIO MENDES','06/02/02','M',1262.00,'RUA W') INSERT FUNCIONARIO VALUES('OLAVO ODAVLAS','07/07/02','M',1540.00,'RUA Y') GO /* ********************************************************************* */ CREATE TABLE DEPENDENTE ( COD_DEP CODIGO IDENTITY, COD_FUNC CODIGO, NOME_DEP NOME, SEXO_DEP SEXO, DATA_NASCDEP DATA, CONSTRAINT PK_DEP PRIMARY KEY(COD_DEP), CONSTRAINT FK_DEP FOREIGN KEY (COD_FUNC) REFERENCES FUNCIONARIO(COD_FUNC) ) ON TABELAS GO --INSERIR 3 DEPENDENTES PARA O FUNCIONARIO 1 INSERT DEPENDENTE VALUES(1,'JOSEFINA','F','10/15/2001') INSERT DEPENDENTE VALUES(1,'RENILDA','F','02/20/2002') INSERT DEPENDENTE VALUES(1,'KATRINA','F','12/30/2003') --INSERIR 2 DEPENDENTES PARA O FUNCIONARIO 2 INSERT DEPENDENTE VALUES(2,'CARLOS','M','9/15/2001') INSERT DEPENDENTE VALUES(2,'JOANA','F','6/15/2001') --INSERIR 1 DEPENDENTES PARA O FUNCIONARIO 3 INSERT DEPENDENTE VALUES(3,'CLIA','F','7/19/2003') GO /* ********************************************************************** */ CREATE TABLE PREMIO ( COD_PREMIO CODIGO IDENTITY, COD_FUNC CODIGO, DATA_PREMIO DATA, VAL_PREMIO VALOR, STATUS_PREMIO CHAR(1), CONSTRAINT PK_PREMIO PRIMARY KEY(COD_PREMIO), CONSTRAINT FK_PREMIO FOREIGN KEY(COD_FUNC) REFERENCES FUNCIONARIO(COD_FUNC), CONSTRAINT CH_PREMIO CHECK(STATUS_PREMIO IN ('0','1')) ) ON TABELAS GO /* ********************************************************************** */ CREATE TABLE PEDIDO ( 155
NUM_PED CODIGO IDENTITY NOT NULL, COD_CLI CODIGO NOT NULL, COD_FUNC CODIGO NOT NULL, DATA_PED DATA NOT NULL, VAL_PED VALOR NOT NULL, CONSTRAINT PK_PED PRIMARY KEY(NUM_PED), CONSTRAINT FK_PED1 FOREIGN KEY(COD_CLI) REFERENCES CLIENTE(COD_CLI), CONSTRAINT FK_PED2 FOREIGN KEY(COD_FUNC) REFERENCES FUNCIONARIO(COD_FUNC) ) ON TABELAS GO /* ******************************************************************/ CREATE PROCEDURE P_ENCHEPEDIDO AS DECLARE @COD_FUNC INT, @COD_CLI INT, @COD_STA INT, @DATA VARCHAR(255), @DATAPED SMALLDATETIME, @VALOR DECIMAL(10,2) SET @COD_FUNC = 1 SET @COD_CLI = 1 SET @COD_STA = 1 WHILE @COD_FUNC <= 20 BEGIN WHILE @COD_CLI < 50 BEGIN SET @DATA = CONVERT(CHAR(02),MONTH(DATEADD(MM,@COD_STA*2,GETDATE()))) SET @DATA = @DATA + '/' + CONVERT(CHAR(02),DAY(GETDATE() @COD_STA*3)) SET @DATA = @DATA + '/' + CONVERT(CHAR(04),YEAR(DATEADD(YY,1*@COD_STA,GETDATE()))) SET @DATAPED = CONVERT(SMALLDATETIME,@DATA) SET @VALOR = @COD_FUNC * 10
IF @VALOR <= 240.00 SET @VALOR = 300.00 INSERT PEDIDO VALUES(@COD_CLI,@COD_FUNC,@DATA,@VALOR) SET @COD_STA = @COD_STA + 1 SET @COD_CLI = @COD_CLI + 1 SET @COD_STA = 1 END SET @COD_FUNC = @COD_FUNC + 1 SET @COD_CLI = 1 END GO /* ********************************************************************** */ EXEC P_ENCHEPEDIDO GO /* ********************************************************************** */ CREATE TABLE PRODUTO ( COD_PROD INT IDENTITY NOT NULL, COD_TIPOPROD INT NOT NULL, NOME_PROD VARCHAR(100) NOT NULL, QTD_ESTQ INT NOT NULL , 156
VAL_UNIT VALOR NOT NULL, CONSTRAINT PK_PRODUTO PRIMARY KEY(COD_PROD), CONSTRAINT FK_PRODUTO FOREIGN KEY(COD_TIPOPROD) REFERENCES TIPOPROD(COD_TIPOPROD), CONSTRAINT UQ_PRODUTO UNIQUE(NOME_PROD) ) GO INSERT PRODUTO VALUES (1,'CADERNO',10,1.25) INSERT PRODUTO VALUES (1,'LAPIS',1,0.25) INSERT PRODUTO VALUES (1,'BORRACHA',7,2.00) INSERT PRODUTO VALUES (1,'CANETA',5,0.50) INSERT PRODUTO VALUES (1,'CAMA',6,100.00) INSERT PRODUTO VALUES (1,'CADEIRA',3,30.00) INSERT PRODUTO VALUES (2,'GUARDA-ROUPA',2,1200.00) INSERT PRODUTO VALUES (2,'GELADEIRA',2,3000.00) INSERT PRODUTO VALUES (2,'TV',6,300.00) INSERT PRODUTO VALUES (3,'COMIDA',7,15.00) INSERT PRODUTO VALUES (3,'BEBIDA',2,1.00) GO /* ********************************************************************** */ CREATE TABLE ITENS ( NUM_PED CODIGO, COD_PROD CODIGO, QTD_PROD INT, VAL_VEND VALOR, CONSTRAINT PK_ITENS PRIMARY KEY(NUM_PED,COD_PROD), CONSTRAINT FK_PROD_1 FOREIGN KEY (NUM_PED) REFERENCES PEDIDO(NUM_PED), CONSTRAINT FK_PROD_2 FOREIGN KEY (COD_PROD) REFERENCES PRODUTO(COD_PROD) ) GO /* ********************************************************************** */ INSERT ITENS SELECT PEDIDO.NUM_PED, PRODUTO.COD_PROD, CASE WHEN COD_PROD - NUM_PED / 100 < 0 THEN 1 WHEN COD_PROD - NUM_PED / 100 = 0 THEN 2 ELSE COD_PROD - NUM_PED / 100 END, CASE WHEN VAL_PED - NUM_PED < 0 THEN (VAL_PED - NUM_PED) * -1 WHEN VAL_PED - NUM_PED > 100 THEN NUM_PED ELSE VAL_PED - NUM_PED END FROM PEDIDO CROSS JOIN PRODUTO WHERE PRODUTO.COD_PROD <= 10 GO /* ********************************************************************** */ SELECT * FROM TIPOFONE SELECT * FROM TIPOPROD SELECT * FROM CLIENTE SELECT * FROM CONJUGE SELECT * FROM FONE SELECT * FROM FUNCIONARIO SELECT * FROM DEPENDENTE SELECT * FROM PREMIO SELECT * FROM PEDIDO SELECT * FROM PRODUTO SELECT * FROM ITENS GO /* ********************************************************************** */ 157
-- OBTENDO INFORMAES: USE SISCOM SELECT * FROM SYSOBJECTS WHERE ID > 100 EXEC SP_HELPCONSTRAINT TIPOFONE EXEC SP_HELPCONSTRAINT TIPOPROD EXEC SP_HELPCONSTRAINT CLIENTE EXEC SP_HELPCONSTRAINT CONJUGE EXEC SP_HELPCONSTRAINT FONE EXEC SP_HELPCONSTRAINT FUNCIONARIO EXEC SP_HELPCONSTRAINT DEPENDENTE EXEC SP_HELPCONSTRAINT PREMIO EXEC SP_HELPCONSTRAINT PEDIDO EXEC SP_HELPCONSTRAINT PRODUTO EXEC SP_HELPCONSTRAINT ITENS /* ********************************************************************** */ PRINT '*................SISTEMA SISCOM CRIADO....................*' /* ********************************************************************** */
1. Criar uma procedure que receba o cdigo do funcionrio e um percentual de aumento salarial como parmetro de entrada. Verificar o salrio deste funcionrio e o seu sexo. Se sexo = 'F' e salrio < 1000.00, aplicar o aumento salarial. Resposta:
2. Criar uma procedure que receba o cdigo do funcionrio como parmetro e um percentual de aumento de salarial. Obter o salrio e o sexo deste funcionrio. Se sexo='F' e o salrio < 1000, aplicar o aumento para este funcionrio. Se sexo='m', diminuir o salrio deste funcionrio em 100.00 Resposta:
3. Criar uma procedure que receba o cdigo do funcionrio como parmetro. Verificar se este funcionrio tem dependente. Se ele possuir dependentes, aplicar um desconto de 5.00 no seu salrio. Se ele no tiver dependente, aplicar um aumento salarial de 500.00 para este funcionrio. Resposta:
158
Captulo 15
Transaes
Transaes so unidades de programao capazes de manter a consistncia e a integridade dos dados. Devemos considerar uma transao como uma coleo de operaes que executam uma funo lgica nica em uma aplicao de banco de dados. Todas as alteraes de dados realizadas durante a transao so submetidas e tornamse parte permanente do banco de dados caso a transao seja realizada com xito. No entanto, caso a transao no seja realizada por conta de erros, so excludas quaisquer alteraes feitas sobre os dados. O Sistema Gerenciador de Banco de Dados tem como um de seus itens principais um esquema de recuperao capaz de encontrar falhas e de restaurar um banco de dados para seu estado consistente, ou seja, para o estado em que ele encontrava-se antes da ocorrncia da falha. comum que uma unidade lgica de trabalho seja formada por diversas operaes do banco de dados. Um Exemplo que ocorre com bastante freqncia a transferncia de fundos, em que temos o dbito de uma conta para o crdito em outra. Para que este tipo de operao seja realizado da forma adequada, a consistncia do banco de dados essencial, visto que ou as duas operaes so realizadas, ou nenhuma . Isso significa que, se algum erro impedir a operao de parte do dbito, o crdito no ser realizado. Este requerimento, em que tudo ou nada, denominado atomicidade. Cada transao uma unidade de atomicidade. A preservao da atomicidade uma das questes mais importantes para o processamento de transaes, mesmo com a possibilidade de ocorrncia de falhas no sistema do computador, visto que isso pode acontecer com qualquer dispositivo eltrico ou mecnico. Dentre essas falhas, podemos mencionar problemas com o fornecimento de energia eltrica, com o disco ou com o software, entre outros. O tratamento das falhas deve ser realizado de acordo com seu tipo. As falhas mais simples so aquelas que no resultam em perda de informaes. J as falhas mais complexas e, portanto, mais difceis de serem tratadas so aquelas que resultam na perda de informao. Este tipo de falha pode fazer com que o banco de dados perca sua consistncia. Novamente, devemos ressaltar que a consistncia do banco de dados depende da atomicidade das transaes.
159
Exemplo de Transao
Os comando INSERT, UPDATE e DELETE so tratados individualmente como sendo uma transao. O comando SELECT no tratado como uma transao porque esta definida com sendo o comando que altera o estado inicial da tabela, coisa que o comando SELECT no pode fazer. Veja o exemplo a seguir:
BEGIN TRANSACTION T_UPDATE_SALARIO UPDATE FUNCIONARIOS SET SAL_FUNC = -100 WHERE COD_FUNC = 3 IF @@ERROR <> 0 BEGIN RAISERROR(50002 16, 1) 50002, ROLLBACK TRANSACTION T_UPDATE_SALARIO END ELSE COMMIT TRANSACTION T_UPDATE_SALARIO GO
Executando este script, teremos como retorno um erro, pois uma constraint CHECK definida na coluna SAL_FUNC de FUNCIONARIOS nos impede de alterar o salrio de um funcionrio para um valor inferior 0 (zero). Vejamos o erro:
160
Transaes Explcitas
As transaes explcitas, tambm chamadas em verses anteriores do SQL Server de transaes especficas ou definidas pelo usurio, so aquelas em que temos seu incio e seu trmino determinados de forma explcita. Para definir este tipo de transao, os scripts Transact-SQL e as aplicaes DB-Library utilizam os seguintes comandos: BEGIN TRANSACTION [nome_transacao]: D incio a uma transao explcita. COMMIT TRANSACTION [nome_transacao]: Finaliza a transao e efetua as modificaes necessrias no banco de dados. ROLLBACK TRANSACTION [nome_transacao]: Finaliza a transao no banco de dados, porm no efetua qualquer modificao, ou invs retorna o estado original do banco de dados.
O modo explcito dura apenas at o encerramento da transao, quando a conexo retorna ao modo de transao no qual se encontrava antes de a transao explcita ter incio. Este modo pode ser implcito ou submetido de forma automtica.
Transaes Implcitas
O comando SET permite criar transaes implcitas para aplicao que foram desenvolvidas em sistemas diferentes do SQL Server. Vejamos sua aplicao: SET IMPLICIT_TRANSACTION { ON | OFF } Caso j exista uma transao implcita na conexo, o comando SET no iniciar outra transao, visto que no so permitidas as transaes aninhadas. Nas situaes em que essa transao estiver configurada para ON, seu encerramento deve ser feito por meio da execuo explcita de um dos seguintes comandos: COMMIT ou ROLLBACK TRANSACTION. Se a transao no for desfeita dessa maneira, as alteraes e dados modificadas sero desfeitos no momento em que o usurio se desconectar. Por padro, a transao ser configurada para OFF. Quando a transao anterior encerrada, inicia-se uma nova transao de forma implcita.
Nota: importante salientar que caso as transaes implcitas estejam no estado ON, qualquer tipo de transao ser monitorada. Isso pode acarretar uma carga de processo muito alto por parte do servidor, fazendo com que este perca em grande parte sua performance.
161
Manipulando Erros
Os erros que abortam um comando ou um batch podem ocorrer quando os batches e as stored procedures remotas so executadas para o cliente a partir de uma instncia local do SQL Server. Nas situaes em que temos um erro que aborta um comando, ocorre o encerramento do comando que gerou o erro, porm, no ocorre o encerramento da execuo do batch ou da stored procedure remota. J nas situaes em que tempos um erro que aborta um batch, a execuo do batch ou da stored procedure encerrada. Alm disso, devemos ter em mente que a manipulao de erros que abortam batches pode ser realizada por uma construo do tipo TRY / CATCH nas situaes em que a execuo dos batches e das stored procedures remotas realizada dentro do escopo de um bloco TRY. A configurao de SET XACT_ABORT do servidor local utilizada como base para determinar o comportamento dos batches e das stored procedures remotas nas situaoes em que ocorrem erros que abortam comandos e batches.
SET XACT_ABORT
Conforme vimos acima, a configurao de SET XACT_ABORT do servidor local determina o comportamento de batches e de stored procedures remotas quando ocorrem erros que abortam comandos e batches. Quando SET XACT_ABORT est configurado como ON no servidor local, est configurao tambm aplicada ao servidor que est ligado ao mesmo. Com isso, ocorre uma converso dos erros que abortam batches e comandos na stored procedures remotas: todos eles so convertidos apenas para erros que abortam batches. Diante de tal converso, o encerramento da execuo ocorre de forma simultnea ao encerramento desta ltima. Nas situaes em que a execuo da stored procedure remota que gerou o erro ocorre no escopo do bloco TRY no servidor local, as informaes a respeito do ltimo erro ocorrido no servidor remoto so passadas pelo controle para o bloco CATCH. J nas situaes em que a
162
stored procedure remota no executada no escopo de um bloco TRY, o valor de @@ERROR no pode ser verificado.
Nota: O valor de @@ERROR permite verificar se a no-execuo do comando posterior ao EXECUTE foi a responsvel por causar o erro de batch.
A execuo mais adequada da stored procedure remota deve ocorrer a partir do bloco TRY referente a uma construo TRY / CATCH. Com isso, caso haja problemas para que tal procedure seja finalizada, a execuo direcionada ao bloco CATCH associado, o qual se encontra no servidor local e possui informaes a respeito do ltimo erro gerado no servidor remoto. J nas situaes em que a finalizao dessa procedure ocorrem sem problemas, a execuo segue seu curso normal dentro do bloco TRY no servidor local. O resultado obtido com esta execuo pode ser utilizado normalmente.
RAISERROR
Este comando responsvel por gerar uma mensagem de erro, a qual pode ser construda de forma dinmica. Alm disso, RAISERROR pode fazer referncia a uma mensagem definida pelo usurio que se encontra armazenada em SYS.MESSAGES, uma VIEW de catlogo. Essa mensagem retornada para a aplicao que fez a chamada ou para o bloco CATCH associado. Esse retorno ocorre como se a mensagem fosse um erro do servidor. RAISERROR gera erros que funcionam de forma semelhante aos erros gerados pelo cdigo Database Engine. Os valores referentes a esses erros so relatados pelas seguintes funes de sistema: @@ERROR, ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY e ERROR_STATE. Vale destacar, tambm, que RAISERROR pode ser utilizada por blocos CATCH com a finalidade de lanar novamente um erro que invocou este tipo de bloco utilizando funes de sistema para recuperar dados a respeito do erro original.
Nota: A incluso de uma mensagem definida pelo usurio feita por meio do SP_ADDMESSAGE. J sua excluso feita por meio do SP_DROPMESSAGE.
Visto que o RAISERROR, ao contrrio do comando PRINT, capaz de suportar a substituio de caracteres, ele pode ser utilizado como alternativa a este comando com a finalidade de retornar mensagens s aplicaes que as chamaram. Para que o RAISERROR
163
possa retornar uma mensagem do bloco TRY sem ter que invocar o bloco CATCH, preciso especificar um valor de severidade 10 ou inferior. O bloco TRY no afeta o comando PRINT. Vale destacar que os argumentos substituem as especificaes de converso de forma sucessiva. Veja o exemplo:
RAISERROR ( N'Essa uma mensagem %s %d.', -- Texto da mensagem. 10, -- Severidade, 1, -- Estado, N'nmero', -- Primeiro argumento. 5); -- Segundo argumento. GO
A Varivel @@ERROR
Esta varivel tem a finalidade de retornar o nmero referente ao erro aps a execuo de um comando Transact-SQL. Caso este nmero seja referente a um dos erros definidos na VIEW de catlogo SYS.MESSAGES, o valor de @@ERROR referente coluna SYS.MESSAGES.MESSAGE_ID relativa ao erro ocorrido. A partir de SYS.MESSAGES, possvel verificar o texto correspondente ao erro. O valor de @@ERROR deve ser verificado de forma imediata ou deve ser salvo em uma varivel local a fim de que se possa ser verificado posteriormente. Isso se faz necessrio porque esse valor excludo e @@ERROR reiniciado a cada comando executado. Observe o exemplo a seguir:
DECLARE @ERRO INT UPDATE FUNCIONARIOS SET SAL_FUNC = -100 WHERE COD_FUNC = 3 SET @ERRO = @@ERROR IF @ERRO <> 0 PRINT N'O nmero do erro gerado foi ' + CAST(@ERRO AS VARCHAR(10)) GO
Parecido com um exemplo anterior, tentamos alterar o valor do salrio de um funcionrio para um valor negativo, a constraint CHECK acionada retornando um erro que por sua vez atribudo a uma varivel chamada @ERRO. Essa varivel por fim impressa na tela com a utilizao do comando PRINT. Execute o comando e veja o resultado.
164
165
Nesse caso, criamos essa mensagem no database MASTER, mas ela pode ser criada na , database do usurio. A vantagem de se criar na MASTER que a mensagem fica acessvel a qualquer usurio. Como essa mensagem foi definida para escrever no log do Windows sempre que acontecer, vejamos o Windows Logs:
Para acessar o Windows Logs, v em INICIAR / PROGRAMAS / FERRAMENTAS ADMINISTRATIVAS / EVENT VIEWER ENT VIEWER.
166
Batch
Definimos batches como sendo um grupo composto por um ou mais comandos SQL que uma aplicao envia, de uma nica vez, para serem executados pelo SQL Server. Caso haja algum erro de compilao, o Plano de Execuo deixa de ser executado, o que significa que os comandos que compem o batch tambm no so executados. J um erro ocorrido em tempo de execuo poder apresentar um dos seguintes efeitos: Grande parte dos erros ocorridos em tempo de execuo paralisam o comando atual e o seguinte do batch. Apenas alguns erros em tempo de execuo paralisam somente o comando atual, sem afetar os outros comandos batch. O comando executado antes da ocorrncia do erro em tempo de execuo no afetado. Apenas h uma exceo, que ocorre nas situaes em que o batch est em uma transao e o erro causa um ROLLBACK. Quando isso ocorre, qualquer comando que no tenha sido submetido ser desfeito.
167
Exerccios
1. Que so transaes? Como elas funcionam? Resposta:
5. Quais so os efeitos que podem ser apresentados por um erro ocorrido em tempo de execuo? Resposta:
168
6. O que acontece quando o SET XACT_ABORT est configurado como ON no servidor local? a. gerada uma mensagem de erro, a qual pode ser construda deforma dinmica. b. Ocorre uma converso dos erros que abortam batches e comandos na stored procedure remota: todos eles so convertidos apenas para erros que abortam batches. c. Ocorre a excluso da mensagem definida pelo usurio, feita por meio do SP_DROPMESSAGE. d. gerada uma mensagem de erro, a qual s pode ser construda de forma nodinmica. e. Ocorre uma converso dos erros que abortam somente os comandos na stored procedure remota.
7. Que comando pode fazer referncia a uma mensagem definida pelo usurio, que se encontra armazenada em SYSMESSAGES, uma VIEW de catlogo? a. ROLLBACK b. COMMIT c. RAISERROR d. RETURN e. INSERT
8. Qual a funo da varivel @@ERROR? a. Armazenar uma mensagem de erro utilizando uma stored procedure de sistema SP_ADDMESSAGE b. Permite alterar o texto de uma mensagem de erro. c. Determinar se a mensagem deve ser escrita no log de aplicaes do Windows NT e no Error Log do SQL Server. d. Esta varivel tem a funo de retornar o nmero referente ao erro aps a execuo de um comando Transact_SQL e. Armazenar o nvel de severidade do erro.
169
9. Que plano de Execuo? a. So comandos responsveis por iniciar a transao nas situaes em que no ocorrem erros. b. uma converso dos erros que abortam batches e comandos na stored procedure remota. c. Conjunto de transaes especficas ou definidas pelo usurio em verses anteriores do SQL Server. d. So comandos responsveis por encerrar a transao com xito nas situaes em que no ocorrem erros. e. So os comandos que compem um batch e so compilados pelo SQL Server em uma nica unidade executvel.
10. Que comandos no podem ser combinados em um Batch? a. DROP DATABASE, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER, EXECUTE b. CREATE DEFAULT, CREATE PROCEDURE,CREATE RULE, CREATE TRIIGER, CREATE VIEW c. EXECUTE, CREATE PROCEDURE, DROP RULE, CREATE TRIGGER, CREATE VIEW d. CREATE DEFAULT, DROP PROCEDURE, CREATE RULE, DROP TRIGGER, CREATE VIEW e. CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER, CREATE VIEW
170
Laboratrio
Crie uma procedure (utilizando transaes) que receba o cdigo do funcionrio como parmetro e verifique o total do ltimo pedido que este funcionrio atendeu. Se este total for maior do que 50,00 aplicar um prmio de 10% do valor do pedido para este funcionrio (gravando uma linha correspondente na tabela PREMIO) e atribuir um desconto de 10% no valor deste ltimo pedido. Para que possamos realizar este laboratrio, usaremos o database SISCOM: Resposta:
171
Captulo 16
Funes
Trata-se de um tipo de programa criado em um determinado banco de dados para retornar um valor especfico ou uma srie de valores. Esses valores podem ser retornados para outra funo, para uma aplicao, para uma STORED PROCEDURE ou diretamente para o usurio.
172
Funes Built-In
As funes built-in podem ser utilizadas em comandos Transact-SQL para a obteno de dados das tabelas do SQL Server sem a necessidade de acess-las diretamente. Essas funes permitem, ainda, a execuo de tarefas comuns ao SQL Server, como SUM(), GETDATE() ou IDENTITY(). Quando utilizadas, as funes built-in retornam valores com datatypes escalares ou tabulares. importante lembrar que no possvel modific-las.
Funes Escalares
Similares s funes built-in, retornam um nico valor. Esse valor retornado possui um datatype definido na clusula RETURNS. Os parmetros de entrada podem ser aceitos ou recusados por meio dessas funes, que podem ser utilizadas sempre que uma expresso vlida. O valor escalar de uma funo in-line obtido a partir de um s comando, sendo que no existe corpo de funo neste caso. J uma funo que possui vrios comandos TransactSQL capaz de retornar um valor de qualquer datatype. O corpo desta funo definido no bloco BEGIN / END.
173
Funes Table-Valued
As funes table-valued utilizam um nico comando SELECT para retornar um valued conjunto de resultados em forma de tabela, j que o datatype desse valor retornado TABLE. Caso a funo table-valued seja in line, no existir corpo de funo. Vejamos um exemplo: valued in-line,
CREATE FUNCTION F_DATA_CADASTRO (@DATA SMALLDATETIME) RETURNS TABLE AS RETURN (SELECT * FROM DBO.FUNCIONARIO WHERE CONVERT(CHAR CHAR(08), DATA_CADFUNC) = CONVERT(CHAR CHAR(08), @DATA)) GO --EXECUTANDO A FUNO RECM CRIADA F_DATA_CADASTRO EXECUTANDO SELECT * FROM F_DATA_CADASTRO ('2001-05-05') GO
Crie e execute a funo a cima (ser necessrio o banco de dados SISCOM, visto no laboratrio anterior).
174
Funes Que Contm Vrios Comandos e Que Retornam Dados de Uma Tabela
Para executarmos o exemplo adiante, inicialmente, devemos criar a tabela USUARIOS e, tambm, inserir uma nova coluna na tabela FUNCIONARIO. Esta coluna deve ser nomeada como NUM_REGIAO, do tipo TINYINY. (Use o database SISCOM):
CREATE TABLE USUARIOS ( NUM_REGIAO TINYINT, NOME_USUARIO VARCHAR(20) ) GO INSERT INTO USUARIOS VALUES (10, 'MARCO') GO ALTER TABLE FUNCIONARIO ADD NUM_REGIAO TINYINT GO CREATE FUNCTION F_REGIAO() RETURNS @FUNC TABLE ( NOME_FUNC VARCHAR(100) NOT NULL, SAL_FUNC DECIMAL(10,2) NOT NULL ) AS BEGIN DECLARE @NUMREG TINYINT SELECT @NUMREG = NUM_REGIAO FROM USUARIOS WHERE NOME_USUARIO = 'MARCO' IF @NUMREG IS NOT NULL AND @NUMREG <> 10 INSERT INTO @FUNC SELECT NOME_FUNC, SAL_FUNC FROM FUNCIONARIO WHERE NUM_REGIAO = @NUMREG ELSE IF @NUMREG = 10 INSERT INTO @FUNC SELECT NOME_FUNC, SAL_FUNC FROM FUNCIONARIO RETURN END GO --EXECUTANDO A FUNO F_REGIAO() SELECT * FROM DBO.F_REGIAO() GO
175
Exerccios
1. Que so funes? Resposta:
3. Que so UDFs e quais sos tipos que podem ser criados? Resposta:
176
6. Quais das alternativas a seguir apresentam regras que devem ser consideradas quando trabalhamos com funes? a. Os valores escalares representam o nico retorno que pode ser obtido a partir de uma funo. b. Uma funo que foi definida pelo usurio no aceita parmetros de output. c. Uma permisso de SELECT exigida para a execuo de uma User Defined Function por parte do usurio. d. A execuo de uma funo escalar exige a utilizao do comando SELECT e do nome qualificado por duas partes. e. Os datatypes cursor, table ou timestamp podem ser utilizados nos parmetros de entrada de uma funo no SQL Server.
7. Que funo pode ser utilizada em comandos Transact-SQL para a obteno de informaes das tabelas do SQL Server sem a necessidade de acessar diretamente essas tabelas? a. User Defined Function b. Escalares c. Table-Valued d. Built-In e. No-escalares
8. Qual das alternativas apresenta as palavras que devem ser inseridas nos espaos em branco do pargrafo a seguir? Similares s funes ___________, as funes ___________retornam um nico valor, pois operam com um s valor. Este valor retornado possui um datatype definido na clusula __________. a. User Defined Function / built-in / where b. Escalares / User Defined Function / if c. built-in / escalares / RETURNS d. Escalares / built-in / where e. built-in / escalares / else
177
Observe as afirmativas a seguir: I. As funes table-valued utilizam um nico comando SELECT para retornar um conjunto de resultados em forma de tabela, j que o datatype desse valor retornado table. Caso a funo table-valued seja inline, existir corpo de funo. O valor escalar de uma funo inline obtido a partir de um s comando, sendo que no existe corpo de funo nesse caso. J uma funo que possui vrios comandos Transact-SQL capaz de retornar um valor de qualquer datatype. As funes built-in podem ser utilizadas em comandos Transact-SQL para a obteno de informaes das tabelas do SQL Server sem a necessidade de acessar diretamente essas tabelas. Essas funes no permitem a execuo de tarefas comuns ao SQL Server, como o uso de IDENTITY.
II.
III.
9. Qual das alternativas a seguir est correta? a. As afirmativas I e III so falsas. b. Somente a alternativa III falsa. c. Todas as afirmativas so verdadeiras. d. Todas as afirmativas so falsas. e. Somente a afirmativa II falsa.
10. Que funes so tambm conhecidas como funes no-determinsticas internas do SQL Server? a. Table-Valued b. Built-in c. Escalares d. user defined functions e. Inline
178
Captulo 17
TRIGGERs
Definimos um TRIGGER como sendo um STORED PROCEDURE especfica cuja execuo ocorre no momento em que realizada uma alterao sobre os dados de uma tabela. So dois os principais tipos de TRIGGERs disponibilizados pelo SQL Server: DDL e DML. Os TRIGGERs DDL podem ser utilizados com a finalidade de realizar tarefas administrativas. Suas funes disparam STORED PROCEDURES para responder aos comandos DDL, os quais so, principalmente, iniciados com ALTER, DROP e CREATE. J TRIGGERs DML so utilizados nas situaes em que os comandos INSERT, DELETE e UPDATE realizam a alterao na tabela ou VIEWs O acionamento dos TRIGGERs ocorre de forma automtica, e eles no recebem e, tampouco, devolvem qualquer tipo de valor. Apesar disso, eles podem gerar erros com o comando RAISERROR. Os TRIGGERs podem ser criados a fim de que seu acionamento ocorra quando os comandos DML ou DDL so utilizados.
TRIGGER x Transao
Tanto o TRIGGER como o comando que o acionou so tratados como transaes. Esta transao pode ser desfeita em qualquer lugar de dentro do TRIGGER com o comando ROLLBACK TRANSACTION. Caso seja utilizado, o ROLLBACK ir desfazer tudo o que o TRIGGER tenha feito at o momento e tambm o que o comando fez antes do TRIGGER. Para que possamos ver um exemplo funcional, vamos criar duas tabelas (FUNCIONARIOS e HISTORICOS). Utilize o database MINHA_DB para esse exemplo, caso o database j possua uma tabela chamada FUNCIONARIOS, "drope-a". Elimine tambm as VIEWs associadas, caso seja necessrio. Tabela: FUNCIONARIOS COD_FUNC (INT IDENTITY) 1 2 3 4 NOME_FUNC (VARCHAR(50)) CARLOS RENATO JOAO JOANA IDADE_FUNC (TINYINT) 35 36 34 18 SAL_FUNC (DECIMAL(9,2)) 2500.00 2000.00 3000.00 1000.00
179
5 6 7
27 25 28
Tabela: HISTORICOS COD_FUNC (INT) SAL_FUNC (DECIMAL(9,2)) DATA_SAL (SMALLDATETIME) 1 2 3 4 5 6 2500.00 2000.00 3000.00 1000.00 700.00 3500.00 25/02/06 30/03/06 24/04/06 25/06/06 27/07/06 28/07/06
Com o TRIGGER demonstrado a seguir, torna-se possvel gravar os dados alterados da tabela FUNCIONARIOS na tabela HISTORICOS:
CREATE TRIGGER T_INC_HISTORICO ON FUNCIONARIOS FOR INSERT AS INSERT INTO HISTORICOS SELECT COD_FUNC, SAL_FUNC, GETDATE() FROM INSERTED GO
Agora, para que possamos ver o funcionamento do TRIGGER, inclua um novo registro na tabela funcionrios. Depois, use o comando SELECT na tabela HISTORICOS e observe os registros.
INSERT INTO FUNCIONARIOS VALUES ('MARCO',25,2000.00) GO SELECT * FROM HISTORICOS GO
180
O comando INSERT, portanto, aciona o TRIGGER que executa o cdigo interno. Este , tipo de TRIGGER, cujo acionamento ocorre no momento em que dados so inclusos na tabela, , capaz de executar internamente qualquer um dos seguintes comandos: SELECT, UPDATE, INSERT e DELETE. Os nicos comandos que no podem ser executados pelos TRIGGERs so: . CREATE (todos) DROP (todos) DISK (todos) GRANT LOAD REVOKE ALTER TABLE ALTAR DATABASE TRUNCATE TABLE UPDATE STATISTICS RECONFIGURE RESTORE DATABASE RESTORE LOG SELECT INTO
O comando TRUNCATE TABLE no capaz de realizar a execu de um TRIGGER execuo devido ao fato de no estar logado. J o comando WRITETEXT no capaz de ativar um TRIGGER, independente do fato de estar ou no logado. ,
181
TRIGGERs So Reativas
As constraints que j esto prontas podem ser adicionadas na tabela a fim de que as regras de negcios comuns sejam mantidas. J para construir regras de negcios mais complexas, preciso utilizar os TRIGGERs, os quais, diferentemente das constraints, so reativos. Isso significa que, utilizando os TRIGGERs, o SQL Server primeiramente executa o comando que o acionou e, depois, verifica a ocorrncia de erros; caso haja um erro, o comando desfeito. J as constraints so pr-ativas, ou seja, elas so verificadas pelo SQL Server a fim de assegurar que no estejam violadas antes que o comando seja executado. Caso as constraints estejam com problemas, uma mensagem de erro enviada e a operao abortada. O comando apenas executado se a constraint no apresentar problemas.
TRIGGER DDL
Para demonstrar o TRIGGER DDL, iremos criar um database chamado TESTE e uma tabela com as colunas CODIGO (INT) e TEXTO (VARCHAR(20)) chamada MINHA_TABELA.
CREATE DATABASE TESTE GO USE TESTE GO CREATE TABLE MINHA_TABELA ( CODIGO INT, TEXTO VARCHAR(20) ) GO 182
Agora criaremos um TRIGGER que ser acionado assim que o usurio tentar excluir a nossa tabela. Vejamos:
CREATE TRIGGER T_NAO_EXC_TABELA ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS PRINT 'VOC NO TEM PERMISSO DE EXCLUIR ESTA TABELA!' ROLLBACK TRANSACTION GO
TRIGGERs Aninhados
Um TRIGGER pode conter os comandos UPDATE, DELETE ou INSERT capazes de afetar outras tabelas. Quando o aninhamento est habilitado, um TRIGGER que realizar alteraes sobre uma tabela pode ativar um segundo TRIGGER, o qual, por sua vez, pode , ativar um terceiro TRIGGER e assim sucessivamente. Como podemos perceber, se o aninhamento de TRIGGERs no for bem formulado, esse poderia gerar um loop infinito no servidor causando uma possvel queda de sistema. O que no seria nada agradvel. Por este motivo, o SQL Server permite no mximo um aninhamento de 32 nveis, ou seja, caso um TRIGGER chame outro, o limite de execues so 32.
183
O anhimamento de TRIGGERs configurado no momento da instalao do SQL Server, mas tambm possvel habilitado posteriormente. Para habilitar o aninhamento de TRIGGERs, devemos usar a STORED PROCEDURE SP_CONFIGURE. Observe:
-- DESABILITA TRIGGERS ANINHADOS EXEC SP_CONFIGURE 'NESTED TRIGGERS', 0 GO -- HABILITA TRIGGERS ANINHADOS EXEC SP_CONFIGURE 'NESTED TRIGGERS', 1 GO
INSTEAD OF
Este comando responsvel por determinar que o TRIGGER DML seja executado ao invs do comando SQL ser disparado. Com isso, as aes realizadas por comandos disparadores so sobrescritas. Apenas um TRIGGER INSTEAD OF pode ser definido por tabela ou em uma VIEW por cada comando INSERT, UPDATE ou DELETE. Apesar deste aspecto, possvel definir VIEWs em outras VIEWs, cada uma delas possuindo seu prprio TRIGGER INSTEAD OF. Os TRIGGERs INSTEAD OF no podem ser especificados para TRIGGERs DDL e utilizados com VIEWs aptas a serem utilizadas e que utilizam o WITH CHECK OPTION, pois, caso isso acontea, o SQL Server gera um erro. A fim de evitar problemas com os TRIGGERs INSTEAD OF, o usurio deve utilizar a opo ALTER VIEW antes de defini-lo. Quando trabalhamos com este tipo de TRIGGER, no podemos utilizar os comandos DELETE e UPDATE em tabelas que possuem um relacionamento referencial que determina aes em cascata ON DELETE e ON UPDATE, respectivamente. Vale destacar que, no mnimo, uma das seguintes opes determinar quais comandos de alterao de dados tero a finalidade de ativar um TRIGGER DML no momento em que ele utilizado com uma tabela ou com uma VIEW. Essas opes podem no apenas serem utilizadas separadamente como em conjunto. O exemplo descrito a seguir no permite realizar a excluso de um registro da tabela:
CREATE TRIGGER T_NAO_EXCLUIR ON MINHA_TABELA INSTEAD OF DELETE AS RAISERROR ('NA NA NI NA NO...NADA FEITO!', 16, 1) GO
184
Exerccios
1. Que so TRIGGERS e onde podem ser utilizados? Resposta:
185
6. Que comandos no podem ser executados com TRIGGERs? a. CREATE(todos), DROP(todos), LOAD, INSERT b. REVOKE, ALTER TABLE, TRUNCATE TABLE, DELETE c. RECONFIGURE,SELECT INTO, UPDATE STATISTICS, INSERT d. GRANT, ALTER TABLE, INSERT, SELECT INTO e. RESTORE LOG, ALTER DATABASE, LOAD, GRANT
7. Sobre os TRIGGERs aninhados, correto afirmar que: a. No permitem controlar se possvel utilizar um TRIGGER de AFTER em cascata. b. Podemos aninh-los em infinitos nveis. c. Quando o aninhamento est habilitado, um TRIGGER que realiza alteraes sobre uma tabela pode ativar um segundo TRIGGER, o qual, por sua vez, pode ativar um terceiro e assim sucessivamente. d. Visto que os TRIGGERs fazem parte de uma transao, caso haja uma falha em qualquer um dos nveis de aninhamento dos TRIGGERs, a transao inteira ser parcialmente desfeita mas nenhuma das alteraes realizadas sobre os dados ser cancelada. e. Seja qual for o valor de configurao, os TRIGGERs INSTEAD OF no podem ser aninhados.
8. Quais alternativas so caractersticas dos TRIGGERS? a. A criao, alterao e excluso de um TRIGGER so tarefas que podem ser realizadas apenas pelo proprietrio da tabela e essa permisso no pode ser transferida. b. Os TRIGGERs podem ser criados em VIEWs ou em tabelas temporrias. c. Os TRIGGERs retornam valores. d. TRIGGERs podem ser criados apenas no banco de dados atual, mas podem fazer referncias aos objetos que se encontram fora desse banco de dados. e. Quando trabalhamos com tabelas que possuem chaves estrangeiras com uma ao DELETE/UPDATE em cascata, podemos definir os TRIGGERs dos comandos INSTEAD OF DELETE/UPDATE.
186
9. Escolha a alternativa que apresenta a palavra que deve ser inserida no espao em branco da frase a seguir: Os TRIGGERs_______ no podem ser utilizados com VIEWs que podem ser atualizadas e que utilizam WITH CHECK OPTION, pois, caso isso acontea, o SQL Server gerar um erro. a. Aninhados b. de alterao c. de excluso d. de incluso e. INSTEAD OF
10. Que comando no capaz de realizar a execuo de um TRIGGER devido ao fato de no estar logado? a. WRITETEXT b. TRUNCATE TABLE c. SET NOCOUNT d. CREATE TRIGGER e. INSTEAD OF
187
Labortorio
1. Crie um TRIGGER de incluso na tabela FUNCIONARIO, que insira uma linha na tabela PREMIO cada vez que um funcionrio do sexo feminino for inserido na tabela. O valor do prmio dever ser de 200.00. Resposta:
2. Crie um TRIGGER sobre a tabela ITENS. A cada item inserido, o TRIGGER dever calcular o valor que deve ser pago neste item e atualizar o total do pedido na tabela PEDIDO. Resposta:
188
Captulo 18
Concorrncia
Em um sistema tipo cliente/servidor, possvel a execuo simultnea e concorrente de diversas transaes em um banco de dados. Nesse sistema, o processador pode ser compartilhado pelas diversas transaes. Tudo isso reflete o que chamado de multiprogramao, um dos conceitos mais importantes do sistema cliente/servidor. A multiprogramao permite que as transaes possam compartilhar um mesmo processador e oferecer os seguintes benefcios: Maior quantidade de trabalho em um intervalo de tempo especfico, ou seja, maior quantidade de transaes throughput. Menor tempo de resposta das transaes interativas nas quais o usurio aguarda a resposta. O processador utilizado de maneira otimizada durante as transaes.
Em virtude da multiprogramao, as transaes podem ser executadas de forma concorrente em um banco de dados. Por causa dessa concorrncia, necessrio haver um controle por parte do sistema para com as interaes existentes entre as transaes concorrentes. Para tal, o sistema possui um mecanismo chamado LOCK, ou esquema de controle de concorrncia.
LOCKs
O LOCK um mecanismo desenvolvido para evitar a ocorrncia de problemas de manipulao concorrentes das informaes. Funciona como um bloqueio no acesso aos recursos dentro de um sistema cliente/servidor. Por conta dos LOCKs, um mesmo dado no pode ser utilizado simultaneamente pelos usurios. Assim, um usurio no ter a capacidade de ler e alterar dados que esto sendo processados por um outro usurio, ou seja, no haver conflitos de UPDATE.
189
Tipos de LOCKs
SHARED (S) LOCKs
So aplicados em operaes que so apenas para leitura (alterao e mudana de dados no so permitidas), como a utilizao do comando SELECT, e permitem que duas transaes possam utilizar o mesmo recurso. Duas transaes podem ter um SHARED LOCK em um mesmo recurso, mesmo que uma das transaes ainda no tenha sido finalizada. Enquanto todas as linhas que iro satisfazer a query no forem enviadas para o cliente, os SHARED LOCKs sero mantidos.
Compatveis com SHARED LOCKs, porm diferem deles, os UPDATE LOCKs so utilizados em recursos que podem ser modificados. O UPDATE LOCK adotado pelo SQL Server na alterao de pginas de dados. Quando isso feito, esse modo de LOCK promovido para o modo EXCLUSIVE LOCK, na pgina alterada. Obtidos no incio de uma atualizao, durante a leitura das pginas de dados, os UPDATE LOCKs tm a propriedade de evitar um tipo comum de DEADLOCK, cujo processo descrito a seguir: 1. Duas transaes fazem a leitura simultnea de um registro. 2. No recurso, que pode ser uma pgina ou linha, as transaes adquirem um SHARED LOCK e tentam alterar a linha ao mesmo tempo. 3. Uma das transaes tenta converter seu SHARED LOCK para EXCLUSIVE LOCK. 4. Pelo fato de EXCLUSIVE LOCK de uma transao no ser compatvel com o SHARED LOCK de outra transao, ocorre um LOCK WAIT, ou espera de converso. 5. Da mesma forma, a outra transao tenta converter seu SHARED LOCK para EXCLUSIVE LOCK. 6. Ocorre um DEADLOCK, ou seja, ambas as transaes esto aguardando que cada uma libere seus SHARED LOCKs. A fim de evitar o DEADLOCK descrito, necessrio que uma nica transao obtenha o UPDATE LOCK em um recurso, de maneira que, caso um recurso seja alterado por uma transao, tenhamos a converso do UPDATE LOCK para EXCLUSIVE LOCK. Caso no haja alterao, o LOCK convertido para SHARED LOCK.
190
Este modo de LOCK evita que duas transaes possam alterar simultaneamente um mesmo recurso. Os EXCLUSIVE LOCKs so utilizados em operaes para alterar dados, tais como INSERT, UPDATE ou DELETE.
Os INTENT LOCKs tm a finalidade de aplicar uma hierarquia de LOCK, ou LOCK hierrquico, e so usados internamente pelo SQL Server para diminuir a ocorrncia de conflitos de LOCK. Os INTENT LOCKs tm a finalidade de indicar a inteno do SQL Server em obter um tipo de LOCK INTENT ou SHARED em um determinado recurso. Quando aplicamos um INTENT LOCK no nvel de uma tabela que j possui um EXCLUSIVE LOCK para uma linha ou pgina, evitamos que uma outra transao obtenha um EXCLUSIVE LOCK nessa tabela. No caso de aplicarmos um SHARED INTENT LOCK em uma tabela, estamos informando que a inteno da transao aplicar SHARED LOCKs em linhas ou pginas dessa tabela. Uma das vantagens dos INTENT LOCK poupar o SQL Server de analisar todos os LOCKs nas linhas ou pginas de uma tabela com o objetivo de definir se transao poder alocar a tabela inteira. Isso traz um ganho de performance, j que o SQL Server precisa examinar apenas os INTENT LOCKs na tabela.
EXTENT LOCKs
Contidos em grupos de pginas do banco de dados no momento em que essas pginas esto sendo liberadas ou alocadas, os EXTENT LOCKs so adquiridos nas seguintes situaes: Durante a execuo de um comando DROP ou CREATE. Quando novas pginas de dados ou de ndices so requeridas por um comando INSERT.
O SQL Server possuir LOCKs que bloqueiam outros processos que requerem um LOCK. Esses LOCKs bloqueadores so denominados BLOCKING LOCKS. Devido ao BLOCKING LOCK, um processo poder ter continuidade logo aps o trmino do processo que est provocando o bloqueio.
191
Estes LOCKs so utilizados com a finalidade de evitar que a tabela ou ndice assim como seu esquema, seja destrudo ao ser referenciado por uma outra sesso. Os SCHEMA LOCKs podem ser de dois tipos: SCHEMA STABILITY (SCH-S) e SCHEMA MODIFICATION (SCH-M). O primeiro tipo evita a destruio de um recurso, enquanto o segundo evita que outra seo possa fazer referncia a um recurso em alterao.
Granularidade
No SQL Server podemos fazer com que uma transao possa realizar um LOCK de vrios tipos de recursos. Isso possvel por meio da alocao multigranular do Database Engine, que aloca os recursos de maneira automtica em um nvel que seja apropriado para a tarefa, o que acaba diminuindo o custo de LOCK. Fazer o LOCK em uma granularidade maior ou menor oferece vantagens e desvantagens, como explicado a seguir: Alocar em menor granularidade: Maximiza a concorrncia. As linhas so um exemplo de baixa granularidade. Porm, o LOCK apresenta uma maior overhead, j que, quanto mais linhas so alocadas, maior a quantidade de LOCKs a serem mantidos. Alocar em maior granularidade: Tabelas so exemplos de alta granularidade. Alocar uma tabela inteira acaba fazendo com que outras transaes tenham acesso restrito a qualquer parte da tabela, fato que aumenta os custos no que se refere concorrncia. Por outro lado, o overhead baixo, devido ao pequeno nmero de LOCKs mantidos. O SQL Server pode alocar os seguintes recursos: RID: Trata-se de um identificador de linhas. Este recurso tem a finalidade de fazer o LOCK individual de uma nica linha em uma tabela. PAGE: Este recurso uma pgina de 8Kbytes de dados ou de ndice. EXTENT: Este recurso compreende um grupo contguo de pginas de dados ou de ndices. TABLE: Este recurso apresenta uma tabela inteira, junto de seus dados e ndices. KEY-RANGE: Este recurso tem a finalidade de alocar ranges entre registros em uma tabela. DB: Este recurso representa um banco de dados inteiro. DB impede que um banco de dados seja removido e deve ser utilizado sempre que houver uma conexo no banco de dados.
192
Vamos supor que as mesmas informaes fossem modificadas por dois usurio diferentes. No fossem os LOCKs, apenas a ltima alterao seria registrada no banco de dados, ou seja, as alteraes de uma transao que fossem sobrescritas por alteraes de uma outra transao seriam perdidas.
UNCOMMITED DEPENDENCY
O problema de leitura suja seria provocado pelo fato de uma transao ler os dados de uma outra transao que ainda no foi confirmada. Diante dessa situao, ao invs de COMMIT TRANSACTION, a transao no confirmada poderia executar um ROLLBACK TRANSACTION.
A anlise de inconsistncia ocorre da seguinte maneira: 1. Uma segunda transao acessa a mesma linha diversas vezes, sendo que, em cada acesso, faz a leitura de dados diferentes. Trata-se de m processo semelhante ao DIRTY READ, em que uma transao modifica os dados que esto sendo lidos por uma segunda transao. importante considerar, no entanto, que na anlise de inconsistncia, a transao que fez alterao a responsvel por liberar os dados que foram lidos pela segunda transao. 2. Entre duas ou mais leituras, uma outra transao altera as informaes da linha. Da o termo NONREPEATABLE READ, pois a leitura original nunca ser repetida. H, ainda, uma inconsistncia porque cada leitura produzir valores diferentes.
PHANTOMS
Este problema poderia ocorrer caso as transaes no fossem separadas umas das outras. Vamos supor a seguinte situao: Iremos alterar de uma nica vez todos os registros de tabelas existentes em uma determinada regio. Ao mesmo tempo em que essa alterao
193
feita, um novo registro acrescentado regio por outra transao. Assim, da prxima vez que a primeira transao fizer a leitura dos registros, haver um registro a mais na leitura.
Customizando o LOCK
possvel customizar o LOCK por meio de vrias opes, vejamos: ROWLOCK: Obriga a utilizao de um LOCK de linha, que mantido pelo SQL Server at o fim do comando. Porm, ser mantido at o final da transao caso especifiquemos HOLDLOCK. PAGLOCK: Obriga a utilizao de um SHARED LOCK no nvel de pgina. Tambm mantido at o fim do comando a no ser que seja especificado HOLDLOCK. TABLOCK: O SQL Server obriga a utilizao de um SHARED LOCK na tabela. Os usurio podem ver os dados mas no podem alter-los. UPDLOCK: Utiliza um SHARED LOCK, mas sim do UPDATE LOCK no nvel de pgina durante a leitura dos dados da tabela. Quando utilizamos um UPDATE LOCK, outras transaes tem acesso a leitura mas no a escrita. TABLOCKX: Utiliza um EXCLUSIVE LOCK na tabela at o fim do comando. Impede leitura e escrita. Veja o modo de utilizao:
BEGIN TRANSACTION GO UPDATE TELEFONES WITH (TABLOCKX) SET NOME = 'JOAOZINHO' WHERE CODIGO = 2 GO COMMIT TRANSACTION GO
NOLOCK: Quando aplicada, permite a existncia, na leitura, de transaes no confirmadas ou um conjunto de pginas desfeitas e DIRTY READs. READ PAST: Uma tabela com dados bloqueados pode ser lida, sendo que teremos a exibio apenas dos dados que no esto bloqueados.
194
Por meio das especificaes de LOCK, podemos sobrepor um LOCK de seo de um determinado comando. J para especificar um TIL de um comando, podemos utilizar o comando DBCC USEROPTIONS, como mostra o exemplo:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED DBCC USEROPTIONS GO
Os nveis de isolamento so: READ COMMITTED: Este argumento, que o padro, faz com que o SQL Server utilize SHARED LOCKs em operaes de leitura. No aceita DIRTY READs.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
READ UNCOMMITTED: Exerce a mesma funo do NOLOCK, ou seja, o SQL Server obrigado a no gerar SHARED LOCKs. Aceita DIRTY READs.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
REPEATABLE READ: Esta opo evita que os dados acessados em uma query sejam alterados por outros usurios, por meio da utilizao de LOCKs nos dados. NONREPEATABLE READs e DIRTY READs no so permitidas. Pode-se acrescentar novas linhas ao conjunto, pois sero consideradas na prxima leitura. Deve ser usado somente em extrema necessidade. Pois o nvel de concorrncia menor do que o nvel de isolamento padro.
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SERIALIZABLE: Tido como o mais restritivo dos LOCKs, o SERIALIZABLE probe a alterao ou insero de novas linhas que apresentam o mesmo critrio da clusula WHERE da transao. Desta forma, impede a concorrncia de fantasmas. aconselhvel utilizar o nvel de isolamento SERIALIZABLE apenas quando necessrio.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
LOCK Dinmico
O SQL Server dispe de um meio de definir automaticamente qual o tipo de LOCK o mais adequado para as diferentes queries executadas. Isso chamado LOCK dinmico. A escolha automtica dos tipos de LOCK, alm de poupar o trabalho do DBA em ajustlos manualmente, concede aos desenvolvedores a chance de voltar seus esforos unicamente para a aplicao. Alm disso, pelo fato de o SQL Server escolher automaticamente o tipo de LOCK para cada tarefa, h uma diminuio do overhead do sistema.
195
TIMEOUT
Como visto anteriormente, uma transao que solicita um lock, mas no o obtm pelo fato de uma outra transao j possuir um LOCK conflitante no recurso, ir aguardar um determinado tempo at que consiga realizar o LOCK no recurso desejado e, desta forma, possa completar o processo. A esse tempo de espera damos o nome de TIMEOUT. possvel configur-lo por meio do seguinte comando: SET LOCK_TIMEOUT [tempo_milisegundos] A opo SET LOCK_TIMEOUT permite configurar o tempo mximo que um comando ir aguardar at que o recurso seja desbloqueado para a realizao do LOCK. Caso especifiquemos o valor de -1, o SQL Server entender que no h TIMEOUT. Podemos conferir o tempo de TIMEOUT da seo pelo comando:
SELECT @@LOCK_TIMEOUT
196
Exerccios
1. Quais so as vantagens da multiprogramao? Resposta:
4. Cite alguns procedimentos que, se praticados, podem ajudar a diminuir a incidncia de DEADLOCKS. Resposta:
197
6. Que LOCK tem a finalidade de aplicar uma hierarquia de LOCK? a. EXCLUSIVE (X) LOCKS b. UPDATE (U) LOCKS c. INTENT (I) LOCKS d. SCHEMA (SCH) LOCKS e. DEADLOCK
7. Em relao NONREPEATABLE READ correto afirmar: a. Entre duas ou mais leituras, uma outra transao altera as informaes da linha b. Um transao faz a leitura de uma nica linha por vez. c. A primeira transao nunca repete uma leitura, j que a linha no modificada pela outra transao d. Em uma nica leitura, uma outra transao altera as informaes da linha. e. A primeira transao sempre repete uma leitura, j que a linha modificada pela outra transao as cada leitura.
8. Qual das alternativas a seguir devemos utilizar para configurar um nvel de isolamente a ser aplicado na seo. a. LOCK ISOLATION LEVEL b. TRANSACT ISOLATION LEVEL c. TRANSACTION ISOLATION LEVEL d. ROLE ISOLATION LEVEL e. NOLOCK
198
Captulo 19
Distribuio de Dados
H situaes em que se faz necessria a distribuio de dados entre regies geograficamente diferentes. Para tanto, preciso implementar uma soluo que torne o ambiente mais gerencivel, visto que alguns ambientes, como o OLTP, requerem total consistncia de dados a todo o momento, ao passo que outros ambientes, como o de suporte a decises, no exigem a freqente atualizao dos dados.
Daqui tiramos que a sintaxe bsica: [comando] [parametros_comando] OPENROWSET '[nome_servidor]', '[usuario]', '[senha]', '[comando]' ) ( '[driver_conexao]',
servidor.banco_dados.schema.objeto
Observemos:
EXEC SP_ADDLINKEDSERVER @SERVER = 'SERVER', @SRVPRODUCT = 'SQL SERVER' GO
199
A Stored Procedure de Sistema, SP_ADDLINKEDSERVER, permite determinar o nome do servidor conectado, que diz respeito a um servidor virtual definido para o SQL Server com todos os dados que se fazem necessrios para realizar o acesso origem de dados OLEDB.
Nota: A STORE PROCEDURE SP_ADDLINKEDSRVLOGIN permite a realizar o mapeamento dos logins referentes ao servidor local para os logins presentes no servidor remoto.
O nome do servidor conectado pode ser utilizado com a finalidade de fazer uma referncia s tabelas remotas de vrias maneiras. Uma das formas possveis utilizar esse nome como um parmetro de entrada para a funo OPENQUERY(), suja finalidade enviar um comando para executar no provedor OLEDB. Com isso, o rowset obtido como resultado pode ser utilizado no comando Transact-SQL como referncia a uma VIEW ou a uma tabela.
Em que: SP_ADDLINKEDSERVER: Stored Procedure de Sistema capaz de definir o provedor OLEDB e especificar, no computador local, um SQL Server remoto. @SERVER: Nome do servidor ao qual se deseja conectar. @SRVPRODUCT: Produto da origem de dados OLEDB. @PROVIDER: Nome do provedor OLEDB correspondente origem de dados. @DATASRC: Refere-se ao nome da origem de dados da forma como ele interpretado pelo provedor OLEDB.
Segurana
Para estabelecer a segurana entre os servidores local e remoto da forma adequada, devemos considerar alguns fatores importantes, a destacar:
200
No momento em que um usurio efetua seu logon no servidor local e executa uma query distribuda, o servidor realiza um logon no servidor remoto em nome do usurio. Caso as informaes de logon do usurio (usurio e senha) existam nos dois servidores, o SQL Server pode conectar-se ao servidor remoto utilizando as credenciais do usurio atual.
Conforme mencionado anteriormente, a Stored Procedure de Sistema SP_ADDLINKEDSRVLOGIN permite realizar o mapeamento dos IDs de login e das senhas entre o servidor local e remoto. Portanto, esta STORED PROCEDURE dispensa a criao de um ID de login e uma senha para cada um dos usurios nos dois servidores. Observe a sintaxe descrita abaixo. Ela permite estabelecer uma conexo segura entre os dois servidores:
EXEC SP_ADDLINKEDSRVLOGIN @RMTSRVNAME = 'SERVIDOR', @USESELF = 'FALSE', @LOCALLOGIN = 'CLASSROOM\ALUNO', @RMTUSER = 'XXXX', @RMTPASSWORD = 'XXXX' GO
Em que: @RMTSRVNAME: Nome do servidor conectado para o qual est sendo realizado o mapeamento do login. @USESELF: Determina se o login do SQL Server ser realizado com suas prprias credenciais. @LOCALLOGIN: Trata-se de um ID de login do servidor local a ser utilizado em carter opcional. Vale destacar que, a fim de que possa ser utilizado, o valor definido no parmetro deve existir no servidor local. @RMTUSER: Nome do usurio. @RMTPASSWORD: Senha do usurio.
201
O acesso aos dados presentes em um servidor conectado pode ser feito a partir de um nome totalmente qualificado. Para tanto, basta utilizar como base os exemplos descritos:
SELECT * INTO #MINHA_TABELA_TEMPORARIA FROM [nome_servidor].[database].DBO.[nome_tabela] GO SELECT * FROM [nome_servidor].MASTER.DBO.SYSSERVERS GO
Podemos referenciar a funo OPENQUERY() na clusula FROM de uma query de duas formas distintas: como o nome de uma tabela ou como sendo a tabela de destino dos comandos INSERT, DELETE ou UPDATE. Isso depende dos recursos apresentados pelo provedor OLEDB.
202
A Stored Procedure de Sistema SP_SERVEROPTION permite determinar algumas opes para configurar o servidor local. Observe:
EXEC SP_SERVEROPTION @SERVER = 'SERVIDOR', @OPTNAME = 'OPCAO', @OPTVALUE = 'VALOR' GO
COLLATION COMPATIBLE, se configurado para TRUE, faz com que o SQL Server assuma que todas as colunas e CHARACTERS SETS presentes no servidor remoto so compatveis com o servidor local. (Idioma)
podem ser executadas na query distribuda apenas as operaes somente-leitura. Com isso, uma chamada stored procedure remota fazendo referncia a um servidor remoto realizada pela sesso que j se encontra registrada na transao distribuda. Para controlar se as chamadas a uma stored procedure remota realizadas em uma transao local fazem com que esta se torne uma transao distribuda cujo gerenciamento realizado pelo MS DTC, contamos com a opo SP_CONFIGURE REMOTE PROC TRANS, a qual estabelece uma instncia padro que pode ser sobrescrita por meio de REMOTE_PROC_TRANSACTIONS da opo SET no nvel da conexo. Caso a opo SP_CONFIGURE REMOTE PROC TRANS esteja configurada com o valor ON, alm de as transaes locais serem promovidas a transaes distribudas por conta da chamada a uma stored procedure remota, tais chamadas feitas locais so protegidas de forma automtica como sendo parte das transaes distribudas. Para tanto, torna-se desnecessrio reescrever aplicaes a fim de emitir o comando BEGIN DISTRIBUTED TRANSACTION.
A transao ser abortada caso haja falha em qualquer uma de suas partes. Quando isso acontece, o gerenciador no responde ao requerimento de preparao para o COMMIT ou responde simplesmente NO.
Consideraes
As transaes distribudas no so capazes de suportar o SAVE POINT. No entanto, podemos utilizar dentro delas as transaes comuns. Alm disso, o comando BEGIN DISTRIBUTED TRANSACTION no pode ser utilizado de forma aninhada, e quando utilizamos um ROLLBACK TRANSACTION toda a transao desfeita.
mtodo ITransactionJoin::JoinTransaction com a finalidade de participar de uma transao distribuda cuja coordenao feita pelo MS DTC. A fim de que o usurio possa receber notificaes a respeito do status de transaes assncronas, ele deve realizar duas tarefas: implementar a interface ITransactionOutcomeEvents e conect-la ao objeto de transao do MS DTC. Isso importante porque o MS DTC suporta processos de COMMIT e de ABORT realizados de forma assncrona sobre as transaes distribudas.
206
Exerccios
1. Como so fornecidas as informaes necessrias para acessar os dados presentes em uma origem de dados OLEDB? (o nome do provedor OLEDB e as informaes necessrias ao provedor para que ele seja capaz de encontrar a origem de dados) Resposta:
2. Que fatores devem ser levados em considerao para estabelecer a segurana entre os servidores local e remoto de forma adequada? Resposta:
3. Quais so as aes ou comandos que no podemos executar nas situaes em que o acesso a um servidor conectado feito a partir do servidor local por meio de queries distribudas? Resposta:
207
6. Para que utilizada a STORED PROCEDURE SP_ADDLINKEDSERVER? a. Ela permite realizar o mapeamento dos logins referentes ao servidor local para os logins presentes no servidor conectado. b. Permite realizar o mapeamento dos IDs de login e das senhas entre os servidores local e remoto. c. Permite executar uma transao distribuda a fim de que possamos alterar os dados presentes em um servidor remoto. d. Estabelece uma instncia padro que pode ser sobrescrita por meio de REMOTE_PROC_TRANSACTIONS da opo SET no nvel da conexo. e. Assegura que todos os gerenciadores de recursos confirmem a transao ou abortem a mesma.
7. Qual das alternativas apresenta a opo descrita no pargrafo a seguir? Trata-se de uma opo que afeta a execuo das queries no servidor conectado. Caso o valor atribudo a esta opo seja true, o SQL Server assume que todas as colunas e CHARACTER SETS presentes no servidor remoto so compatveis com o servidor local. a. DATA ACCESS b. SERIALIZABLE c. COLLATION COMPATIBLE d. READ UNCOMMITED e. READ COMMITED
8. Como funciona o protocolo TWO FASE COMMIT? a. O processo composto basicamente por duas fases: Na primeira, o MS DTC define se cada transao est pronta para realizar o COMMIT. Caso todas elas estejam, comea a segunda fase, na qual o MS DTC realiza a transmisso da mensagem de COMMIT. b. O processo composto basicamente por duas fases: Na primeira, o Activity Monitor define se cada um dos gerenciadores de recursos est pronto para realizar o COMMIT. Caso todos eles estejam, comea a segunda fase, na qual o MS DTC realiza a transmisso da mensagem de COMMIT. c. O processo composto basicamente por duas fases: Na primeira, o SQL Server Agent define se cada um dos gerenciadores de recursos est pronto para realizar o COMMIT. Caso todos eles estejam, comea a segunda fase, na qual o MS DTC realiza a transmisso da mensagem de COMMIT. d. O processo composto basicamente por duas fases: Na primeira, o MS DTC define se cada um dos gerenciadores de recursos est pronto para realizar o COMMIT. Caso todos eles estejam, comea a segunda fase, na qual o MS DTC realiza a transmisso da mensagem de COMMIT.
208
e. O processo composto basicamente por duas fases: Na primeira, o MS DTC define se cada transao est pronta para realizar o COMMIT. Caso todos eles estejam, comea a segunda fase, na qual o MS DTC realiza ROLLBACK em caso de falha.
9. Sobre as transaes distribudas, incorreto dizer que: a. As transaes distribudas no so capazes de suportar o SAVE POINT b. Quando utilizamos um ROLLBACK TRANSACTION, toda a transao desfeita c. O comando BEGIN DISTRIBUITED TRANSACTION no pode ser utilizado de forma aninhada d. No podemos utilizar dentro delas as transaes comuns e. O comando BEGIN DISTRIBUITED TRANSACTION pode ser utilizado de forma aninhada
10. Qual das alternativas apresenta as palavras que complementam corretamente o pargrafo a seguir? Quando trabalhamos em um ambiente________ contendo apenas o SQL Server, o _________ invocado de um das seguintes formas: utilizando o comando __________ ou utilizando as interfaces de programao ODBC ou OLEDB em um cliente do SQL Server. a. heterogneo / SQL Server Agent / BEGIN DISTRIBUITED TRANSACTION b. homogneo / MS DTC / BEGIN TRANSACTION c. heterogneo / Linked Server / BEGIN DISTRIBUITED TRANSACTION d. homogneo / Activity Monitor / BEGIN TRANSACTION e. heterogneo / MS DTC / BEGIN DISTRIBUITED TRANSACTION
209
Apndice
Banco de Dados de Sistema
RESOURCE
Este banco de dados possui todos os objetos de sistema do SQL Server, os quais so visualizados de forma lgica no esquema SYS de todos os bancos de dados. O RESOURCE, que um banco de dados somente leitura, no possui metadados ou dados dos usurios. Ele permite a rpida atualizao de verses e o fcil rollback dos pacotes de servios.
MASTER
O banco de dados MASTER o responsvel por efetuar os registros de todas as informaes do nvel do sistema. Sendo assim, ele registra informaes para iniciar o SQL Server, contas de login, configuraes referentes ao sistema e a existncia de outros bancos de dados e de seus arquivos. Com isso, ele possui informaes que permitem localizar os bancos de dados dos usurios. As stored procedures estendida e de sistema so criadas pelo setup dentro do MASTER.
TEMPDB
Este banco de dados responsvel por manter todos os tipos de armazenamentos temporrios, inclusive o de tabelas de carter temporrio. Ele considerado um recurso global, visto que armazena tabelas e stored procedures temporrias que podem ser acessadas por todos os usurios que se encontram conectados a instncia do SQL Server.
MODEL
utilizado como um modelo para criar todos os outros bancos de dados. Dessa forma, quando solicitamos a criao de um novo banco de dados, o SQL Server copia todos os objetos de MODEL para o novo banco de dados. Caso sejam feitas alteraes em cima do banco de dados MODEL, todos os novos bancos de dados iro herdar essas alteraes.
210
MSDB Utilizado pelo SQL Server Agent com a finalidade de registrar operadores e programar a execuo de JOBs e as configuraes de replicao. O MSDB utilizado para armazenar os dados no apenas do SQL Server Agent, mas tambm do SQL Server e SSMS. Um histrico completo de backups e restauraes on-line mantido pelo SQL Server no banco de dados MSDB.
BACKUP
Talvez uma das tarefas mais importantes do DBA seja a criao de backups. Apenas um pequeno deslize no servidor de dados e todas as informaes podem ir por gua a baixo, a no ser que o DBA, previamente, tenha feito um backup de sua base de dados. A realizao do backup no SQL Server pode ser feita de trs maneiras principais: por linha de comando atravs do SSMS, pelo passo-a-passo do SSMS ou pode meio de JOBs agendados. Veremos como fazer um backup a partir da linha de comando do SSMS. A sintaxe bsica a seguinte:
BACKUP DATABASE [nome_database] TO DISK 'X:\caminho_logico\nome_database.bak' GO
Isso ir criar um arquivo de backup no local especificado no disco. Para restaurar um backup, procedemos da forma a restaurar um database pelo passo-a-passo do SSMS. S que a localidade dos arquivos ser a localidade do arquivo de backup.
SP_RENAME '[nome_tabela].[nome_coluna]', '[novo_nome_coluna]': Renomeia uma coluna da tabela. SP_HELPINDEX [nome_tabela]: Trs informaes sobre o ndice da tabela.
212