Tenho um esquema relacionado à folha de pagamento que preciso proteger. Acho que se eu impedir que todos os usuários modifiquem diretamente as tabelas e criar um conjunto de procedimentos para lidar com todas as modificações de dados, estaremos em boa forma. Posso fazer com que os procedimentos lidem com todos os logs de auditoria, envolvam as coisas em transações conforme necessário, etc.
Mas, para fazer isso, preciso negar instruções DML diretas a todos nesse esquema específico - até mesmo a função de servidor sysadmin. Existe alguma maneira simples de fazer isso sem recorrer aos gatilhos INSTEAD OF (que não seriam tão à prova de balas)? Não vejo nenhuma sintaxe como "DENY INSERT, UPDATE, DELETE ON SCHEMA::schemaname TO ALL" e negar permissões para a função "pública" não parece ter o efeito desejado.
Se todo o acesso aos dados for por meio de procedimentos armazenados, as permissões na tabela não serão verificadas do mesmo usuário (dbo provavelmente) possui o procedimento e as tabelas. Isso é chamado de encadeamento de propriedade
Isso também significa que nenhuma permissão é necessária nas tabelas. Você não precisa negar ou conceder nada nas mesas porque elas não serão verificadas. Falta de GRANT significa nenhum direito de qualquer maneira, então você não precisa DENY
Agora, isso não significa nada para pessoas com privilégios elevados: sysadmin, db_owner etc. Eles sempre terão direitos. Você só pode usar gatilhos para bloqueá-los: mas eles podem desabilitar ou descartar gatilhos, é claro.
Presumo que seus "usuários finais" não estejam executando como db_owner ou sysadmin ...