Fala pessoal,
Nesse post vou compartilhar mais um Caso do Dia a Dia, dessa vez mostrando alguns casos em que o default schema não funciona.
Casos do Dia a Dia – Default Schema:
Fiz um outro post em 2020 explicando como o Default Schema pode ser utilizado e mostrei alguns exemplos. Esse post ficou bem legal, recomendo a leitura!
https://luizlima.net/casos-do-dia-a-dia-default-schema-e-default-database/
No post de hoje, vou mostrar alguns casos em que o default schema não vai funcionar, mesmo que aparentemente a configuração esteja correta.
Primeiro, criei uma database chamada “Test_Schema” e um schema chamado “test”.
1 2 3 4 |
USE [Test_Schema] GO CREATE SCHEMA [test] AUTHORIZATION [dbo] GO |
Depois criei um usuário no Windows chamado “NODE1\test” e liberei o acesso “db_owner” na database “Test_Schema” e alterei o Default Schema para “test”.
OBS: O nome da minha máquina de teste é NODE1.
Por fim, conectei com esse usuário e executei o script abaixo para criar uma tabela, inserir um registro e fazer um SELECT, para mostrar que até aqui está tudo OK. Repare que eu não especifiquei o default schema no script e mesmo assim a tabela foi criada como “test.test_schema”, pois utilizou o default schema do usuário.
1 2 3 4 5 6 7 8 9 10 11 12 |
USE Test_Schema CREATE TABLE test_schema ( ID INT IDENTITY(1,1), NOME VARCHAR(100) ) INSERT INTO test_schema VALUES ('Luiz Lima') SELECT * FROM test_schema |
Agora vou mostrar dois casos em que o default schema vai “parar de funcionar”, mesmo estando configurado para o usuário “NODE1\test”. Inclusive, resolvi criar esse post após entender esse caso atendendo um cliente aqui na Power Tuning, onde ele informou que alguns usuários estavam funcionando corretamente e outros não.
Caso 1 – Server Role “sysadmin”:
Agora vou colocar o usuário “NODE1\test” com a permissão “sysadmin”. Com isso, o default schema vai “parar de funcionar”.
Essa questão do “sysadmin” já está documentada pela Microsoft:
“The value of DEFAULT_SCHEMA is ignored if the user is a member of the sysadmin fixed server role. All members of the sysadmin fixed server role have a default schema of dbo.”
Segue abaixo o erro:
1 2 3 4 |
USE Test_Schema SELECT * FROM test_schema |
Msg 208, Level 16, State 1, Line 3
Invalid object name ‘test_schema’.
Portanto, caso o usuário fique com a permissão de “sysadmin”, será necessário incluir SEMPRE o schema nos objetos, pois o default schema será ignorado, conforme informado na documentação da Microsoft.
1 2 3 4 |
USE Test_Schema SELECT * FROM test.test_schema |
Caso 2 – Grupos do Windows / AD
Agora vamos para o segundo cenário, que é o mesmo que tive com um cliente aqui na Power Tuning. Nesse caso, exclui o login do usuário “NODE1\test” do SQL Server e criei dois grupos no Windows e no SQL Server:
- NODE1\SQL_DEV: possui acesso de “db_owner” na database “Test_Schema”.
- NODE1\SQL_ADM: possui acesso de “sysadmin” na instância.
Portanto, agora o usuário “Node1\test” vai herdar as permissões do grupo que ele pertencer. Nesse caso, inicialmente inclui ele apenas no grupo “NODE1\SQL_DEV”.
Com isso, ele vai conseguir utilizar normalmente o default schema sem precisar informar no script.
1 2 3 4 |
USE Test_Schema SELECT * FROM test_schema |
Agora, vou incluir esse usuário em mais um grupo, dessa vez no grupo “NODE1\SQL_ADM”.
OBS: Será necessário fazer logoff e logar novamente no Windows com o usuário “NODE1\test” para utilizar as novas permissões, conforme informado no print abaixo.
Por fim, ao fazer o SELECT novamente vamos ter o ERRO, pois agora ele faz parte de um grupo que possui a permissão de “sysadmin” e o default schema será ignorado.
1 2 3 4 |
USE Test_Schema SELECT * FROM test_schema |
Cliente: “Luiz, o default schema está configurado, mas tem usuários que estão funcionando e outros não! Pode me ajudar?”
Nesse caso, validamos que o motivo de não funcionar para alguns usuários era porque eles estavam em mais de um grupo no AD e algum desses grupos possuía a permissão de “syadmin”, fazendo com que o default schema fosse ignorado. Entendido isso, o cliente removeu o usuário do grupo do AD que possuía essa permissão e depois disso o default schema voltou a funcionar corretamente!
Portanto, caso você tenha algum problema parecido, é bem provável que possa estar relacionado com essa permissão de sysadmin fazendo o default schema ser ignorado. Fica a dica!
Espero que tenha gostado e que isso também possa ser útil no seu dia a dia. Até o próximo post!
Me siga no LinkedIn e YouTube para ficar por dentro das novidades.
Abraço,
Luiz Vitor França Lima
Consultor SQL Server