Eu esperava usar a representação do usuário para configurar um usuário que tivesse permissões para modificar o DDL e somente quando eu precisasse implantar as alterações do DDL eu representaria esse usuário. Dessa forma, posso usar minha conta integrada do Windows para consultar dados conforme necessário, mas não posso modificar o banco de dados, exceto quando eu represento explicitamente esse outro usuário.
De acordo com o artigo do MSDN sobre representação, você só pode executar a representação se for um administrador de sistema.
Portanto, o desafio é, se meu Login padrão, vamos chamá-lo de LoginAaron, é um administrador de sistema do banco de dados, como negar a mim mesmo as permissões de gravação DDL, para que eu não possa executar o DDL sem personificar explicitamente outro usuário com a função ddl_admin (vamos chamar o usuário UserDdlDeploy)?
Ou existe outra maneira elegante de fazer isso?
Este não é tanto um procedimento de segurança, mas sim um procedimento de segurança/precaução.
A
sysadmin
não pode se rebaixar temporariamente / na maioria das vezes / etc. O que você deseja fazer é criar um login de autenticação SQL que você usa na maioria das vezes e que tenha privilégios apenas para fazer as coisas limitadas que você deseja fazer. Então, quando você quiser executar operações DDL, faça login como seu login do Windows.Provavelmente existem maneiras de fazer isso se o seu login principal não for um
sysadmin
, mas acho que elas serão autodestrutivas. Você teria que fazer login como outra pessoa sempre que quisesse fazer qualquer coisa (incluindo coisas que deseja que seu login com privilégios mais baixos seja capaz de fazer, mas não previu quando configurou as permissões). Como um exemplo rápido, aqui estão dois principais de banco de dados, um dos quais pode representar o outro:Resultados:
(Agora, a representação não é perfeita - há problemas em usar isso quando você precisa acessar recursos além dos limites do banco de dados, por exemplo.)
Portanto, imaginando que esses são usuários reais conectados a logins reais, você pode adicionar apenas
blat
àddl_admin
função e fazer login nafloob
maioria das vezes. Quando necessário, você pode simplesmente personificarblat
, fazer suas coisas DDL e depois reverter. Minha sugestão é apenas ficar longe de tentar diminuir os privilégios de sua conta do Windows /sysadmin
, e apenas se acostumar a fazer login de uma maneira diferente para que você possa ser um peão na maioria das vezes e só elevar quando precisar. Vou repetir, no entanto, que isso não eliminará os erros que você cometeria de qualquer maneira - apenas impedirá que você execute o DDL acidentalmente ou execute o DDL errado, o que pode acontecer quando você também personificou conscientemente.E, porque a ideia de elevar os próprios privilégios só quando precisa, para se proteger porque acha que só vai errar quando não estiver elevado, me parece estranha, e porque não consigo evitar (crédito xkcd , claro):
Aqui está um exemplo mais concreto, que usa um login de autenticação SQL real.
Agora, crie uma nova sessão, logando diretamente usando
peon
/peon
, e execute este código:Pausas, certo? Sim claro:
Agora, você pode representar outro usuário, sem ser um
sysadmin
, então você deve registrar um bug contra qualquer documentação que diga isso:Não se esqueça de limpar: