Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server - po wstawieniu wyzwalacza - zaktualizuj kolejną kolumnę w tej samej tabeli

Zależy to od poziomu rekurencji dla wyzwalaczy aktualnie ustawionych w DB.

Jeśli to zrobisz:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

Albo to:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

Powyższy wyzwalacz nie zostanie ponownie wywołany i będziesz bezpieczny (chyba że wpadniesz w jakiś rodzaj impasu; to może być możliwe, ale może się mylę).

Mimo to nie myślę, że to dobry pomysł. Lepszym rozwiązaniem byłoby użycie INSTEAD OF wyzwalacza . W ten sposób unikniesz wykonywania pierwszej (ręcznej) aktualizacji przez bazę danych. Zostanie wykonany tylko ten zdefiniowany wewnątrz wyzwalacza.

Wyzwalacz ZAMIAST INSERT wygląda tak:

CREATE TRIGGER setDescToUpper ON part_numbers
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO part_numbers (
        colA,
        colB,
        part_description
    ) SELECT
        colA,
        colB,
        UPPER(part_description)
    ) FROM
        INSERTED
END
GO

To automagicznie "zamieniłoby" oryginalną instrukcję INSERT na tę, z wyraźnym wywołaniem UPPER zastosowanym do part_description pole.

Wyzwalacz INSTEAD OF UPDATE byłby podobny (i nie radzę tworzyć jednego wyzwalacza, trzymaj je osobno).

Odnosi się to również do komentarza @Martin:działa dla wielowierszowych wstawek/aktualizacji (w twoim przykładzie nie działa).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL:problem z koncatą ciągów

  2. Zwróć wszystkie wiersze z określonej partycji w SQL Server (T-SQL)

  3. Jaki jest ciąg połączenia dla localdb dla wersji 11?

  4. Programowo pobrać źródło procedury składowanej programu SQL Server, które jest identyczne ze źródłem zwróconym przez interfejs użytkownika programu SQL Server Management Studio?

  5. Utworzyć użytkownika, który może ZOBACZYĆ tylko jedną bazę danych i tylko z niej wybierać?