Acho que quero associar um dado a cada sessão.
A associação deve ter as seguintes propriedades:
- Os dados associados são fornecidos como parte da string de conexão (se isso for possível) ou como um parâmetro para um procedimento armazenado que deve ser o primeiro SP chamado na sessão.
- Os dados devem estar facilmente disponíveis para qualquer procedimento armazenado que a sessão chame, sem que esse dado seja passado como parâmetro.
Este ponto é essencial para a ideia: obviamente, eu poderia adicionar um parâmetro em cada um dos meus procedimentos armazenados e obrigar o software a passar o dado toda vez que qualquer procedimento armazenado for chamado, mas é exatamente isso que quero evitar. - Os dados devem expirar automaticamente e ser inválidos assim que a sessão for desconectada. Nenhuma ação do cliente deve ser necessária para marcar os dados como expirados. Se uma sessão for desconectada inesperadamente, isso ainda deve tornar seus dados inválidos.
Eu considerei várias maneiras de fazer isso, mas não gostei de nenhuma:
- Tabelas temporárias locais .
Escolha um nome de tabela (com base em um GUID recém-criado para evitar conflitos). Tem uma stored procedure que cria uma tabela temporária com esse nome e insere uma linha com os dados passados como parâmetro. Então todos os outros procs podem referenciar#table
e obter os dados. A ideia é que cada sessão tenha seu próprio#table
, enquanto o nome do#table
permanece o mesmo.
Não vai funcionar. A tabela temporária criada no procedimento armazenado será descartada ao sair do procedimento. Fazer o usuário criar#table
diretamente, sem chamar um SP, não é uma opção. - Uma tabela normal em que os dados são pesquisados por @SPID .
Não vai funcionar. Isso requer a exclusão dos dados manualmente após a desconexão. - APP_NAME() .
Provavelmente funcionará, mas esse não é realmente o nome do aplicativo e não será facilmente extensível.
Existem maneiras melhores de associar dados a uma sessão?
Use SET CONTEXT_INFO .
O caso de uso mais comum para isso é enviar informações de gatilhos sobre o ator que causou o disparo do gatilho.
Por exemplo: