You are on page 1of 17

Gerenciando Usuários e Permissões no PostgreSQL

A segurança dos sistemas de informação engloba um número elevado de áreas que poderão estar
sob a responsabilidade
de uma ou várias pessoas. Entre estas áreas encontram-se a segurança de redes, a segur
ança física, a segurança de
computadores, a segurança das aplicações, a segurança da informação etc.

O responsável pela implementação da segurança dos sistemas de informação em uma organização p
ui como primeira
missão, e mais importante, a garantia da segurança da informação que protege. Esta garan
tia é conseguida
mediante a utilização de vários instrumentos.
Uma política de backup e recuperação de dados adequadamente elaborada e executada prot
egerá a
organização contra a perda de informação devido a falhas de hardware, defeitos de softwa
re, erros humanos,
intrusos, sabotagem e desastres naturais. Entretanto, esta não é a única maneira exist
ente de proteção das
informações. Afinal, precisamos mais do que uma solução relativa ao acontecimento de fal
has.
Quando se trata de proteger informações guardadas em banco de dados, nos preocupamos
em que dados proteger
e como protegê-los. Os SGBD’s atuais nos fornecem poderosas ferramentas que auxiliam
em tais tarefas.
Sendo os bancos de dados sistemas de armazenamento de informação, e sendo esta um el
emento de elevado valor,
quer seja financeiro, quer seja estratégico, é necessário que haja algum tipo de contr
ole de acesso a essa
informação.
Para mantermos a integridade das informações e realizarmos auditoria das mesmas, pod
emos utilizar
os recursos dos gatilhos. Além disso, podemos fazer uso de uma linguagem especial
para controle de acesso
e permissão aos dados. Esta linguagem é a DCL (Data Control Language – Linguagem de Co
ntrole de Dados).
Ela é um subconjunto da SQL para o controle de permissões dos usuários aos objetos do
banco de dados.
Todo agrupamento de bancos de dados possui um conjunto de usuários de banco de dad
os.
Estes usuários são distintos dos usuários gerenciados pelo sistema operacional onde o
servidor executa.
Eles possuem objetos de banco de dados (por exemplo, tabelas, visões etc.), e pode
m conceder privilégios
nestes objetos para outros usuários controlando, assim, quem pode acessar qual obj
eto.
A DCL controla os aspectos de autorização de dados e licenças de usuários para controlar
quem tem acesso
para ver ou manipular dados dentro do banco de dados. Os nomes dos usuários de ban
co de dados são globais
para todo o agrupamento de bancos de dados (e não apenas próprio de cada banco de da
dos).

Maiores informações consulte o manual. Abaixo segue a sinopse do comando. . Para remover um usuário que possui um banco de dados. hoje é apenas um alias para o comando CREATE ROLE que veremos mais adiante.. A sinopse do comando de criação de um usuário es tá exibido abaixo. esse comando não remove as tabelas. Maiores informações consulte o manual. primeiro remove-se o banco d e dados ou muda-se o dono do mesmo.. visões ou outros objetos pertencentes ao us uário. o comando DROP USER remove o usuário especificad o. ] ] onde opção pode ser:   SYSID id_do_usuário CREATEDB | NOCREATEDB CREATEUSER | NOCREATEUSER IN GROUP nome_do_grupo [. que servem para manipular objetos do SGBD. uma mensagem de erro será gerada. nome_usuário refere-se ao usuário que está sendo removido. Este comando já foi muito utilizado. mas mesmo ainda funcionando. existem usuários que são independentes do sistema operacional. Se o usuário possuir algum banco de dados.Criação de Usuário de Banco de Dados – CREATE USER Como foi mencionado. . Porém..] [ ENCRYPTED | UNENCRYPTED ] PASSWORD VALID UNTIL data_e_hora senha       | | | | | Removendo um Usuário no Banco de Dados – DROP USER Uma vez criado no banco de dados.. CREATE USER Nome CREATE USER — cria uma conta de usuário do banco de dados Sinopse CREATE USER nome [ [ WITH ] opção [ . No PostgreSQL existe o comando CREATE USER que adiciona um novo usuário no bancos de dados. DROP USER Nome DROP USER — remove uma conta de usuário do banco de dados Sinopse DROP USER nome Neste caso.

seja para alterar sua senha ou validade da mesma ou para incluir a permissão de criação de usuários ou retirá-la. os grupos são uma forma lógic a de juntar usuários para facilitar o gerenciamento de privilégios. ou revogados. Tais privilégios podem ser concedidos. para o grupo como um todo. ] nome_do_grupo RENAME TO novo_nome . como mostrado a seguir. ] ] onde opção pode ser: senha     CREATEDB | NOCREATEDB | CREATEUSER | NOCREATEUSER | [ ENCRYPTED | UNENCRYPTED ] PASSWORD | VALID UNTIL data_e_hora     ALTER USER nome RENAME TO novo_nome ALTER USER nome SET parâmetro { TO | = } { valor | DEFAULT } ALTER USER nome RESET parâmetro Conceitos de Grupos de Usuários no PostgreSQL Assim como nos sistemas operacionais baseados em Unix.. caso exista etc.... . ALTER GROUP Nome ALTER GROUP Sinopse ALTER GROUP ALTER GROUP ALTER GROUP — altera um grupo de usuários nome_do_grupo ADD USER nome_do_usuário [.. O comando para modificar um usuário é o ALTER USER... ALTER USER Nome ALTER USER — altera uma conta de usuário do banco de dados Sinopse ALTER USER nome [ [ WITH ] opção [ . Para criar um grupo. ] nome_do_grupo DROP USER nome_do_usuário [. . ..Alterando um Usuário – ALTER USER Em alguns casos.. CREATE GROUP Nome CREATE GROUP — cria um grupo de usuários Sinopse CREATE GROUP nome [ [ WITH ] opção [ . respectivamente. deve ser utilizado o comando CREATE GROUP. é conveniente modificar um usuário. ] ] onde opção pode ser: SYSID id_do_grupo | USER nome_do_usuário [..] Podemos adicionar ou remover usuários em um grupo existente utilizando o comando A LTER GROUP.

remove e altera usuários em um grupo. ALTER GROUP nome_do_grupo DROP USER nome_do_usuário. ALTER GROUP nome_do_grupo RENAME TO novo_nome.. O conceito de "papéis" (roles) que veremos adiante é semelhante ao de grupos . dependendo de como é utilizado. modificar um grupo.. Alterando Grupos no PostgreSQL – ALTER GROUP Assim como podemos modificar um usuário criado no banco de dados. O exemplo abaixo adiciona. ou ambos. Para fazermos isso.Uma vez criado um grupo.define a new database role Synopsis CREATE ROLE name [ [ WITH ] option [ . Abaixo a sinopse. Criando Papéis (roles) no PostgreSQL – CREATE ROLE O comando CREATE ROLE adiciona um novo papel (role) ao agrupamento de bancos de dados do PostgreSQL. da mesm a forma. ] ] where option can be: SUPERUSER | NOSUPERUSER . Uma coisa importante que deve ser comentada é que não existe o comando CREATE GROUP no padrão SQL. ALTER GROUP nome_do_grupo ADD USER nome_do_usuário. O papel é uma entidade que pode possuir objetos do banco de dados e possuir privilég ios do banco de dados. Ele pode ser considerado como sendo um "usuário". CREATE ROLE Name CREATE ROLE -. respectivamente. DROP GROUP Nome DROP GROUP — remove um grupo de usuários Sinopse DROP GROUP nome O comando DROP GROUP remove os grupos. mas não remove os usuários membros do grupo. utilizamos o comando ALTER GROUP. ainda podemos removê-lo. podemos. um "grupo". O comando CREATE ROLE é o substituto dos comandos CREATE USER e CREATE GROUP por p ossuir mais recursos que os mesmos. Tal operação pode ser feita usando o comando DROP GROUP.

remove a database role Synopsis DROP ROLE [ IF EXISTS ] name [. poderá facilmente criar um papel com privilégios diferentes do próprio p apel (exceto criar papéis com privilégio de super-usuário). é necessário remover todos os objetos pertencentes ao mesm o (ou mudar o dono). Removendo um Role – DROP ROLE O comando DROP ROLE remove os papéis especificados. Antes de remover o papel. ... Assim será lançado um erro caso tente-se removê-lo.change a database role Synopsis ALTER ROLE name [ [ WITH ] option [ . DROP ROLE Name DROP ROLE -.] O papel não poderá ser removido se ainda estiver sendo referenciado em qualquer banc o de dados do agrupamento... .] SYSID uid password       | | | | | | | | | | | | | | | Deve ser tomado cuidado com o privilégio CREATEROLE. ] ] where option can be: SUPERUSER | NOSUPERUSER . . Não existe o conceito de herança para os privilégios do papel com CREATEROLE.] USER role_name [.] ADMIN role_name [... Isto significa que mesmo que o papel não possua um determinado privilégio.  CREATEDB | NOCREATEDB CREATEROLE | NOCREATEROLE CREATEUSER | NOCREATEUSER INHERIT | NOINHERIT LOGIN | NOLOGIN REPLICATION | NOREPLICATION CONNECTION LIMIT connlimit [ ENCRYPTED | UNENCRYPTED ] PASSWORD VALID UNTIL timestamp IN ROLE role_name [..... . . ALTER ROLE Name ALTER ROLE -. Alterando um Role – ALTER ROLE O comando ALTER ROLE altera os atributos de um papel do PostgreSQL..] IN GROUP role_name [. mas tenh a permissão para criar outros papéis.. .. e revogar todos os privilégios concedidos pelo papel.] ROLE role_name [..

UPDATE. UPDATE . Abaixo segue a modificação de um dono de uma tabela de um banco de dados. devem ser concedidos privilégios aos mesmos . existe o comando GRANT. SELECT Permite consultar qualquer coluna da tabela. REFERENC ES. O dono é o usuário que executou o comando de criação do objeto. TEMPORARY. visão ou seqüência especificada. visão. é atribuído um dono ao mesmo. Para mudar o dono de uma tabela. ALTER TABLE nome_da_tabela OWNER TO novo_dono Por padrão. DELETE. função. TRIGGER. linguagem procedural. seqüência ou visão deve ser utilizado o comando ALTER TABLE. Em SQL. índice. INSERT Permite inserir novas linhas na tabela especificada.  CREATEDB | NOCREATEDB CREATEROLE | NOCREATEROLE CREATEUSER | NOCREATEUSER INHERIT | NOINHERIT LOGIN | NOLOGIN REPLICATION | NOREPLICATION CONNECTION LIMIT connlimit [ ENCRYPTED | UNENCRYPTED ] PASSWORD VALID UNTIL timestamp password       | | | | | | | | | ALTER ROLE name RENAME TO new_name ALTER ROLE name [ IN DATABASE = } { value | DEFAULT } ALTER ROLE name [ IN DATABASE URRENT ALTER ROLE name [ IN DATABASE ALTER ROLE name [ IN DATABASE database_name ] SET configuration_parameter { TO | database_name ] SET configuration_parameter FROM C database_name ] RESET configuration_parameter database_name ] RESET ALL O comando ALTER ROLE pode modificar um role. Concedendo e Revogando Privilégios no PostgreSQL Quando um objeto do banco de dados é criado. INSERT. USAGE e ALL PRIVILEGES. Ele possui duas funcionalidades básicas: conceder privilégios para um objeto do banco de dados (tabela. CREATE. banco de dados. somente o dono (ou um super-usuário) pode fazer qualquer coisa com o obj eto. EXECUTE. Para permitir o uso por outros usuários. RULE. seqüência. Existem vários privilégios distintos: SELECT. esquema e espaço de tabelas) e conceder o privilégio de ser membro de um papel. Também per mite utilizar o comando COPY TO. Também permite utilizar o com ando COPY FROM.

EXECUTE Permite utilizar a função especificada e qualquer operador implementado utilizando a função. Essencialmente. embora seja requerida pelo SQL. permite o uso da linguagem especificada para cri ar funções nesta linguagem.Permite modificar os dados de qualquer coluna da tabela especificada. USAGE Para as linguagens procedurais. TRIGGER Permite criar gatilhos na tabela especificada CREATE Para bancos de dados. Este é o único tipo de privilégio aplicável às linguagens procedurais. e permite a criação de bancos de dados possuindo este espaço de tabelas como seu espaço de tabelas padrão (Deve ser observado que revogar este privilégio não altera a colocação dos objetos exist entes). A palavra chave PRIVILEGES é opc ional no PostgreSQL. REFERENCES Para criar uma restrição de chave estrangeira é necessário possuir este privilégio. tanto na tabela que faz referência quanto na tabela que é referenciada. TEMPORARY TEMP Permite a criação de tabelas temporárias ao usar o banco de dados. Em alguns casos também se torna necessário revogar alguns privilégios de acesso a usuári os ou grupos de usuários. . Para mudar o nome de um objeto existente é necessário ser o dono do objeto e possuir este privilégio no esquema que o contém. Para os esquemas. DELETE Permite excluir linhas da tabela especificada. permite a criação de novos esquemas no banco de dados. concede a quem recebe o direito de "procurar" por objetos dent ro do esquema. Para esquemas. permite acessar os objetos contidos no esquema especificado (assumindo que os privilégios requeridos para os próprios objetos estejam atendidos) . ALL PRIVILEGES Concede todos os privilégios disponíveis de uma só vez. RULE Permite criar regras para uma tabela ou para uma visão. permite a criação de novos objetos no esquema. Para espaços de tabelas (TABLESPACE). permite a criação de tabelas e índices no espaço de tabelas. Este é o único tipo de privilégio aplicável às funções (Esta sintaxe funciona para as funções gregação também).

... REVOKE (revogar).. .. ..] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [.] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [. Se um super-usuário decidir submeter o comando GRANT ou REVOKE.] [ WITH GRANT OPT ION ] GRANT { { CREATE | TEMPORARY | TEMP } [.. .... . ... utiliza-se o comando REVOKE. GRANT Nome GRANT — define privilégios de acesso Sinopse GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [....] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [.] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [.]) [. .. .. não é aconselhável ope rar como um super-usuário a não ser quando for absolutamente necessário.... . o comando será execu tado como se tivesse sido submetido pelo dono do objeto afetado.] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [. . .] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [.. Assim. Em particular. .] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [. não podendo ser concedidos ou revogados. o direito de DROP (remover). o PostgreSQL não suporta conceder ou revogar privilégios para as colunas da tabela individualmente.... Deve ser observado que os super-usuários do banco de dados podem acessar todos os objetos. então..] [ WITH GRANT OPT ION ] GRANT { { CREATE | USAGE } [.] [ WITH GRANT OPT ION ] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE nome_do_espaço_de_tabelas [..] [ WITH GRANT OPT ION ] ... GRANT (conceder). etc. . Uma forma simples de contornar isso seria criar uma visão contendo apenas as colun as desejadas e. conceder os privilégios para a visão. os privilégios concedidos at ravés destes comandos aparecerão como se tivessem sido concedidos pelo dono do objeto..) são sempre implícitos ao fato de ser o dono.] TO { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [...] [ WITH GRANT OPT ION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nome_da_função ([tipo.Para que isso seja feito. Atualmente..] | ALL [ PRIVILEGES ] } ON DATABASE nome_do_banco_de_dados [...] [ WITH GRANT OPT ION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [.. Os privilégios especiais do dono da tabela (ou seja.. independentemente dos privilégios definidos para o objeto.

. ...... atendimento e serviço.]) [. ...] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [.. foi considerado que cada cliente pode realizar várias reservas e várias hospedagens. a cada hospedagem. ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE nome_do_espaço_de_tabelas [.] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [. No exemplo.. hospedagem. Neste banco de dados.).] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION nome_da_função ([tipo.] | ALL [ PRIVILEGES ] } ON DATABASE nome_do_banco_de_dados [........ .... . foi criado um banco de dados de um hotel fictício.. Este banco de dados possui as tabelas cliente.] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [.. quarto..] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [. ..] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [....] FROM { nome_do_usuário | GROUP nome_do_grupo | PUBLIC } [. . suíte luxo etc.] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | TEMPORARY | TEMP } [.] | ALL [ PRIVILEGES ] } ON SCHEMA nome_do_esquema [.] [ CASCADE | RESTRICT ] Para demonstrar o controle de permissões de acesso aos objetos de um banco de dados no PostgreSQL. Além de.. ...] | ALL [ PRIVILEGES ] } ON [ TABLE ] nome_da_tabela [.. além das tabelas foram criadas três funções e uma . tipo_quarto. .. . solicitar várias serviços. suíte casal.REVOKE Nome REVOKE — revoga privilégios de acesso Sinopse REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [. Ainda é interessante notar que os quartos podem ser de tipos diferentes (apartamento simples. reserva. .. ..] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [.] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_da_linguagem [.

Role Gerente É o grupo de usuário que pode modificar todos os registros de todas as tabelas e utilizar as funções adicionaReserva. descricao VARCHAR(40) NOT NULL. Além das funções mencionadas. chamada adicionaHospedagem. CREATE TABLE tipo_quarto( id_tipo SERIAL NOT NULL. que exibe apenas os nomes e os sexos dos clientes. andar CHAR(10). enquanto estiverem hospedados. PRIMARY KEY (id_tipo) ). Role Atendente É o grupo de usuários que pode manipular apenas as funções adicionaReserva. telefone NUMERIC(10. . valor NUMERIC(9. Role Estagiário É o grupo de usuário que só tem acesso a visão listaClientes. será responsável por registrar os pedidos feito s pelos clientes. descartando o RG e o telefone dos mesmos. A primeira função é chamada de adicionaReserva e serve para realizar a reserva de um determinado quarto para um cliente.   insert into tipo_quarto values (default. existe a visão listaClientes. denominada realizaPedido.0). adicionaHospedagem e realizaPedido.visão. Uma outra função.   CREATE TABLE quarto( num_quarto INTEGER NOT NULL. além de poder dar direitos de acesso aos demais usuários.2) NOT NULL.00). Implementação do Banco de Dados Hotel no PostgreSQL CREATE TABLE cliente( rg NUMERIC NOT NULL. adicionaHospedagem e realizaPedidos. 100. sexo CHAR(1) NOT NULL. A visão listaClientes foi criada para demonstrar a permissão de acessar apenas algumas colunas de uma determinada tabela. nome VARCHAR(40) NOT NULL. suite . A última função. cria uma hospedagem para o cliente em um quarto. Também foram criados alguns roles e foram dadas permissões diferentes de acesso aos dados para os mesmos. PRIMARY KEY (rg) ).

CREATE TABLE atendimento( id_atendimento SERIAL NOT NULL. rg NUMERIC NOT NULL. CREATE TABLE reserva( id_reserva SERIAL NOT NULL. data_saida DATE. PRIMARY KEY (id_atendimento). FOREIGN KEY (num_quarto) REFERENCES quarto (num_quarto) ON UPDATE RESTRICT ON DELETE RESTRICT ). -. FOREIGN KEY (id_servico) REFERENCES servico (id_servico) ON UPDATE RESTRICT ON DELETE RESTRICT. FOREIGN KEY (id_tipo) REFERENCES tipo_quarto (id_tipo) ON UPDATE RESTRICT ON DELETE RESTRICT ). status CHAR(1) NOT NULL DEFAULT A . id_hospedagem INTEGER NOT NULL. PRIMARY KEY (id_hospedagem). FOREIGN KEY (rg) REFERENCES cliente (rg) ON UPDATE RESTRICT ON DELETE RESTRICT. qtd_dias INTEGER NOT NULL.Ativa PRIMARY KEY (id_reserva). default). descricao VARCHAR(60) NOT NULL. status CHAR(01) NOT NULL DEFAULT D . FOREIGN KEY (id_hospedagem) REFERENCES hospedagem (id_hospedagem) ON UPDATE RESTRICT ON DELETE RESTRICT ). data_entrada DATE NOT NULL.     insert into quarto values (1. 10. rg NUMERIC NOT NULL.Disponível PRIMARY KEY (num_quarto). status CHAR(1) NOT NULL. -. lavar roupa .     insert into servico values (default. data_entrada DATE NOT NULL.id_tipo INTEGER NOT NULL. FOREIGN KEY (rg) REFERENCES cliente (rg) ON UPDATE RESTRICT ON DELETE RESTRICT. CREATE TABLE servico( id_servico SERIAL NOT NULL.     CREATE TABLE hospedagem( id_hospedagem SERIAL NOT NULL. FOREIGN KEY (num_quarto) REFERENCES quarto (num_quarto) ON UPDATE RESTRICT ON DELETE RESTRICT ). . 1. dt_reserva DATE NOT NULL.00). PRIMARY KEY (id_servico) ). valor NUMERIC(9.2) NOT NULL. id_servico INTEGER NOT NULL. num_quarto INTEGER NOT NULL. num_quarto INTEGER NOT NULL. 1.

* from cliente into cliente values (123. numero_quarto int) RETURNS void AS $$ begin perform * from cliente where rg = rg_cliente. data. Para se fazer isto no PL/pgSQL é utilizada a instrução PERFORM: PERFORM comando. $$ LANGUAGE plpgsql SECURITY DEFINER. update quarto set status = R where num_quarto = 1. dias int. * from quarto into quarto values (1. end if. A instrução deve ser escrita d a mesma maneira que se escreve um comando SELECT do SQL. numero_quarto int .                         select adicionaHospedagem(123. update quarto set status = O where num_quarto = numero_quarto. if found then perform * from quarto where upper(status) = D and num_quarto = numero_qu arto. else RAISE EXCEPTION Cliente nao consta no cadastro! .1) drop function adicionaReserva(rg_cliente numeric. end if.             . else RAISE EXCEPTION Quarto indisponivel para hospedagem! . rg_cliente. if found then insert into reserva values (default. CREATE OR REPLACE FUNCTION adicionaHospedagem(rg_cliente numeric. 1         select insert select insert Nota: Algumas vezes se deseja avaliar uma expressão ou comando e desprezar o resul tado (normalmente quando está sendo chamada uma função que produz efeitos colaterais. dias int) CREATE OR REPLACE FUNCTION adicionaReserva(rg_cliente numeric. rg_cliente. dias. ana . if found then insert into hospedagem values (default. current_dat e. numero_quarto. Além disso. A ). numero_quarto. f . if found then perform * from quarto where upper(status) = D and num_quarto = numero_qu arto. numero_quarto int. A ). 1. null. As variáveis da linguagem PL/pgSQL são substituídas no comando da maneira usual. data date) RETURNS void AS $$ begin perform * from cliente where rg = rg_cliente. ou falso se não produzir nenhuma linha. RAISE NOTICE Hospedagem realizada com sucesso! . mas não possui nenhum valor de resultado útil). curre nt_date. Esta instrução executa o comando e despreza o resultado. 123456). a variável especial FOUND é definida como verdade se a instrução produzir pel o menos uma linha. end. mas com a palavra chave inicial SELECT sub stituída por PERFORM.

else RAISE EXCEPTION Servico indisponivel! . if found then     RAISE NOTICE Pedido realizado com sucesso! . identifi cador_hospedagem). CREATE VIEW listaClientes (nome_cliente. end. Por esse motivo.             end if. 1. else RAISE EXCEPTION Cliente nao consta no cadastro! . foi criada uma visão que permite apenas visualizar apenas o nome e o sexo dos clientes. o RG e o tefefone. como. $$ LANGUAGE plpgsql SECURITY DEFINER. $$ LANGUAGE plpgsql SECURITY DEFINER. identificador_servico.sexo) AS SELECT nome. . por exemplo.         end if. mais adiante. CREATE ROLE gerente. end if. CREATE ROLE atendente. else RAISE EXCEPTION Hospedagem nao consta no cadastro ou ja foi desativada! . else RAISE EXCEPTION Quarto indisponivel para reserva! . insert into atendimento values (default. end. identifi cador_hospedagem integer) RETURNS void AS $$ begin perform * from hospedagem where upper(status) = A and id_hospedagem = iden tificador_hospedagem.2) Não é interessante que alguns usuários acessem todas as informções sobre os clientes. sexo FROM cliente Tendo definido os três tipos de usuários que terão acesso aos objetos do banco de dados. 3) CREATE OR REPLACE FUNCTION realizaPedido(identificador_servico integer.RAISE NOTICE Reserva realizada com sucesso! . daremos as permissões que têm direito. select adicionaReserva(123. if found then perform * from servico where id_servico = identificador_servico. agora criaremos cada um e.     end if. select realizaPedido(1.

date) FROM PUBLIC. temos que dar as permissões para cada tipo.int. Esta opção serve para permitir que todos os usuários acessem essas funções com a mesma permissão de quem as criou. deve-se revogar o direito de qualquer usuário do banco executar tais funções. podemos agora dar as permissões de acesso para cada um dos grupos de usuários.CREATE ROLE estagiario. atendente e estagiário. Para resolver este problema. listaClientes TO gerente WITH GRANT OPTION.int) FROM PUBLIC. servico. adicionaReserva e realizaPedido pelos usuários. além de acessar as funções adicionaReserva. O papel gerente poderá modificar todos os registros de todas as tabelas. Feito isso. hospedagem. atendimento. REVOKE ALL ON FUNCTION adicionaHospedagem(numeric. tipo_quarto. Concedendo permissão para o role gerente para acessar a função adicionaHospedagem GRANT EXECUTE ON FUNCTION adicionaHospedagem(numeric. reserva.int) FROM PUBLIC. então não poderiam executá-las. de acordo com o que foi definido anteriormente.int) TO gerente. Concedendo permissão para o role gerente acessar todas as tabelas e conceder permissões para outros usuários GRANT SELECT. foram criadas todas as funções com a opção SECURITY DEFINER. e antes de dar a permissão de execução para os grupos gerente. porque na sua definição existem consultas que buscam valores que estão em algumas tabelas como clientes e quartos e esses grupos de usuários não têm permissão para acessa-las. Depois de criarmos todos os papéis que irão agrupar todos os usuários com perfis semelhantes. são esses: REVOKE ALL ON FUNCTION adicionaReserva(numeric. Antes de dar as permissões sobre as funções é importante explicar a opção SECURITY DEFINER usada na criação das três funções. Isto é muito importante. . adicionaHospedagem e a visão listaClientes. os grupos atendente e estagiário não executariam a função adicionaHospedagem. quarto. REVOKE ALL ON FUNCTION realizaPedido(int. Por exemplo.int. INSERT ON cliente. Os comandos que revogam o execução das funções adicionaHospedagem. pois os usuários dos grupos atendente e estagiário não têm acesso às tabelas do banco de dados hotel.

Concedendo permissão para o role estagiário acessar a visão listaCliente GRANT SELECT ON listaClientes TO estagiario.int) TO atendente. a visão e os usuários criados.int.date) TO gerente. . Concedendo permissão para o role gerente para acessar a view listaClientes GRANT SELECT ON listaClientes TO gerente O grupo de usuários atendente não pode ter acesso a nenhuma tabela. Com o banco de dados.int.Concedendo permissão para o role gerente para acessar a função adicionaReserva GRANT EXECUTE ON FUNCTION adicionaReserva(numeric.int. Concedendo permissão para o role atendente para acessar a função adicionaReserva GRANT EXECUTE ON FUNCTION adicionaReserva(numeric.date) TO atendente.int) TO gerente.int. Concedendo permissão para o role gerente para acessar a função realizarPedido GRANT EXECUTE ON FUNCTION realizaPedido(int.int) TO atendente. já podemos realizar testes para verificar se o que foi permitido para cada tipo de usuário está de acordo com cada um dos seus perfis. Simulando Testes para Validar as Permissões Com todos os papéis criados. as funções. iremos realizar alguns testes para validar as permissões que foram concedidas para cada um dos papéis. Ele pode apenas acessar as funções adicionaHospedagem. Concedendo permissão para o role atendente para acessar a função adicionaHospedagem GRANT EXECUTE ON FUNCTION adicionaHospedagem(numeric. Concedendo permissão para o role atendente para acessar a função realizaPedidos GRANT EXECUTE ON FUNCTION realizaPedido(int. adicionaReserva e realizaPedidos.

f . como por exemplo. Ela pertencerá ao grupo de estagiários. DELETE. Porém.     CREATE ROLE vitoria LOGIN PASSWORD Com o usuário tonho logado. conforme Figura 4. tenta-se utilizar a função adicionaReserva.Em um primeiro momento. Criação de usuário com papel de atendente 333 IN ROLE estagiario.         Se usuário também tentar realizar qualquer operação (SELECT. Quando este usuário tenta executar o comando de inclusão de um novo cliente. O parâmetro “LOGIN” permite que o usuário possa logar no sistema e o parâmetro “PASSWORD” atribui a senha ‘111’ para o mesmo. atendente e estagiário). drop table cliente Agora com o usuário maria logado. . Abaixo a criação do um usuário chamado tonho e que pertencerá ao grupo de usuários gerente . select * from cliente insert into cliente values (456. Criação de usuário com papel de atendente 222 IN ROLE atendente. conforme Figura 2. INSERT) com qualquer uma das tabelas.     CREATE ROLE maria LOGIN PASSWORD O último usuário criado é a vitoria. Criação de usuário com papel de gerente 111 IN ROLE gerente. o sistema executará o comando normalmente. o mesmo não ocorrerá. o sistema executa o comando normalmente. bia . pode-se realizar todas as operações com as tabelas. exceto operações próprias dos donos dos objetos. o comando abaixo cria o usuário maria com direito de logar no sistema. 23232). UPDATE. mas agora pertencendo ao grupo de atendentes. caso ele tente remover uma tabela do banco de dados.     CREATE ROLE tonho LOGIN PASSWORD Por sua vez. remover uma tabela (DROP TABLE). serão criados três usuários pertencentes a cada um dos papéis/gr upos criados (gerente.

2013-10-10 )     select adicionaReserva(123. Usuário maria tentando selecionar os registros da tabela reserva select * from reserva Por último. select * from cliente . 3. 12. O mesmo não ocorreria caso ele tentasse consultar diretamente a tabela cliente Usuário vitória tentando consultar diretamente a tabela cliente. O mesmo não aconteceria se esse usuário tentasse acessar diretamente a tabela reserva. tenta-se consultar a visão listaClientes Usuário vitória acessando a visão listaClientes select * from listaclientes Verifique que vitoria não teve problema porque o seu perfil tem permissão para consultar somente a visão listaClientes. com o usuário vitoria. porque o seu perfil não tem permissão para isto.