COLUMNS_UPDATED (Transact-SQL)

Zwraca varbinary wzorzec bitowy , który wskazuje kolumny 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 WSTAW lub AKTUALIZUJ wyzwalacz, aby sprawdzić, czy wyzwalacz należy wykonać pewne akcje.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

COLUMNS_UPDATED ( ) 

Zwracane typy

varbinary

Uwagi

COLUMNS_UPDATED dla akcji UPDATE lub INSERT przeprowadzić testy na wiele kolumn.Aby przetestować dla aktualizacji lub WSTAW próby w jednej kolumna, UPDATE().

COLUMNS_UPDATED zwraca jeden lub kilka bajtów, które zostały zamówione od lewej do prawej, z najmniej znaczący bit każdego bajtu jest po prawej stronie.Skrajny bit bajtu po lewej stronie reprezentuje pierwszą kolumna w tabela; Następna bitów po lewej stronie reprezentuje drugiej kolumnai tak dalej.COLUMNS_UPDATED zwraca kilka bajtów, jeoli tabela tworzenia wyzwalacza zawiera więcej niż osiem kolumn z najmniej znaczący bajt jest po lewej stronie.COLUMNS_UPDATED zwraca wartość TRUE dla wszystkich kolumn w akcje WSTAW, ponieważ kolumny wartości jawny lub niejawny wartości (NULL), dodaje się.

Aby sprawdzić aktualizacje lub wstawia do określonych kolumn są zgodne ze składnią bitowe operator i maska bitowa liczba całkowita kolumny testowanego.For example, tabela t1 contains columns C1, C2, C3, C4, and C5.Aby zweryfikować tej kolumny C2, C3, i C4 są aktualizowane (z tabela t1 posiadające wyzwalacza aktualizacji), są zgodne ze składnią z & 14.Aby sprawdzić, czy tylko kolumna C2 jest aktualizowane, określ & 2.

COLUMNS_UPDATED może być używana w dowolnym miejscu wewnątrz Transact-SQL WSTAWISZ lub ZAKTUALIZUJESZ wyzwalacza.

PrzestrogaPrzestroga

W SQL Server 2008, ORDINAL_POSITION kolumna INFORMATION_SCHEMA.KOLUMNY widoku nie jest zgodny z wzorzec bitowy kolumn zwracanych przez COLUMNS_UPDATED.Odwołać się do uzyskania wzorzec bitowy zgodny z COLUMNS_UPDATED, ColumnID właściwość COLUMNPROPERTY systemu funkcja kwerendę INFORMATION_SCHEMA.COLUMNS zobaczyć, jak pokazano w następującym przykładzie.

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

Zestawy kolumn

kolumna,zestaw zdefiniowane w tabelaCOLUMNS_UPDATED funkcja zachowuje się w następujący sposób:

  • Po wyraźnie aktualizacji kolumna , która jest element członkowski kolumna zestaw odpowiedni bit dla że kolumna jest zestaw na wartość 1, a dla kolumna zestaw bit jest zestaw na wartość 1.

  • Gdy kolumna,zestaw jawnie jest aktualizowana, dla kolumnazestaw bit jest zestaw na 1 i bitów dla wszystkich kolumn sparse, tabela są zestaw na wartość 1.

  • Dla operacji wstawiania wszystkie bity są zestaw na wartość 1.

    Ponieważ zmiany kolumna,zestaw bitów wszystkie kolumny w kolumnazestaw jest zestaw na wartość 1, został zmodyfikowany pojawi się w kolumna,zestaw kolumny, które nie zostały zmienione. Aby uzyskać więcej informacji na temat zestawy kolumn, zobacz Korzystanie z zestawów kolumny.

Przykłady

A.Aby przetestować osiem pierwszych kolumnach tabelaprzy użyciu COLUMNS_UPDATED

Poniższy przykład tworzy dwie tabele: employeeDataand auditEmployeeData.employeeDatatabela zostały przedstawione w informacji o wynagrodzeniach pracowników poufne i mogą być modyfikowane przez członków działu kadr. Po zmianie zabezpieczenia społecznego, numer PESEL, rocznego wynagrodzenia lub numer konta bankowego dla pracownika rekord audytu jest generowany i wstawiony do auditEmployeeData inspekcji tabela.

Za pomocą COLUMNS_UPDATED(), testy dla kolumn, które zawierają informacje poufne pracownika można szybko zmiany.Za pomocą COLUMNS_UPDATED() w ten sposób działa tylko wtedy gdy próbujesz wykrywać zmiany w pierwszych ośmiu kolumn w tabela.

USE AdventureWorks2008R2;
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.Aby przetestować więcej niż osiem kolumn przy użyciu COLUMNS_UPDATED

Aby przetestować aktualizacje, które wpływają na kolumn innych niż osiem pierwszych kolumn w tabela, należy użyć SUBSTRING funkcja testowania bitowe poprawnego zwrócony przez COLUMNS_UPDATED.Następujący przykładowy kod sprawdza aktualizacje, które wpływają na kolumny 3, 5, i 9 w AdventureWorks2008R2.Person.Person tabela.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'uContact2', N'TR') IS NOT NULL
    DROP TRIGGER Person.tr1;
GO
CREATE TRIGGER uContact2 ON Person.Person
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.Person 
   SET JobTitle=JobTitle,
      MiddleName=MiddleName,
      EmailPromotion=EmailPromotion;
GO