Share via


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.

Konu bağlantısı simgesi 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

Ayrıca bkz.

Başvuru

Bitsel işleçler (Transact-sql)

CREATE TRIGGER (Transact-SQL)

update() (Transact-sql)