Estou usando a seguinte instrução para recuperar uma lista de gatilhos do banco de dados:
select tr.name
from sys.triggers tr
union all
select tr.name
from sys.server_triggers tr;
No entanto, na minha instalação local do SQL Server 2012 Express, isso falha com o erro:
Não é possível resolver o conflito de agrupamento entre "Latin1_General_CI_AS" e "Latin1_General_CI_AI" no operador UNION ALL que ocorre na coluna 1 da instrução SELECT
Posso "consertar" isso alterando a instrução para usar explicitamente um agrupamento diferente na segunda parte da união:
select tr.name
from sys.triggers tr
union all
select tr.name collate database_default as name
from sys.server_triggers tr;
No entanto, sinto que este é um hack feio e realmente não entendo por que há um conflito em primeiro lugar. Ambas as exibições finalmente recuperam o nome de sys.sysschobjs.name
e, portanto, todos os valores devem ter o mesmo agrupamento.
Então minhas duas perguntas são:
- por que há um conflito de agrupamento em primeiro lugar?
- é seguro usar
collate database_default
apenas na segunda parte ou devo usá-lo melhor para ambas as consultas (desempenho não é um problema para isso).
Curiosamente, a mesma consulta não cria problemas ao usá-la em um SQL Server 2005 (edição padrão) com os mesmos gatilhos definidos.
sys.server_triggers
é uma visualização do servidor, portanto, possui o agrupamento do servidor.sys.triggers
é uma exibição de banco de dados, portanto, possui o agrupamento de banco de dados. Você tem um banco de dados que possui um agrupamento diferente do servidor. QED. Reprodução: