Fundo
Eu tenho um usuário SQL que tem a seguinte permissão:
GRANT CREATE SEQUENCE ON SCHEMA::seq TO SequenceCreator
GO
Eu gostaria de poder fazer com que esse usuário criasse uma sequência que pertence a ele. Mas quando eu executo o seguinte:
EXECUTE AS USER = 'SequenceCreator'
CREATE SEQUENCE seq.Testing START WITH 1 INCREMENT BY 1 NO CACHE
REVERT
O proprietário é dbo
, herdado do esquema. Como mostra a seguinte consulta:
;with objects_cte as
( select o.name, o.type_desc,
case
when o.principal_id is null then s.principal_id
else o.principal_id
end as principal_id
from sys.objects o
INNER join sys.schemas s
ON o.schema_id = s.schema_id )
select cte.name, dp.name AS owner
from objects_cte cte
JOIN sys.database_principals dp
ON cte.principal_id = dp.principal_id
WHERE cte.name = 'Testing'
Resultados:
name name
Testing dbo
Mas quando eu (as dbo
) executo isso:
ALTER AUTHORIZATION ON seq.[Test--Things] TO SequenceCreator
Em seguida, os resultados dessa consulta mudam para:
name owner
Testing SequenceCreator
Mas se eu largar a sequência e executar isso:
EXECUTE AS USER = 'SequenceCreator'
CREATE SEQUENCE seq.Testing START WITH 1 INCREMENT BY 1 NO CACHE
ALTER AUTHORIZATION ON seq.[Testing] TO SequenceCreator
REVERT
Estou tendo o erro a seguir:
Cannot find the object 'Testing', because it does not exist or you do not have permission.
Isso é esperado porque o usuário SequenceCreator
não tem permissão para ver muito menos alter
a sequência.
Mas parece que, já que o usuário está criando, deve ser capaz de definir quem é o proprietário também. (Semelhante a uma CREATE SCHEMA seq AUTHORIZATION dbo
chamada)
Pergunta
Como posso fazer com que o usuário criador ( SequenceCreator
) possua a sequência que ele cria sem precisar de um usuário de nível superior para transferir a propriedade?
Absolutamente não. Após a criação, o objeto pertence ao proprietário do esquema e seria uma falha de segurança permitir que os usuários se apropriassem dos objetos do DBO.
Dê a propriedade SequenceCreator do
seq
esquema.Além de resolver esse problema, é extremamente raro que os objetos não sejam de propriedade do proprietário do esquema. Muitas pessoas e ferramentas nem sabem que isso é possível. Portanto, é melhor evitar a propriedade de objetos individuais.
Além disso, geralmente não é seguro permitir que usuários não administradores criem objetos em um esquema de propriedade do
dbo
. Uma sequência provavelmente é inofensiva, mas uma tabela, visualização ou procedimento permitiria o escalonamento de privilégio pelo usuário.