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.
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.
![]() |
---|
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
Zobacz także