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.
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