Executando um procedimento armazenado CLR do SQL Server 2012 com este código:
const string executeLog = "EXEC master..xp_logevent @errorNumber, @message, informational";
using (SqlCommand cmd = new SqlCommand(executeLog, connection))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@errorNumber", 60001);
cmd.Parameters.AddWithValue("@message", url);
cmd.ExecuteScalar();
}
Eu recebo este erro:
System.Data.SqlClient.SqlException: A permissão EXECUTE foi negada no objeto 'xp_logevent', banco de dados 'mssqlsystemresource', esquema 'sys'.
Eu tentei fazer isso como sa
usuário:
grant execute on xp_logevent to sa
Mas recebo outro erro:
Você não pode encontrar o usuário 'sa' que não existe ou o usuário não tem permissão.
Como posso conceder permissões de execução ao usuário sa?
Você não precisa conceder nada para executar
sa
, poissa
está nasysadmin
função de servidor e pode fazer praticamente qualquer coisa. Portanto, se você está recebendo um erro ao executarxp_logevent
, não está efetuando login comosa
. A string de conexão está usandocontext connection = true;
ou uma conexão regular/externa? Se estiver usandocontext connection = true;
, as permissões são baseadas em quem está executando o procedimento armazenado SQLCLR. Se estiver usando uma conexão regular, as permissões são baseadas na conta de logon para o SQL Server NT Service ( MSSQLSERVER / SQLEXPRESS se for uma instância padrão) por padrão, caso contrário, podem ser as permissões de quem está executando o procedimento armazenado SQLCLR se for código foi adicionado para fazer a representação.Então, como é
SqlConnection
feito o ser? A resposta a essa pergunta ajudará a determinar a correção apropriada. Se esse procedimento armazenado SQLCLR deve ser chamado por qualquer pessoa (ou seja, usuários que não estão necessariamente na função dedb_owner
banco de dados ou nasysadmin
função de servidor), você pode fazer o seguinte para conceder essa permissão ao menor escopo possível.No banco de dados que contém o procedimento armazenado SQLCLR:
db_owner
função de banco de dadosdbo.LogEvent
) que aceite os dois parâmetros que você está passando (@errorNumber
e@message
) e simplesmente executeEXEC xp_logevent @errorNumber, @message, informational;
EXECUTE
neste novo procedimento armazenado a quaisquer usuários e/ou funções de banco de dados que chamarão o procedimento armazenado SQLCLRdbo.LogEvent
) em vez dexp_logevent
using
declaração para ternew SqlCommand("dbo.LogEvent", connection)
cmd.CommandType = CommandType.Text;
para sercmd.CommandType = CommandType.StoredProcedure;
const string executeLog
linhaOutras notas:
AddWithValue
, pois há problemas com ele. Em vez disso, basta criar oSqlParameter
com um tipo de dados definido explicitamente e adicioná-lo àSqlCommand.SqlParameters
coleção.ExecuteScalar
se você não estiver capturando algo de um conjunto de resultados. Em vez disso, ligueExecuteNonQuery
Você precisa ter as permissões abaixo de acordo com o MSDN
Requer associação na função de banco de dados fixa db_owner no banco de dados mestre ou associação na função de servidor fixa sysadmin.