Udostępnij za pośrednictwem


COLUMNS_UPDATED (języka Transact-SQL)

Zwraca varbinary wzorzec bitowy wskazująca kolumn w tabela lub widoku, które zostały wstawione lub zaktualizowane. COLUMNS_UPDATED jest używana w dowolnym miejscu wewnątrz treści Transact-SQL INSERT lub UPDATE wyzwalacz, aby sprawdzić, czy wyzwalacz powinien wykonać pewne akcje.

Topic link iconKonwencje składni języka Transact-SQL

COLUMNS_UPDATED ( ) 

Zwracane typy

varbinary

Remarks

Wykonać testy COLUMNS_UPDATED dla akcji UPDATE lub INSERT na wiele kolumn.Aby przetestować dla prób UPDATE lub INSERT na jedną kolumna, należy użyć UPDATE().

COLUMNS_UPDATED zwraca jeden lub kilka bajtów, które są uporządkowane od lewej do prawej, z najmniej znaczący bit każdego bajtu jest po prawej stronie.Po prawej stronie bit bajtu po lewej stronie reprezentuje pierwszej kolumna w tabela; następnego bit po lewej stronie reprezentuje drugą kolumną itd.COLUMNS_UPDATED zwraca kilka bajtów, jeśli utworzono wyzwalacza tabela zawiera więcej niż osiem kolumn z najmniej znaczący bajt jest po lewej stronie,.COLUMNS_UPDATED zwraca wartość TRUE dla wszystkich kolumn w działaniach INSERT, ponieważ kolumny wartości jawne lub niejawne wartości (NULL), dodaje.

Aby sprawdzić aktualizacje lub wstawia do kolumny, postępuj zgodnie z składni bitowe operator i maska bitowa liczba całkowita testowanego kolumn.Na przykład tabela T1 zawiera kolumny C1, C2, C3, C4, and C5.Aby zweryfikować, że kolumny C2, C3, and C4 są aktualizowane (z tabela T1 Składnia z o wyzwalacz UPDATE), postępuj zgodnie z**& 14**.Aby sprawdzić, czy tylko kolumna C2 jest aktualizowana, określ & 2.

COLUMNS_UPDATED może być używana w dowolnym miejscu wewnątrz Transact-SQL Wyzwalacz INSERT lub UPDATE.

Ostrzeżenie

W SQL Server 2008, nie jest zgodny z wzorzec bitowy kolumn zwracanych przez COLUMNS_UPDATED kolumna ORDINAL_POSITION widoku INFORMATION_SCHEMA.Columns. Uzyskanie nieco deseń zgodny z COLUMNS_UPDATED odwołać ColumnID Właściwość COLUMNPROPERTY Funkcja systemowa kwerendę INFORMATION_SCHEMA.COLUMNS Umożliwia wyświetlanie, jak pokazano w poniższym przykładzie.

SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';

kolumna Zestawy

Gdy kolumna zestaw jest zdefiniowany w tabela, funkcja kolumna S_UPDATED zachowuje się w następujący sposób:

  • kolumna, która jest członkiem zestaw kolumn po zaktualizowaniu jawnie, odpowiadający mu bit dla kolumna jest równa 1 i bit niszczący dla zestaw kolumna jest równa 1.

  • Zestaw kolumn po zaktualizowaniu jawnie, bit dla zestawu kolumn zostanie ustawiony na wartość 1, a bitów dla wszystkich kolumn sparse w tej tabela są ustawione na 1.

  • W przypadku operacji wstawiania wszystkie bity są ustawione na 1.

    Ponieważ zmiany wprowadzone w zestaw kolumn wartość przyczyny bitów wszystkich kolumn w zestaw kolumn należy ustawić na wartość 1, kolumna w zestawie kolumn, które nie zostały zmienione, pojawi się, aby zostały zmodyfikowane.Aby uzyskać więcej informacji na temat zestawów kolumn zobacz Korzystanie z zestawów kolumna.

Przykłady

A.Aby przetestować pierwszych ośmiu kolumnach tabela przy użyciu COLUMNS_UPDATED

W poniższym przykładzie są tworzone dwie tabele: employeeData i auditEmployeeData.W tabeli employeeData są przechowywane poufne informacje o liście płac pracowników, które mogą być modyfikowane przez pracowników działu kadr.W przypadku zmiany numeru PESEL, rocznego wynagrodzenia lub numeru konta bankowego pracownika generowany jest rekord inspekcji, który zostaje wstawiony do tabeli inspekcji auditEmployeeData.

Za pomocą COLUMNS_UPDATED(), testy dla kolumn, które zawierają informacje wrażliwe pracownika można szybko zmiany. Za pomocą COLUMNS_UPDATED() w ten sposób działa tylko po próbie wykrywa zmiany w pierwszych ośmiu kolumnach tabela.

USE AdventureWorks;
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_NAME = 'employeeData')
   DROP TABLE employeeData
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
   WHERE TABLE_NAME = 'auditEmployeeData')
   DROP TABLE auditEmployeeData;
GO
CREATE TABLE employeeData (
   emp_id int NOT NULL,
   emp_bankAccountNumber char (10) NOT NULL,
   emp_salary int NOT NULL,
   emp_SSN char (11) NOT NULL,
   emp_lname nchar (32) NOT NULL,
   emp_fname nchar (32) NOT NULL,
   emp_manager int NOT NULL
   );
GO
CREATE TABLE auditEmployeeData (
   audit_log_id uniqueidentifier DEFAULT NEWID(),
   audit_log_type char (3) NOT NULL,
   audit_emp_id int NOT NULL,
   audit_emp_bankAccountNumber char (10) NULL,
   audit_emp_salary int NULL,
   audit_emp_SSN char (11) NULL,
   audit_user sysname DEFAULT SUSER_SNAME(),
   audit_changed datetime DEFAULT GETDATE()
   );
GO
CREATE TRIGGER updEmployeeData 
ON employeeData 
AFTER UPDATE AS
/*Check whether columns 2, 3 or 4 have been updated. If any or all
 columns 2, 3 or 4 have been changed, create an audit record. The 
bitmask is: power(2,(2-1))+power(2,(3-1))+power(2,(4-1)) = 14. To test 
whether all columns 2, 3, and 4 are updated, use = 14 instead of >0
 (below).*/

   IF (COLUMNS_UPDATED() & 14) > 0
/*Use IF (COLUMNS_UPDATED() & 14) = 14 to see whether all columns 2, 3, 
and 4 are updated.*/
      BEGIN
-- Audit OLD record.
      INSERT INTO auditEmployeeData
         (audit_log_type,
         audit_emp_id,
         audit_emp_bankAccountNumber,
         audit_emp_salary,
         audit_emp_SSN)
         SELECT 'OLD', 
            del.emp_id,
            del.emp_bankAccountNumber,
            del.emp_salary,
            del.emp_SSN
         FROM deleted del

-- Audit NEW record.
      INSERT INTO auditEmployeeData
         (audit_log_type,
         audit_emp_id,
         audit_emp_bankAccountNumber,
         audit_emp_salary,
         audit_emp_SSN)
         SELECT 'NEW',
            ins.emp_id,
            ins.emp_bankAccountNumber,
            ins.emp_salary,
            ins.emp_SSN
         FROM inserted ins
   END;
GO

/*Inserting a new employee does not cause the UPDATE trigger to fire.*/
INSERT INTO employeeData
   VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32);
GO

/*Updating the employee record for employee number 101 to change the 
salary to 51000 causes the UPDATE trigger to fire and an audit trail to 
be produced.*/

UPDATE employeeData
   SET emp_salary = 51000
   WHERE emp_id = 101;
GO
SELECT * FROM auditEmployeeData;
GO

/*Updating the employee record for employee number 101 to change both 
the bank account number and social security number (SSN) causes the 
UPDATE trigger to fire and an audit trail to be produced.*/

UPDATE employeeData
   SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
   WHERE emp_id = 101
GO
SELECT * FROM auditEmployeeData
GO

B.Ponieważ jest to kosztownych operacji, należy wykonać tę operację, na podstawie ograniczone, rzadkie.

Aby przetestować aktualizacje, które mają wpływ na kolumn innych niż osiem pierwszych kolumn w tabela, należy użyć SUBSTRING Funkcja testowania bit prawidłowe zwracane przez COLUMNS_UPDATED. W poniższym przykładzie sprawdza aktualizacje, które mają wpływ na kolumny 3, 5, a 9 w AdventureWorks.Person.Contact Tabela.

USE AdventureWorks;
GO
IF OBJECT_ID (N'uContact2', N'TR') IS NOT NULL
    DROP TRIGGER Person.tr1;
GO
CREATE TRIGGER uContact2 ON Person.Contact
AFTER UPDATE AS
    IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1) & 20 = 20) 
        AND (SUBSTRING(COLUMNS_UPDATED(),2,1) & 1 = 1) ) 
    PRINT 'Columns 3, 5 and 9 updated';
GO

UPDATE Person.Contact 
   SET Title=Title,
      MiddleName=MiddleName,
      EmailPromotion=EmailPromotion;
GO