db_ddladmin vs db_owner
Pelo que posso dizer pelo que testei e li, a maior parte da sua lista parece precisa, exceto que o db_ddladmin
permite CREATE SCHEMA
. Confirmei que as outras permissões de segurança que você listou foram realmente negadas.
Negado apenas com DDLADMIN:
[ALTER ANY USER]
[BACKUP DATABASE]
, [BACKUP LOG]
,[CHECKPOINT]
[ALTER ANY APPLICATION ROLE]
, [ALTER ANY ROLE]
[DROP DATABASE]
Observando que o. . .
db_datareader
permitirá SELECT
acesso a todas as tabelas
db_datarwriter
permitirá INSERT
, UPDATE
e DELETE
acesso a todas as tabelas
db_executor
permitirá EXECUTE
acesso a todos os objetos executáveis
Além disso, ter permissões de função db_ddladmin pode significar. . .
Nota: Como você tem tantas versões diferentes do SQL Server de 2005 a 2014, talvez seja melhor um pequeno conjunto de usuários testá-lo inicialmente para ver quem grita para resolver problemas, etc.
Os objetos que eles possuem com essa função não serão de propriedade do DBO; portanto, talvez você precise lidar com problemas de propriedade, se houver algum problema com algo nesse nível. Não tenho 100% de certeza de que isso seria um problema, mas vale a pena mencionar por precaução.
Fonte: Cadeias de Propriedade
Com essa função (pode variar de acordo com a versão do SQL Server), eles podem adicionar princípios de segurança SQL definidos no banco de dados atual aos objetos que ainda possuem, mas nem todos os objetos (aqueles que não são de sua propriedade) nem adicionar um novo servidor principal definido por nível para o nível do banco de dados.
Além disso, não ter permissões de função DBO pode significar. . .
Nota: Como você tem tantas versões diferentes do SQL Server de 2005 a 2014, talvez seja melhor um pequeno conjunto de usuários testá-lo inicialmente para ver quem grita para resolver problemas, etc.
Não ter a função DBO pode impedir que determinadas interfaces da GUI de designer do SSMS (versão do SQL Server varia) sejam preenchidas ou abertas sem erros (por exemplo, ao modificar tabelas ou colunas através da GUI), mesmo que isso seja feito através do T-SQL e as permissões estejam em vigor . Em algumas versões do SQL Server, isso pode ser resolvido, permitindo GRANT VIEW DEFINITION
que esse problema ocorra e também pode ser apenas um aviso apenas em determinadas versões do SQL Server.
Recursos
Você não está logado como proprietário do banco de dados ou como um usuário membro da função db_owner. Você não poderá salvar as alterações nas tabelas que você não possui.
A função db_ddladmin não permite o uso de funções "design" no SSMS
"Tentamos impedir o máximo de usuários / desenvolvedores dbo em seus bancos de dados de controle de qualidade. Um dos problemas é que eles ainda precisam criar e modificar objetos de banco de dados, como tabelas de usuários. Muitos desenvolvedores são novos no MS SQL e, portanto, tendem a ficar com a GUI (SSMS) para esse tipo de trabalho.O problema surge quando concedemos a eles db_ddladmin (não dbo) e eles não conseguem mais modificar tabelas ou colunas por meio da GUI do designer de tabelas. eles precisam dedicar mais tempo para aprender os comandos do TSQL e sua sintaxe (que talvez nunca mais precisem) ou envolver a equipe de DBA, que dedica algum tempo a outras atividades.
Não sei se é um bug ou uma solicitação de recurso, mas considero um bug, pois o usuário tem permissões suficientes para alterar a tabela via TSQL, mas a GUI fornece a eles mensagens informando:
" Você não está conectado como proprietário do banco de dados ou administrador do sistema. Talvez não seja possível salvar as alterações nas tabelas que você não possui." AND "A tabela [schema].[table]
está configurada para somente leitura, o usuário não tem direitos suficientes nessa tabela " .
Um rastreio parece indicar que a verificação é um membro_do_db ('db_owner') que impedirá os membros do db_ddladmin, mesmo que eles tenham permissões para modificar o objeto. Microsoft SQL Server Management Studio "
Postado por Agent DBA em 25/01/2010 às 07:06
Eu tive um problema semelhante e consegui resolvê-lo executando a seguinte concessão
GRANT view definition on schema:: <schemaname> to <username>
outras considerações
Como você declara que isso está sendo analisado caso a caso
Uma das permissões atualmente limitadas são as permissões db_owner.
Essa permissão está sendo revisada caso a caso, mas uma mudança comum é substituir as permissões db_owner pelo seguinte:
- db_datareader
- db_datawriter
- db_ddladmin
- db_executor
Você já pensou em criar funções personalizadas adicionais para mais acesso no nível do banco de dados "todos os objetos" de que cada pessoa precisa, em vez de conceder a db_ddladmin
função, pois isso provavelmente lhes dará mais do que eles realmente precisam para objetos no nível do banco de dados.
Geralmente, dou exatamente o que é necessário e nada mais para que eles realizem seu trabalho e, se houver uma necessidade "usual" ou "padrão" de acesso a objetos no nível do banco de dados para todos os objetos em um banco de dados, crio uma função de banco de dados personalizada, como a db_executor
mas veja meu exemplo abaixo. Dessa forma, você pode conceder às pessoas o que elas realmente precisam para o objeto ALL DB em um DB específico, se você não estiver explicitando o nível do objeto nos DBs para segurança.
----Custom Database Roles
/* CREATE A NEW ROLE -- Execute to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Execute
GRANT EXECUTE TO db_All_StoredProc_Execute
/* CREATE A NEW ROLE -- Alter to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_Alter
GRANT ALTER ANY SCHEMA TO db_All_StoredProc_Alter
/* CREATE A NEW ROLE -- View Definition to all stored procs including newly created ones*/
-- Database specific
CREATE ROLE db_All_StoredProc_View
GRANT VIEW DEFINITION TO db_All_StoredProc_View
/* CREATE A NEW ROLE - Any schema alter and create procedure permissions */
-- Database specific
CREATE ROLE db_All_CreateProc_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateProc_AlterSchema
GRANT CREATE PROCEDURE TO db_All_CreateProc_AlterSchema
GO
/* CREATE A NEW ROLE - Any schema alter and create table permissions */
-- Database specific
CREATE ROLE db_All_CreateTable_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateTable_AlterSchema
GRANT CREATE TABLE TO db_All_CreateTable_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create function permissions */
-- Database specific
CREATE ROLE db_All_CreateFunction_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateFunction_AlterSchema
GRANT CREATE FUNCTION TO db_All_CreateFunction_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create aggregate permissions */
-- Database specific
CREATE ROLE db_All_CreateAggregate_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateAggregate_AlterSchema
GRANT CREATE AGGREGATE TO db_All_CreateAggregate_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create view permissions */
-- Database specific
CREATE ROLE db_All_CreateView_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateView_AlterSchema
GRANT CREATE VIEW TO db_All_CreateView_AlterSchema
/* CREATE A NEW ROLE - Any schema alter and create schema permissions */
-- Database specific
CREATE ROLE db_All_CreateSchema_AlterSchema
GRANT ALTER ANY SCHEMA TO db_All_CreateSchema_AlterSchema
GRANT CREATE SCHEMA TO db_All_CreateSchema_AlterSchema
Eu também queria compartilhar uma função db_DDLAdmin_Restriction que você pode considerar criar de outra forma com explícita DENY
para restringir o que db_ddladmin
dá acesso, para que você possa pelo menos criar isso nos bancos de dados em que você lhes concede essa função e define o explícito DENY
para os tipos de objetos reais , etc., você não deseja que eles tenham acesso.
Por exemplo, se você sabe que vai ser definitivamente a criação de procedimentos armazenados e funções, você pode excluir DENY CREATE FUNCTION
, DENY CREATE PROCEDURE
, DENY ALTER ANY SCHEMA
.
---Create ddladmin restriction custom DB role
DENY ALTER ANY ASSEMBLY TO db_DDLAdmin_Restriction
DENY ALTER ANY ASYMMETRIC KEY TO db_DDLAdmin_Restriction
DENY ALTER ANY CERTIFICATE TO db_DDLAdmin_Restriction
DENY ALTER ANY CONTRACT TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE DDL TRIGGER TO db_DDLAdmin_Restriction
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO db_DDLAdmin_Restriction
DENY ALTER ANY DATASPACE TO db_DDLAdmin_Restriction
DENY ALTER ANY FULLTEXT CATALOG TO db_DDLAdmin_Restriction
DENY ALTER ANY MESSAGE TYPE TO db_DDLAdmin_Restriction
DENY ALTER ANY REMOTE SERVICE BINDING TO db_DDLAdmin_Restriction
DENY ALTER ANY ROUTE TO db_DDLAdmin_Restriction
DENY ALTER ANY SCHEMA TO db_DDLAdmin_Restriction
DENY ALTER ANY SERVICE TO db_DDLAdmin_Restriction
DENY ALTER ANY SYMMETRIC KEY TO db_DDLAdmin_Restriction
DENY CHECKPOINT TO db_DDLAdmin_Restriction
DENY CREATE AGGREGATE TO db_DDLAdmin_Restriction
DENY CREATE DEFAULT TO db_DDLAdmin_Restriction
DENY CREATE FUNCTION TO db_DDLAdmin_Restriction
DENY CREATE PROCEDURE TO db_DDLAdmin_Restriction
DENY CREATE QUEUE TO db_DDLAdmin_Restriction
DENY CREATE RULE TO db_DDLAdmin_Restriction
DENY CREATE SYNONYM TO db_DDLAdmin_Restriction
DENY CREATE TABLE TO db_DDLAdmin_Restriction
DENY CREATE TYPE TO db_DDLAdmin_Restriction
DENY CREATE VIEW TO db_DDLAdmin_Restriction
DENY CREATE XML SCHEMA COLLECTION TO db_DDLAdmin_Restriction
DENY REFERENCES TO db_DDLAdmin_Restriction
GO