Share via


columns_updated (Transact-SQL)

Döndürür bir varbinary bit deseni tablo veya eklenmesi veya güncelleştirilmesi görünüm sütunlarını gösterir.columns_updated herhangi bir gövdesi içinde kullanılan bir Transact-SQL ekleme veya güncelleştirme tetikleyici sınama olmadığını tetikleyici yürütmek gerekir belirli eylemler.

Konu bağlantısı simgesiTransact-SQL sözdizimi kuralları

Sözdizimi

COLUMNS_UPDATED ( ) 

Dönüş Türleri

varbinary

Açıklamalar

Çok sayıda sütun columns_updated sınamaları update ve INSERT eylemler gerçekleştirdi.Bir sütunüzerinde güncelleştirme veya ekleme girişimi için sınamak için kullanın update().

columns_updated sipariş edilen bir veya daha çok bayt soldan sağa sağdaki olan her bir bayt olarak en az önemli bit döndürür.En soldaki baytın en sağdaki bit sütun tablotemsil eder; Soldaki sonraki bit, ikinci sütunvb. temsil eder.columns_updated en az önemli bayt en soldaki olan sekiz sütun birden çok tetikleyici oluşturulduğu tablo içeriyorsa, birden çok bayt döndürür.Sütunları açık değerler veya eklenen örtülü (null) değerler olduğundan columns_updated true INSERT eylemleri tüm sütunlar için verir.

Test etmek için güncelleştirmeleri veya belirli sütunlara ekler için sözdizimi Bitsel işleç ve bir tamsayı bit maskesi sınanmakta olan sütunlar ile izleyin.For example, tablo t1 contains columns C1, C2, C3, C4, and C5.Doğrulamak için bu sütunları C2, C3, ve C4 olan tüm güncelleştirilmiş ( tabloile t1 update tetikleyicisi olması), sözdizimi ile izleyin & 14. Yalnızca olup olmadığını sınamak için sütun C2 olan güncelleştirilmiş, belirtmek & 2.

columns_updated kullanılabilir herhangi bir yere içinde bir Transact-SQL ekleme veya güncelleştirme tetikleyici.

Dikkat notuDikkat

De SQL Server 2008, INFORMATION_SCHEMA ORDINAL_POSITION sütun .SÜTUN görünümü uyumlu columns_updated. tarafından döndürülen sütunlar bit deseni değilbit deseni columns_updated ile uyumlu edinmek için başvuru ColumnIDözellik COLUMNPROPERTY , sorgulandığında sistem işlev INFORMATION_SCHEMA.COLUMNS görünümü gibi gösterildiği aşağıdaki örnek.

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';

Sütun kümelerini

Bir tablobir sütunküme tanımlandığında columns_updated işlev aşağıdaki şekillerde davranır:

  • üye sütunküme bir sütun açıkça güncelleştirildiğinde, buna karşılık gelen için sütun 1 küme ve sütunküme bit 1 küme olduğu olduğunu bit.

  • Bir sütunküme açıkça güncelleştirildiğinde, tablo olan küme 1 sütunküme bit 1 ve tüm seyrek sütunlar için BITS küme olmamasıdır.

  • Ekleme işlemleri için tüm küme 1 bittir.

    Bir sütunküme değişiklikleri tüm sütunları biti 1 küme için sütunküme neden olduğundan, değiştirilmiş değiştirilmemiş olan bir sütunküme 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.Bir tabloilk sekiz sütunları sınamak için columns_updated kullanma

Aşağıdaki örnek, iki tablo oluşturur: employeeDataand auditEmployeeData.employeeDatatablo hassas çalışan Bordro bilgilerini tutan ve İnsan 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 auditEmployeeData tablodenetim.

Kullanarak COLUMNS_UPDATED(), hassas çalışan bilgileri içeren sütunları değişiklikleri hızlı bir şekilde yapılması için sınar.Kullanarak COLUMNS_UPDATED() yalnızca zaman, ilk sekiz sütunları tabloiçin değişiklikleri algılamak için çalıştığınız bu þekilde çalýþýr.

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.Sekiz sütunları sınamak için columns_updated kullanma

Sütunları bir tabloilk sekiz sütunlar dışında etkileyen güncelleştirmeleri sınamak için kullanmak SUBSTRING işlev tarafından döndürülen doğru bit sınamak için COLUMNS_UPDATED.Aşağıdaki örnek sınamaları sütunları etkileyen güncelleştirmeleri 3, 5, ve 9 , AdventureWorks2008R2.Person.Person tablo.

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