Estou tentando criar uma função envolvendo change_tracking_min_valid_version(object_id), para simplificar as consultas ao usar sinônimos em vez de nomes de tabelas. Algo assim:
CREATE FUNCTION MY_CHANGE_TRACKING_MIN_VALID_VERSION(@synonym VARCHAR(100))
RETURNS BIGINT
BEGIN
RETURN (SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(base_object_name))
FROM sys.synonyms WHERE name = @synonym);
END
Tentei obter o nome do objeto base separadamente, para poder descartar a parte selecionada da instrução de retorno, ou seja
set @retval = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(@table_name))
MS SQL Server Management Studio produz este erro:
Msg 443, Level 16, State 1, Procedure MY_CHANGE_TRACKING_MIN_VALID_VERSION, Line 5
Invalid use of a side-effecting operator 'change_tracking_min_valid_version' within a function.
Eu entendo que não posso usar operações com efeitos colaterais em funções, mas como não consigo encontrar nenhuma informação sobre (ou entender por que haveria algum) efeitos colaterais dessa função específica, minha pergunta é:
Quais são os efeitos colaterais de CHANGE_TRACKING_MIN_VALID_VERSION?
(Estou usando o SQL Server 2012.)
Como Aaron menciona, essa lógica pode ser feita em uma exibição em vez de uma função. Se você precisar usar uma função, no entanto, uma alternativa pode ser usar
sys.change_tracking_tables
em vez deCHANGE_TRACKING_MIN_VALID_VERSION
. Ele tem umamin_valid_version
coluna e, pelo que posso dizer pela documentação, fornece as mesmas informações que você está procurando.Quais são os efeitos colaterais de CHANGE_TRACKING_MIN_VALID_VERSION?
Tanto quanto eu posso dizer a partir da documentação, não há nenhum "efeito colateral" que irá afetá-lo significativamente. Como Aaron menciona, você obterá o mesmo erro se tentar usar
NEWID
em uma função. Em ambos os casos, eu suspeitaria (mas não tenho certeza) dissoNEWID
eCHANGE_TRACKING_MIN_VALID_VERSION
está acessando e/ou modificando uma estrutura de dados interna (por exemplo, um gerador aleatório no caso deNEWID
) e o SQL Server está tendendo a ter cuidado ao rejeitar seu uso em uma função .