Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
Ez a függvény egy táblázat vagy nézet beszúrt vagy frissített oszlopait jelző varbináris bitmintát ad vissza. A Transact-SQL COLUMNS_UPDATED vagy INSERT eseményindító törzsén belül bárhol használhatja UPDATE annak teszteléséhez, hogy az eseményindítónak végre kell-e hajtania bizonyos műveleteket.
Transact-SQL szintaxis konvenciók
Szemantika
COLUMNS_UPDATED ( )
Visszatérési típusok
varbináris
Megjegyzések
COLUMNS_UPDATED több oszlopon UPDATE végrehajtott tesztek vagy INSERT műveletek. Egy oszlop teszteléséhez UPDATE vagy INSERT kísérletéhez használja az UPDATE()-t.
COLUMNS_UPDATED Egy vagy több bájtot ad vissza, amelyek balról jobbra vannak rendezve. Az egyes bájtok jobb szélső bitje a legkevésbé jelentős bit. A bal szélső bájt jobb oldali bitje a táblázat első táblázatoszlopát jelöli, a bal oldali következő bit pedig a második oszlopot, és így tovább.
COLUMNS_UPDATED több bájtot ad vissza, ha az eseményindítót létrehozó tábla nyolcnál több oszlopot tartalmaz, és a legkisebb jelentős bájt a bal szélső.
COLUMNS_UPDATEDa műveletek összes oszlopára TRUE visszaadjaINSERT, mert az oszlopok explicit vagy implicit (NULL) értékeket szúrnak be.
Ha bizonyos oszlopokra szeretne frissítéseket vagy beszúrásokat tesztelni, kövesse a szintaxist bitenkénti operátorral és a tesztelt oszlopok egész bitmaszkjával. Tegyük fel például, hogy a tábla t1 oszlopokatC1, C2, , C3C4és C5. Annak ellenőrzéséhez, hogy az oszlopok C2és C3C4 az összes sikeresen frissült-e (a tábla t1 rendelkezik eseményindítóvalUPDATE), kövesse a szintaxist a következővel& 14: . Annak ellenőrzéséhez, hogy csak az oszlop C2 frissült-e, adja meg a .& 2 A tényleges példákért lásd az A és a B példát .
Használjon COLUMNS_UPDATED bárhol egy Transact-SQL INSERT vagy UPDATE eseményindítón belül. Ha ez egy eseményindítón kívül fut, a rendszer null értéket ad vissza.
A ORDINAL_POSITION nézet oszlopa INFORMATION_SCHEMA.COLUMNS nem kompatibilis a visszaadott COLUMNS_UPDATEDoszlopok bitmintájával. A nézet lekérdezésekor COLUMNS_UPDATED hivatkozzon a ColumnIDCOLUMNPROPERTY rendszerfüggvény tulajdonságára a kompatibilis INFORMATION_SCHEMA.COLUMNSbitminta beszerzéséhez, ahogyan az az alábbi példában is látható.
SELECT TABLE_NAME, COLUMN_NAME,
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2022.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person';
Ha egy eseményindító egy oszlopra vonatkozik, a COLUMNS_UPDATED visszaadott érték változatlan marad true1. Ez a kialakítás, és az eseményindítónak üzleti logikát kell implementálnia, amely meghatározza, hogy a beszúrási/frissítési/törlési művelet megengedett-e vagy sem.
Oszlopkészletek
Ha egy táblában oszlopkészlet van definiálva, a függvény a COLUMNS_UPDATED következő módon viselkedik:
Az oszlopkészlet tagoszlopának explicit frissítésekor az oszlop megfelelő bitje a következőre
1van állítva, és az oszlopkészlet bitje a következőre1van állítva.Ha explicit módon frissít egy oszlopkészletet, az oszlopkészlet bitje a következőre
1van állítva, és a tábla összes ritka oszlopának bitjei a következőre1vannak állítva.Beszúrási műveletek esetén az összes bit értéke
1.Mivel egy oszlopkészlet módosításai miatt az oszlopkészlet összes oszlopának bitjei alaphelyzetbe állításra
1kerülnek, az oszlopkészlet változatlan oszlopai módosulnak. Az oszlopkészletekről további információt az Oszlopkészletek használata című témakörben talál.
Példák
Egy. A tábla első nyolc oszlopának tesztelése a COLUMNS_UPDATED használatával
Ez a példa két táblát hoz létre: employeeData és auditEmployeeData. A employeeData táblázat bizalmas alkalmazottak bérszámfejtési adatait tartalmazza, és a humánerőforrás-részleg tagjai módosíthatják azokat. Ha egy alkalmazott társadalombiztosítási száma (SSN), éves fizetése vagy bankszámlaszáma megváltozik, a rendszer létrehozza és beszúrja a naplózási táblába.auditEmployeeData
A függvény segítségével gyorsan tesztelhetjük a COLUMNS_UPDATED() bizalmas alkalmazotti adatokat tartalmazó oszlopokon végzett módosításokat. Ennek a módszernek a használata COLUMNS_UPDATED() csak akkor működik, ha a tábla első nyolc oszlopának módosításait próbálja észlelni.
USE AdventureWorks2022;
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.
This bitmask translates into base_10 as: 2 + 4 + 8 = 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 AS 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 AS 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. Nyolcnál több oszlop tesztelése a COLUMNS_UPDATED használatával
Az első nyolc táblaoszloptól eltérő oszlopokat érintő frissítések teszteléséhez használja a függvényt a SUBSTRING megfelelő bit COLUMNS_UPDATEDteszteléséhez. Ez a példa az oszlopokat 359 és a táblát érintő frissítéseket teszteli.AdventureWorks2022.Person.Person
USE AdventureWorks2022;
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