Como remover um esquema vazio e alterar o esquema padrão removeu a função db_owner de um usuário de banco de dados?
Eu determinei limpar os esquemas extras que foram criados ao longo dos anos. Alguns esquemas foram criados por padrão e têm o mesmo nome de um Login do Banco de Dados SQL. Eu pesquisei por esquemas que não continham nenhum objeto com esta consulta:
SELECT
db_name() AS DatabaseName
,ds.SCHEMA_NAME AS SchemaName
,du.name AS UserName
,'USE ' + db_name() + '; ALTER USER [' + ds.SCHEMA_NAME + '] WITH DEFAULT_Schema=dbo; drop schema if exists [' + ds.SCHEMA_NAME + ']; ' as Fix
FROM INFORMATION_SCHEMA.SCHEMATA ds
JOIN sys.database_principals du ON du.name = ds.SCHEMA_NAME
AND du.default_schema_name = ds.SCHEMA_NAME
AND ds.SCHEMA_OWNER = du.name
WHERE NOT EXISTS (
SELECT 1
FROM sys.objects o
JOIN sys.schemas ss ON ss.schema_id = o.schema_id
WHERE ss.name = ds.SCHEMA_NAME
)
AND ds.SCHEMA_NAME NOT IN (
'dbo'
,'guest'
,'sys'
,'INFORMATION_SCHEMA'
)
Em seguida, usei esta consulta (como exemplo) para limpá-los:
USE SecondaryDatabase;
ALTER USER [User2] WITH DEFAULT_Schema=dbo;
drop schema if exists [User2];
Primeiro, alterei o esquema padrão para o padrão " dbo ". Depois, removi o esquema que tinha o mesmo nome do usuário.
Remover o esquema ou alterar o esquema padrão removeu a função db_owner do User2 . A alteração que nosso fornecedor fez para consertar foi conceder a função db_owner ao User2.
Não consigo entender como remover um esquema que não tinha objetos e alterar o esquema padrão poderia alterar as permissões deste usuário. Alguma ideia?
O que fiz e pesquisei até agora:
- https://learn.microsoft.com/en-us/sql/relational-databases/security/authentication-access/ownership-and-user-schema-separation?view=sql-server-ver16
- Noções básicas sobre usuários e esquemas.
- Qual é o propósito do "Proprietário do Esquema"?
- O que eu entendo disso é que ser um proprietário de esquema só concede permissões a objetos naquele esquema. Se não houvesse objetos no esquema, remover o esquema não deveria ter alterado as permissões dos usuários.
- Restaurou uma cópia do banco de dados para outro servidor. Reexecutou a consulta "fix" para ver se ela removeria o usuário da função db_owner. Não removeu.
- Restaurei uma segunda cópia do banco de dados no mesmo outro servidor. Usei o Schema Compare no Visual Studio para comparar o original restaurado com a cópia restaurada após executar a "correção". Não observei nenhuma alteração inesperada. Comparei as cópias restauradas com o banco de dados de produção.
- A versão específica do SQL Server é 2019 15.0.4410.1.
Restaurei os servidores e executei novamente o mesmo script. Não consegui reproduzir o problema. Deve ter havido outros fatores em jogo.
Dan da Microsoft respondeu à pergunta: