Jestem ciekawy, czy można utworzyć tabelę z kolumną, której nigdy nie można zmienić, ale inne kolumny tabeli mogą.
Na przykład mogę sobie wyobrazić CreatedByUser
kolumnę, której nigdy nie należy zmieniać.
Czy jest w tym wbudowana funkcja SQL Server, czy jest to możliwe tylko za pomocą wyzwalaczy lub czegoś innego?
sql-server
Philipp M.
źródło
źródło
Odpowiedzi:
Nie ma wbudowanej obsługi deklaratywnej dla kolumn, których nie można aktualizować (z wyjątkiem określonych wcześniej zdefiniowanych przypadków, takich jak
IDENTITY
)Ten element Connect zażądał tego, ale został odrzucony. Dodaj DRI, aby wymusić niezmienne wartości kolumn
UPDATE
Wyzwalania będzie prawdopodobnie najbardziej niezawodny sposób na osiągnięcie tego celu. Może to sprawdzićIF UPDATE(CreatedByUser)
i zgłosić błąd i wycofać transakcję, jeśli jest to prawda.źródło
Wprowadziłem
UPDATE TRIGGER
podejście sugerowane w odpowiedzi Martina Smitha w następujący sposób:(Uwaga: tabela ma kolumnę Klucz podstawowy, o nazwie ID).
Odrzucam aktualizację tylko wtedy, gdy zmienia się wartość AssetTypeID. Tak więc kolumna może być obecna w aktualizacji, a jeśli wartość się nie zmieni, to przejdzie. (Potrzebowałem w ten sposób)
źródło
AssetTypeID
zostanie ustawiona wartość inna niż null, a uruchomisz,UPDATE Asset SET AssetTypeID = NULL WHERE Asset = the_id
że nie będzie wycofania, ponieważWHERE i.AssetTypeID <> d.AssetTypeID
w wyzwalaczu zostanie ustawiona wartość false, pozostawiając tę kolumnę edytowalną.Możesz użyć widoku z kolumną pochodną. Spróbuj tego
źródło
Dlaczego aktualizujesz utworzoną kolumnę?
Miałbym dwie kolumny: kolumnę [utworzono przez] i [zmodyfikowano przez], gdzie pierwsza wstawka wstawiłaby wszystkie odpowiednie kolumny w rekordzie, a wszelkie kolejne aktualizacje po prostu zaktualizowałyby kolumnę [zmodyfikowano przez] (poprzez włączenie wyzwalacza w aplikacji warstwę, którą możesz tak skonstruować, aby zmienić tylko [zmodyfikowany_by] wraz z odpowiednimi kolumnami)
źródło