columns_updated (Transact-sql)
Döner bir varbinarytablo veya güncelleştirilen veya araya görünüm sütunlarını gösterir bit deseni. columns_updated kullanılan her yerde gövdesi içinde bir Transact-SQLtetikleyici belirli eylemleri yürütmek olup olmadığını sınamak için INSERT veya update tetikleyicisi.
Transact-SQL Sözdizim Kuralları
Sözdizimi
COLUMNS_UPDATED ( )
Dönüş Türleri
varbinary
Açıklamalar
GÜNCELLEŞTİRME veya ekleme işlemleri için columns_updated testler çok sayıda sütun seslendirdi. GÜNCELLEŞTİRME veya ekleme bir sütun üzerinde denediği için sınamak için kullanın update().
columns_updated sipariş edilen bir veya daha çok bayt soldan sağa, sağdaki olmak her bayt olarak en az önemli bit döner. Soldaki baytın en sağdaki biraz tablonun ilk sütununda gösterir; Sonraki biraz sol, ikinci sütun vb. temsil eder. columns_updated sekiz sütun birden çok Tetikleyici oluşturulduğu tablo içeriyorsa, birden çok bayt en az önemli bayt en soldaki varlık verir. Çünkü sütunları açık değerler ya da örtük (null) değerleri eklenen columns_updated için tüm sütunları ekleme eylemleri true döner.
Test etmek için güncelleştirmeleri veya belirli sütunlar ekler için bitsel operatör ve sınanan sütunların bir tamsayı bit maskesi sözdizimi izleyin. For example, table t1 contains columns C1, C2, C3, C4, and C5. Doğrulamak için bu sütun C2, C3, ve C4 olan tüm updated (tablo ile t1 update tetikleyici sahip), sözdizimi ile takip &14. Sadece olup olmadığını sınamak için sütun C2 olan güncelleştirilmiş belirtmek &2.
columns_updated kullanılan her bir yerde içinde a Transact-SQLINSERT veya update tetikleyicisi.
INFORMATION_SCHEMA ORDINAL_POSITION sütun.SÜTUNLARI görüntüle columns_updated tarafından döndürülen sütunlar bit deseni ile uyumlu değil. Bit deseni uyumlu columns_updated edinmek için başvuru ColumnIDözelliği COLUMNPROPERTYsize sorgulandığında sistem işlevi INFORMATION_SCHEMA.COLUMNS, aşağıdaki örnekte gösterildiği gibi görüntülemek.
SELECT TABLE_NAME, COLUMN_NAME,
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2012.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person';
SELECT TABLE_NAME, COLUMN_NAME,
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2012.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person';
Sütun kümelerini
Tablo sütun kümesi tanımlandığında columns_updated işlevi aşağıdaki şekillerde davranır:
Sütun kümesinin bir üyesi olan bir sütunda açıkça güncelleştirildiğinde, sütunu 1 olarak ayarlayın ve sütun kümesi bit 1 olarak ayarlanmış için karşılık gelen bit.
Sütun kümesi açıkça güncelleştirildiğinde sütun kümesi bit 1 olarak ayarlanır ve tüm bu tablodaki seyrek sütunları bit 1 olarak ayarlayın.
Ekleme işlemleri için tüm bit 1 olarak ayarlayın.
Çünkü bir sütunda yapılan değişiklikler nedeni sütunundaki tüm sütunları bit 1 olarak ayarlamak için ayarla, değiştirilmiş değil değiştirilen sütun kümesi sütun görünür. Sütun kümeleri hakkında daha fazla bilgi için bkz: Sütun kümelerini kullanma.
Örnekler
A.Tablonun ilk sekiz sütunları sınamak için columns_updated kullanma
Aşağıdaki örnek, iki tablo oluşturur: employeeDatave auditEmployeeData. employeeDataTablo tutan hassas çalışan bordro bilgileri ve insan kaynakları departmanı üyeleri tarafından değiştirilebilir. Sosyal Güvenlik numarası (SSK), yıllık maaş veya bir çalışan için banka hesap numarası değişirse, bir denetim kaydı oluşturulur ve eklenen auditEmployeeDataDenetim tablosu.
Kullanarak COLUMNS_UPDATED(), hassas çalışan bilgileri içeren sütunları değişiklikleri hızla yapılabilir için sınar. Kullanarak COLUMNS_UPDATED()sadece zaman tabloda ilk sekiz sütunları değişiklikleri algılamak çalıştığınız bu şekilde çalışıyor.
USE AdventureWorks2012;
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 dbo.employeeData (
emp_id int NOT NULL PRIMARY KEY,
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 dbo.auditEmployeeData (
audit_log_id uniqueidentifier DEFAULT NEWID() PRIMARY KEY,
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 dbo.updEmployeeData
ON dbo.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 dbo.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 dbo.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 dbo.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 dbo.employeeData
SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
WHERE emp_id = 101;
GO
SELECT * FROM dbo.auditEmployeeData;
GO
USE AdventureWorks2012;
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 dbo.employeeData (
emp_id int NOT NULL PRIMARY KEY,
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 dbo.auditEmployeeData (
audit_log_id uniqueidentifier DEFAULT NEWID() PRIMARY KEY,
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 dbo.updEmployeeData
ON dbo.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 dbo.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 dbo.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 dbo.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 dbo.employeeData
SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
WHERE emp_id = 101;
GO
SELECT * FROM dbo.auditEmployeeData;
GO
B.Sekiz sütunları sınamak için columns_updated kullanma
Sütun ilk sekiz sütunları bir tablo dışındaki etkileyen güncelleştirmeleri sınamak için kullanmak SUBSTRINGişlevi tarafından döndürülen doğru biraz test etmek için COLUMNS_UPDATED. Aşağıdaki örnek sınamaları sütunları etkileyen güncelleştirmeleri 3, 5, ve 9de AdventureWorks2012.Person.Person tablosu.
USE AdventureWorks2012;
GO
IF OBJECT_ID (N'Person.uContact2', N'TR') IS NOT NULL
DROP TRIGGER Person.uContact2;
GO
CREATE TRIGGER Person.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 NameStyle = NameStyle,
FirstName=FirstName,
EmailPromotion=EmailPromotion;
GO
USE AdventureWorks2012;
GO
IF OBJECT_ID (N'Person.uContact2', N'TR') IS NOT NULL
DROP TRIGGER Person.uContact2;
GO
CREATE TRIGGER Person.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 NameStyle = NameStyle,
FirstName=FirstName,
EmailPromotion=EmailPromotion;
GO