SQL Server & BI blog by Andreas Wolter (Microsoft Certified Master): Database Engine - Reporting - Integration - Analysis Services

Andreas Wolter - SQL Server & BI blog (Database Engine, Reporting Services, Integration Services, Analysis Services)
Artikel „SQL Server 2014 – Neues Fundament“ in iX Ausgabe 5/2014, Richtigstellungen zu In-Memory OLTP und ColumnStore Indexes und warum AlwaysOn nicht gleich Always On ist

In der Mai-Ausgabe der iX ist auf Seite 56 ein Artikel von mir zu finden, den ich zusammen mit den Kollegen Volker Heck (Cloud- und BI-Part) und Holger Schwichtenberg (Lektorat) geschrieben habe.

clip_image002[4]

In der finalen Version, die ich auch erst am Kiosk zu sehen bekommen habe, sind leider einige Ungenauigkeiten enthalten. Um Missverständnisse auszuschließen, möchte ich diese hier kurz geraderücken, bzw. ein korrektes Verständnis sicherstellen.

Es geht los mit der Einleitung:
1)

„…Nach zwei Jahren Entwicklungszeit stellt Microsoft die neue Version seines Datenbankservers vor...“

Richtigstellung: Ich bin mir nicht sicher, wann der Startschuss für den SQL Server 2014 war, aber ziemlich sicher war das nicht vor 2 Jahre vor dem Release-Datum (1.4.2014), wie dieser Satz impliziert. Dass die In-Memory OLTP Engine XTP bereits 2009 mit ihrem ersten Patent untermauert wurde, steht etwas später noch im Artikel. Wann genau feststand, dass es einen SQL Server 2014 geben, und der Code entsprechend gebranched wurde, ist mir nicht bekannt. Wenn ich eine Vermutung abgeben würde, wäre dies eher ca. 3 Jahre vor dem Release.

2)

„…Wichtigste Neuerung ist das Ablegen relationaler Daten im Hauptspeicher statt auf der Festplatte….“

Richtigstellung: Diejenigen, die sich bereits ein wenig mit dieser neuen Technologie auseinandergesetzt haben, wissen es natürlich: Die Daten werden sowohl in RAM als auch auf Festplatte gespeichert – es sei denn man arbeitet mit „Schema_Only“-Tabellen. Später im Artikel wird das auch noch deutlich, mag aber hier verwirren.

3)

„…Stored Procedures in Maschinensprache
… „Native Kompilierung“ ... Dafür erzeugt der Server beim ersten Ausführen aus der jeweiligen Prozedur eine DLL. Diese Bibliotheken überstehen den Neustart von Datenbank oder Server jedoch nicht, müssen also danach erneut erstellt werden…“

Das kann man leicht falsch verstehen.
Richtigstellung: Genau gesagt werden diese DLLs nach jedem Neustart von Datenbank oder Datenbankserver neu generiert. – Man muss diese DLLs oder gar die Prozeduren also nicht selber neu erstellen.

4)

„(Nativ kompilierte Prozeduren)…Solche Prozeduren … erlauben noch nicht alle T-SQL-Sprachelemente. Es fehlen beispielsweise Raiseerror und Begin Transaction, einige Funktionen sowie Query Hints.“

Auch das könnte jemanden auf eine falsche Fährte führen.
Richtigstellung: Besser ausgedrückt: „Zum Beispiel kann man bestimmte Befehl wie Raiseerror oder Begin Transaction, anstelle dessen ein „Atomic“-Block erforderlich ist nicht nutzen.“ - Der Atomic-Block startet bereits eine Transaktion, daher ist ein zusätzliches „Begin Transaction“ ohnehin fehl am Platz. - Einige Query Hints werden übrigens tatsächlich unterstützt.

5)

„(neue Parallelitätskontrolle „multi-versioned, timestamped optimistic concurrency control“)… Dazu ergänzt der Server alle Datensätze um einen bei jeder Änderung automatisch aktualisierten Zeitstempel, anhand dessen er Konflikte erkennt…“

Das kann man auch leicht falsch interpretieren und einen glauben lassen, dass immer der selbe Datensatz aktualisiert wird. Der Hintergrund von „multi-versioned, timestamped optimistic concurrency control“ ist aber gerade, das es pro Version einen neuen Datensatz gibt, was sich in ausführlichen Tests von Microsoft Research in realitätsnaheren Testreihen (mit komplexeren Transaktionen im Mix mit längeren Lesezugriffen und Hotspot-Szenarien) als effizienter als „Single-version locking“ herausgestellt hat. (Quelle: „High-Performance Concurrency Control Mechanisms for Main-Memory Databases“, Microsoft, University of Wisconsin – Madison)
- Single-Version Locking wird beispielsweise von Oracle TimesTen und IBM’s solidDB eingesetzt.
Richtigstellung:
Genauer ist also zu sagen, dass es pro Version einen Datensatz gibt, und die “Alten Versionen” durch ein End-Timestamp als solche markiert werden.

6)

„(Clustered ColumnStore Indexe)…Diese erweiterte Variante der Hauptspeicher-Index-Technik wurde für die 2013 erschienene PDW-Variante (Parallel Data Warehouse) des SQL Server 2012 entwickelt und ist dort bereits im Einsatz…“

Die Wortwahl lässt vermuten, dass diese (Columnstore) Indexe, wie auch bei In-Memory optimierten Tabellen & Indexen lediglich im Hauptspeicher liegen. Das stimmt natürlich nicht.
Richtigstellung: Besser sollte hier stehen: „Hauptspeicher-optimierte Indexe“

7)

Und last but not least leider hat sich auch in diesem Artikel ein häufiger Fehler eingeschlichen:

Normal 0 21 false false false DE X-NONE X-NONE

Normal 0 21 false false false DE X-NONE X-NONE

Die Lösung für hohe Verfügbarkeit und Notfallwiederherstellung, welche im SQL Server 2012 neu eingeführt wurde, schreibt sich natürlich „AlwaysOn“, und weder „Always On“ noch „Always-On“.
„Always On“ (mit Leerzeichen) wurde bereits in SQL Server 2005 eingesetzt, um Speicher-Hardware für SQL Server zu zertifizieren. Dazu gehört z.B.:

  • die korrekte Umsetzung der API’s, des Write-Ahead Logging (WAL) Protokolls für sowohl Transaktionsprotokolle als auch Daten- und Backup-Dateien
  • der Optionen FILE_FLAG_WRITETHROUGH und FlushFileBuffers beim Öffnen von Dateien
  • der Unterstützung von asynchronem I/O
  • Write ordering
  • Das korrekte Übermitteln der Sektor-Größen an die Windows API’s, um Sektor-Größen-Versatz und Torn Writes zu verhindern
  • Die NTFS-Fähigkeiten wie z.B. Sparse Files, File Streams, Encryption, Compression, sämtliche Sicherheitseigenschaften

Über „Always On” lässt sich z.B. hier nachlesen: www.dell.com/downloads/global/solutions/dell_pv_sql_always_on_tech_note_v_1_5.pdf

Im SQL Server 2008 wurde „Always On“ für die gesamte Palette der Hochverfügbarkeitstechniken Technologien verwendet. Dazu gehörten Database Mirroring, Log Shipping, Failover Clustering, Peer-to-Peer Replication, Backup und Restore (!), Database Snapshots, selbst Partitionierung und weiteres. (Hier nachzulesehn: High Availability – Always On Technologies) Das hat also nicht mit dem neuen Features AlwaysOn-Verfügbarkeitsgruppen/Availability Groups und AlwaysOn-Failoverclusterinstanzen zu tun.
Und Feature-Namen werden nicht einfach „eingedeutscht“, genauso wenig wie man SharePoint auseinanderschreibt – Nein, ich werde das selbst aus Demozwecken nicht tun ;-)

Soweit habe ich nun meinem Genauigkeitsempfinden genüge getan ;-)

Da das folgende Diagramm es leider nicht in den Artikel geschafft hat, möchte ich es hier zumindest mit meinen Lesern teilen:

clip_image003[4]

Das ist das Ergebnis eines Performance-Vergleiches einer schematisch so gut wie identischen „on-Disk“-Tabelle gegenüber den verschiedenen In-Memory OLTP Varianten. Der Test wurde auf Standard-Hardware durchgeführt: Intel i7-3529 (2,9Ghz), 2 Cores hyperthreaded, 16GB RAM und SSDs. Das Ergebnis kann sich sehen lassen und entspricht Microsofts Versprechung, das neue Hardware nicht zwingend erforderlich ist, um spürbare Performance-Gewinne durch den Einsatz der XTP-Engine zu erhalten.

Und hier sind auch nochmal die begleitenden Links zu dem Artikel:

Ich hoffe die genannten Punkte sind für ein besseres Verständnis nicht nur des Artikels sondern auch von SQL Server 2014 allgemein hilfreich.

Kommentare oder Nachfragen können gern hier über meinen Blog hinterlassen werden.

Andreas Wolter

Normal 0 21 false false false DE X-NONE X-NONE

PS: Leider sind in meiner Master-Class Workshop In-Memory OLTP & ColumnStore - New Storage Engines in SQL Server 2014 (XTC) keine Plätze mehr verfügbar (!). Im Sommer wird sicher die Entscheidung für eine Neuauflage im 2. Halbjahr 2014 oder doch erst wieder im 1. HJ 2015 fallen. – Im 2. HJ stehen wieder viele Konferenzen, inklusive MVP Summit, PASS Summit und PASS Camp an, so dass es da wirklich eng wird. Aussichtsreicher ist da meist eine Inhouse-Schulung auf Anfrage.

 

New Permissions in SQL Server 2014: IMPERSONATE ANY LOGIN, SELECT ALL USER SECURABLES, CONNECT ANY DATABASE and the old CONTROL SERVER

(DE)
SQL Server 2014 bringt insgesamt 5 neue Berechtigungen. Zwei von diesen sind auf Datenbank-Ebene und nur in der Windows Azure SQL Database Edition verfügbar – nicht im „Box-Produkt“.
(Danke an Erland Sommarskog für die Bestätigung und Hinweis auf die recht versteckte Notiz in der Dokumentation: GRANT Database Permissions)
Die neuen Berechtigungen sind wie folgt:

(EN)
SQL Server 2014 brings altogether 5 new permissions. Two of those are on database level and only available in the Windows Azure SQL Database Edition – not in the box-version (Thanks Erland Sommarskog for confirming this and pointing me to the quite hidden note in the documentation: GRANT Database Permissions)
The new permissions are as follows:

Class Desc.

Permission Name

Type

Parent Covering Permission Name

DATABASE

ALTER ANY DATABASE EVENT SESSION

AADS

ALTER ANY EVENT SESSION

DATABASE

KILL DATABASE CONNECTION

KIDC

ALTER ANY CONNECTION

SERVER

CONNECT ANY DATABASE

CADB

 

SERVER

IMPERSONATE ANY LOGIN

IAL

 

SERVER

SELECT ALL USER SECURABLES

SUS

 

Und wofür und wie können wir diese neuen Berechtigungen auf Server Ebene verwenden?

IMPERSONATE ANY LOGIN

Erinnert Ihr Euch an das Problem mit CONTROL SERVER?

Das größte Problem war, das dieses Recht auch die Impersonifizierung eines jeden Kontos, inklusive der Privilegien Erweiterung zum sysadmin erlaubte.

Die Details und auch andere Probleme mit CONTROL SERVER habe ich hier umfassend dokumentiert:

CONTROL SERVER vs. sysadmin/sa: permissions, system procedures, DBCC, automatic schema creation and privilege escalation - caveats

SQL Server 2014 gibt uns mit der Einführung der IMPERSONATE ANY LOGIN-Berechtigung Munition, dieses Problem anzugehen.

- Diese Berechtigung erlaubt es, jeden Login und User zum impersonieren(!).

Wenn wir dieses mit einem DENY gegenüber dem Principal mit CONTROL SERVER Recht verwenden, verhindert es diesen, irgendeinen Login direkt zu impersonifizieren. (Warum sage ich “direkt”? – Das sehen wir ein Stück weiter unten.)
Also sehen wir uns an, wie man einen Login mit CONTROL SERVER an einer Pivilegienerweiterung hindert, mithilfe der neuen Berechtigung

So, what for and how can we use those permissions on Server level?

IMPERSONATE ANY LOGIN

Do you remember the problem with CONTROL SERVER?
The biggest flaw of this permission was, that this permission also allowed Impersonation of any account, including privilege elevation to any sysadmin.
I have documented this and other problems with CONTROL SERVER in detail here:

CONTROL SERVER vs. sysadmin/sa: permissions, system procedures, DBCC, automatic schema creation and privilege escalation - caveats

Now in SQL Server 2014, by introducing the permission IMPERSONATE ANY LOGIN, gives us ammunition to tackle this problem.

- This Permission permits to impersonate any Login and User(!).

If we DENY this to the Principal with CONTROL SERVER permission, it prevents him from impersonating any Login directly. (Why do I say “directly”? – We’ll see a bit further down.)

So let’s see how to prevent a Login with CONTROL SERVER from elevating privileges by impersonating another login with help of the new permission:

USE [master]

GO

CREATE LOGIN DBA_TheDude WITH PASSWORD=N'www', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

CREATE SERVER ROLE [Role_DBA]

ALTER SERVER ROLE [Role_DBA]

ADD MEMBER DBA_TheDude

GRANT CONTROL SERVER TO [Role_DBA]

GO

DENY IMPERSONATE ANY LOGIN TO [Role_DBA]

GO

CREATE DATABASE ControlServer_Schema_Demo

GO

-- ====================

-- === Test

EXECUTE AS LOGIN = 'DBA_TheDude'

-- Attempt impersonation:

EXECUTE AS LOGIN = 'sa';

-->

Msg 15406, Level 16, State 1, Line 9

Cannot execute as the server principal because the principal "sa" does not exist, this type of principal cannot be impersonated, or you do not have permission.

//

Die Ausführung als Serverprinzipal ist nicht möglich, weil der Prinzipal 'sa' nicht vorhanden ist, für diesen Typ von Prinzipal kein Identitätswechsel möglich ist, oder Sie nicht die erforderliche Berechtigung haben.

USE ControlServer_Schema_Demo

EXECUTE AS USER = 'dbo';

-->

Msg 15517, Level 16, State 1, Line 15

Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

//

Die Ausführung als Datenbankprinzipal ist nicht möglich, weil der Prinzipal 'dbo' nicht vorhanden ist, für diesen Typ von Prinzipal kein Identitätswechsel möglich ist, oder Sie nicht die erforderliche Berechtigung haben.

Hurra!(?)

Privilege-Escalation-Risiko:

Wirklich? Immer noch?
Natürlich.
Wir laufen immer noch unter dem Kontext DBA_TheDude:

Hooray!(?)

Privilege-Escalation-risc:

Really? Still?
Of course.

Still we are running under the context of DBA_TheDude:

USE master;

CREATE LOGIN UtilizeMe WITH PASSWORD=N'www', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

GO

GRANT CONTROL SERVER TO UtilizeMe

GO

Wir können den Login “UtilizeMe” nicht impersonifizieren, aber wir können und einfach mit seinem Passwort anmelden!

- Nebenbei ein weiterer Grund, SQL Authentifizierung nicht zu verwenden, da er ansonsten die Credentials eines validen Windows-Login’s finden müsste – viel schwieriger, als einfach seinen eigenen Backdoor-account anzulegen.

We cannot Impersonate the “UtilizeMe” Login, but we can just Log On using his password!

- Another reason to not use SQL authentication by the way, as he would then need to find a valid Windows-Login’s Credentials – much harder to just creating his own backdoor-account.

clip_image001

Um also unseren Administrator wirklich daran zu hindern, seine Privilegien zum Sysadmin zu erweitern, müssen wir auch mit DENY ALTER ANY LOGIN und ALTER ANY SERVER ROLE arbeiten.

So in order to further prevent our Administrator from elevating privileges to sysadmin, we also need to work with DENY ALTER ANY LOGIN and ALTER ANY SERVER ROLE.

Und kann DANN CONTROL SERVER endlich sicher verwendet werden?

NEIN!

Tatsächlich gibt es noch ein paar andere Dinge, die man tun kann, um die Berechtigungen von einem CONTROL SERVER-berechtigten Konto zu erweitern. Etwas trickreicher vielleicht, aber ein Angreifer mit einem guten Wissen über SQL Server (ich spreche also nicht von „Raketenwissenschaft“), wird in der Lage sein soetwas durchzuführen.

Mir ist bewusst, dass das “Separation of Duties in SQL Server 2014”-Whitepaper (Enthalten im Microsoft® SQL Server® 2014 Product Guide) die Kombination von GRANT CONTROL SERVER + DENY IMPERSONATE ANY tatschlich als Best Practice listet, aber dennoch…

Also, empfehle ich die Verwendung in irgendeiner Weise?
Das ist für mich persönlich eine harte Frage, da ich gerne viel weniger Leute sehen würde, die sa/sysadmin für tägliche Aufgaben verwenden/vergeben.

Leider ist es jedoch weit davon entfernt, perfekt zu sein, und in Sicherhit-belangen, alles, was nicht lupenrein ist, ist ein Risiko.
Aber ich sehe es durchaus als ersten Schritt, um Leute davon abzuhalten, von Anfang an die höchsten Berechtigungen zu verwenden, da viele einfach nicht die Zeit und Kenntnisse haben werden, dort auszubrechen.
Ich empfehle es in Kombination mit soliden Überwachung und Alarmen.

Wer das also anstelle von sa/sysadmin verwendet, verdient dennoch Applaus, da es zeigt, dass man sich kümmert und es wagt, Berechtigungen einzuschränken.

Can we THEN finally use CONTROL SERVER completely safely?

NO!

In fact there are a few other things one can do to elevate permissions from a CONTROL SERVER-permitted account. More tricky in a way, but an attacker with some good knowledge about SQL Server (note, I am not saying “rocket-scientist”) will be able to do that.

I am aware that the “Separation of Duties in SQL Server 2014”-Whitepaper (Contained in the Microsoft® SQL Server® 2014 Product Guide) does in fact list the combination of GRANT CONTROL SERVER + DENY IMPERSONATE ANY LOGIN as a best practice, but yet…

So do I recommend using it in any way?

That is a hard question for me personally, as I would like to see much less people using/granting sa/sysadmin for daily tasks, and this permission had the potential to make an end to it.

Unfortunately it is far from perfect, and in security-terms, anything not flawless, is a risk.

But in terms of getting people away from using the highest privileges from the very beginning, I do see it as a step, since many may just not have the time and skills to break out of it.

I do recommend using it in combination with some solid Auditing and alerts in place.
So anyone using this instead sa/sysasdmin still gets applause, as it shows you care and dare to limit permissions.

SELECT ALL USER SECURABLES

Diese Berechtigung kann verwendet werden, um einen hochgradig berechtigten Principal, der z.B. Troubleshooting/Analysen des Servers durchführt daran zu hindern, Nutzer-Daten auszulesen. – Vergesst nicht, auch EXECUTE in alle Nutzerdatenbanken zu verbieten, ansonsten kann derjenige immer noch alle gespeicherten Prozeduren (sofern vorhanden) ausführen, um an die Daten zu gelangen.
Auch das ist nicht Bombenfest, wie wir bereits von CONTROL SERVER und seinen Einschränkungen wissen.

Was sicherer ist, ist die Verwendung für eine Art Auditor, der ALLE Daten lesen (aber nicht ändern) können soll – ohne den Aufwand, in sämtlichen Nutzerdatenbanken Benutzer und Rechte zu vergeben.

SELECT ALL USER SECURABLES

This permission can be used for preventing a highly privileged Principal that may be troubleshooting/analyzing the server from reading any user data. - Do not forget to also deny EXECUTE in all User databases though, otherwise he can just execute the stored procedures (if any exist) to get to the data.
Also this is not bullet-proof as we already know from CONTROL SERVER and it’s restrictions.

What’s more safe, is the use for an Auditor that needs to read ALL data, but not change it - without the effort of creating users and permissions in all user databases.

CONNECT ANY DATABASE

Diese Berechtigung kann gut für Logins verwendet werden, die sich im Wesentlichen mit jeder Datenbank verbinden können and zum Beispiel Code Reviews durchführen sollen – indem man diese mit der VIEW ANY DEFINITION Berechtigung kombiniert.
Das ist in meinen Augen tatsächlich sehr gut verwendbar für viele Szenarien.

CONNECT ANY DATABASE

This permission can be used quite well for having logins that can basically connect to any database and for example do code reviews - by combining it with the VIEW ANY DEFINITION permission.
I do think this is actually of quite some use for many scenarios.

Happy “Server controlling”,

Andreas

New Extended Events for Tracing in SQL Server 2014

Neue “Erweiterte Ereignisse” (XEvents) für Tracing in SQL Server 2014

Dieser Artikel enthält eine Liste der neuen Erweiterte Ereignisse (“Extended Events”), dem Tracing Framework in SQL Server in dem neuen 2014 Release.

Zunächst gibt es 3 neue Pakete („Packages“), die alle zu der neuen Arbeitsspeicher(„In-Memory“) -OLTP Engine: XTP, aufgeteilt auf 3 DLLs:

This article contains a list of new Extended Events, the tracing framework in SQL Server in the new 2014 release.

To begin with there are 3 new packages, all belonging to the new In-Memory OLTP Engine: XTP, split up into 3 dlls:

 

Package

description

Module name

XtpRuntime

Extended events for the XTP Runtime

{InstanceDir}\MSSQL\Binn\
hkruntime.dll

XtpEngine

Extended events for the XTP Engine

{InstanceDir}\MSSQL\Binn\
hkengine.dll

XtpCompile

Extended events for the XTP Compile

{InstanceDir}\MSSQL\Binn\
hkcompile.dll

 

Die Anzahl der Extended Events ist von 625 in SQL Server 2012 (SP1) auf 870 in SQL Server 2014 (RTM) angestiegen. Das sind 245 neue Events! – Reichlich Möglichkeiten, in Internas einzutauchen :-)
2 Events sind umbenannt worden:

recovery_incremental_checkpoint in

recovery_indirect_checkpoint

und hekaton_slow_param_passing in

natively_compiled_proc_slow_parameter_passing

Ja, richtig gelesen. Es gab bereits im SQL Server 2012 eine Anzahl an Events für die XTP Engine. Es kommt recht häufig vor, dass man Bits von zukünftigen Entwicklungen in der aktuellen Release findet.

Nebenbei: SQL Trace wurde nicht im geringsten angefasst. Die Anzahl von SQL Trace Events bleibt mit 180 seit SQL Server 2008 stabil. – Here ist ein Überblick von Extended Events gegen SQL Trace Events in den verschiedenen SQL Server Versionen: Extended Events vs SQL Trace im Vergleich – oder warum SQL Trace & Profiler einfach von gestern sind :-)

Weiter zu XEvents: es gibt keine neuen Prädikate, aber eine Anzahl neuer Maps, was natürlich nicht überrascht bei der Menge neuer Events.
Targets, Actions, Typen und Session Optionen  sind unverändert.

Und hier ist die Liste der neuen Extended Events:

The number of Extended Events increased from 625 in SQL Server 2012 (SP1) to 870 in SQL Server 2014 (RTM). That makes 245 new events! – Plenty of opportunities to look into internals :-)
2 events have been renamed:

recovery_incremental_checkpoint into

recovery_indirect_checkpoint

and hekaton_slow_param_passing into

natively_compiled_proc_slow_parameter_passing

Yes, you read correctly. There have already been a couple of events for the new XTP engine within SQL Server 2012. It’s quite common that you can find bits of future developments within the current release.

By the way: SQL Trace has not been touched by the slightest bit. The number of SQL Trace events stays at 180 since SQL Server 2008. – here you find an overview of the number of Extended Events vs SQL Trace events in the various SQL Server versions: Comparing Extended Events vs SQL Trace – or why SQL Trace & Profiler are just a thing of the past :-)

Continuing with XEvents: There are no new predicates, but a couple more maps, which is of course not surprisingly considering the amount of new events.
Targets, actions, types and session options are unchanged.

And here is the list of all new extended events:

 




Package
name
Event name description
qds query_store_async_shutdown_failed Fired when query store encounters an error during async query store shutdown
qds query_store_background_cleanup_task_failed Fired if the background task for cleanup of QDS stale data is not completed successfully
qds query_store_background_task_creation_failed Fired if the background task for QDS data persistence could not be created
qds query_store_background_task_initialization_failed Fired if the background task for QDS data persistence could not be initialized
qds query_store_background_task_persist_failed Fired if the background task for QDS data persistence is not completed successfully
qds query_store_begin_persist_runtime_stat Fired immediately before current runtime statistics for a query plan is persisted to the database.
qds query_store_bloom_filter_false_positive Fired if the Bloom filter for QDS statement texts gives a false positive result
qds query_store_check_consistency_init_failed Fired when check consistency task fails during initialization
qds query_store_database_initialization_failed Fired if initialization of the Query Store for database has failed. The Query Store will be disabled for this database
qds query_store_db_cleanup__finished Fired if cleanup of QDS stale data finished for particular database.
qds query_store_db_cleanup__started Fired if cleanup of QDS stale data started for particular database.
qds query_store_disk_size_check_failed Fired when a check against Query Store on-disk size limit fails
qds query_store_disk_size_info Fired when a check against QDS on-disk size is performed
qds query_store_execution_runtime_info Fired when runtime information is sent to the query store.
qds query_store_execution_runtime_info_discarded Fired when runtime information sent to the query store is discarded.
qds query_store_execution_runtime_info_evicted Fired when runtime information sent to the query store is evicted.
qds query_store_flush_failed Fired when query store failed to flush dirty data
qds query_store_loaded Fired when query store is loaded
qds query_store_notify_dirty_shutdown_on_partition_startup Fired when previous instance of query store for the partition is shutdown by force in order to allow creation of a new instance
qds query_store_notify_force_failure_failed Fired when query store failed to notify force failure
qds query_store_persist_task_init_failed Fired when persist task fails during initialization
qds query_store_plan_forcing_failed Occurs when forcing of plan from qds fail
qds query_store_plan_persistence_failure Fired if there's a failure to persist plan
qds query_store_plan_removal Fired when plan is removed
qds query_store_query_persistence_failure Fired if there's a failure to persist query
qds query_store_read_write_failed Fired if the read/write to Query Store internal tables failed
qds query_store_statement_not_found Fired in case when statement couldn't be found due to race condition or ambiguous user request.
qds query_store_unloaded Fired when query store is unloaded from memory
sqlos nonpreemptive_long_syncio record long sync io operation in nonpreemptive worker
sqlos stuck_dispatcher_callback_executed Stuck dispatcher callback executed
sqlos wait_completed Occurs when there is a wait completed on a SQLOS controlled resource.  Use this event to track wait completion.
sqlserver after_natively_compiled_proc_entry_removal_on_drop Fired after the procedure cache entry is flushed when dropping a natively compiled procedure.
sqlserver availability_replica_state Occurs when the Availability Replica is starting or shutting down.
sqlserver before_natively_compiled_proc_entry_removal_on_drop Fired before the procedure cache entry is flushed when dropping a natively compiled procedure.
sqlserver before_redo_lsn_update Occurs just prior to the update of the EOL LSN
sqlserver buffer_pool_eviction_thresholds_recalculated Lazywriter and/or worker clock has wrapped the BUF array and thresholds are re-calculated.
sqlserver buffer_pool_extension_pages_evicted Page is evicted from the buffer pool extension cache.
sqlserver buffer_pool_extension_pages_read Page is read from the buffer pool extension cache.
sqlserver buffer_pool_extension_pages_written Page or contiguous set of pages evicted into the buffer pool extension cache.
sqlserver check_phase_tracing Occurs when DBCC CHECK enters a new phase of the checking. Use this event to trace the phases of DBCC CHECK process.
sqlserver check_thread_message_statistics Occurs when a phase of DBCC CHECK is finished. Use this event to collect the number of messages a DBCC CHECK thread has sent or received.
sqlserver check_thread_page_io_statistics Occurs when a phase of DBCC CHECK is finished. Use this event to collect the number of logical, physical, and read-ahead IOs a DBCC CHECK thread has performed.
sqlserver check_thread_page_latch_statistics Occurs when a phase of DBCC CHECK is finished. Use This event to collect the number and time of page latch and IO latch waits.
sqlserver clustered_columnstore_index_rebuild Occurs when clustered index on the table was rebuilt. This event is raised three times for ALTER index rebuild operation on CCSI. The event is raised when the operation takes lock on index rebuild resource, when lock is taken on the table and when S lock on the table is upgraded to SCH_M lock to switch indexes in metadata.
sqlserver column_store_code_coverage Code coverage Xevent for columnstore code.
sqlserver column_store_index_build_low_memory Occurs when Storage Engine detects low memory condition and the rowgroup size is reduced.
sqlserver column_store_index_build_process_segment Occurs when a segment is processed
sqlserver column_store_index_build_throttle Shows the statistics of columnstore index build parallelism throttling
sqlserver columnstore_tuple_mover_begin_compress Occurs when column store tuple mover starts compressing a deltastore.
sqlserver columnstore_tuple_mover_end_compress Occurs when column store tuple mover is done compressing a deltastore.
sqlserver database_xml_deadlock_report Produces a deadlock report for a victim, with information scoped to the victim's database.
sqlserver db_lock_acquired_from_cache Occurs when a DB lock is acquired from the XactWorkspace DB lock cache.
sqlserver db_lock_released_from_cache Occurs when a DB lock is released from the XactWorkspace DB lock cache.
sqlserver ddl_with_wait_at_low_priority A DDL statement was executed using the WAIT_AT_LOW_PRIORITY options
sqlserver diag_quantum_end Occurs when the diag is notified of quantum end.
sqlserver dyn_throttle_checkpoint Occurs when checkpointing has been dynamically throttled with a new Checkpoint rate.
sqlserver feature_extension Occurs when received and parses data for a feature in feature extension.
sqlserver file_handle_in_use Fired when a file handle we're trying to delete is in use and we don't expect it to be. The typical response is dumping all the handles in the system via SysInternals HANDLE.EXE
sqlserver file_read_enqueued File read enqueued
sqlserver file_read_throttled File read throttled
sqlserver file_write_enqueued File write enqueued
sqlserver file_write_throttled File write throttled
sqlserver ghost_cleanup_task_packet_enqueue A task packet is enqueued
sqlserver ghost_cleanup_task_process_packet A task packet is dequeued and processed
sqlserver ghost_cleanup_task_process_pages_for_db_packet Purge the pages that contain ghost records found in a database
sqlserver ghost_cleanup_task_start Ghost cleanup task start
sqlserver ghost_cleanup_task_suspend Ghost cleanup task suspend
sqlserver hadr_tds_synchronizer_payload_skip Hadron Tds Listener Synchronizer skipped a listener payload because there were no changes since the previous payload.
sqlserver lock_request_priority_state The priority state of a lock request
sqlserver log_cache_write_block Writing a log block to the log cache
sqlserver metadata_ddl_add_column Occurs when an ALTER TABLE ADD column operation is updating base index.
sqlserver metadata_ddl_alter_column Occurs when an ALTER TABLE ALTER column operation is updating base index.
sqlserver metadata_ddl_drop_column Occurs when an ALTER TABLE DROP column operation is updating base index.
sqlserver mixed_extent_activation Track mixed extent activation and deactivation operations.
sqlserver mixed_extent_allocation Track mixed extent allocation operations
sqlserver mixed_extent_deallocation Track mixed extent deallocation operations.
sqlserver mixed_page_allocation Track mixed page allocation operations
sqlserver mixed_page_deallocation Track mixed page allocation operations
sqlserver mixed_page_scan_file Track the activity of SGAM scans for mixed page allocation
sqlserver mixed_page_scan_page Track the activity of SGAM scans for mixed page allocation
sqlserver mixed_page_skipextent Track the activity of SGAM scans for mixed page allocation
sqlserver natively_compiled_proc_execution_started Fired before a natively compiled procedure is executed.
sqlserver natively_compiled_proc_slow_parameter_passing Occurs when a Hekaton procedure call dispatch goes to slow parameter passing code path
sqlserver process_killed_by_abort_blockers A process is killed by an ABORT = BLOCKERS DDL statement
sqlserver query_execution_batch_hash_aggregation_finished Occurs at the end of batch hash aggregation.
sqlserver query_execution_batch_hash_children_reversed Occurs each time when hash join reverses build and probe side while processing data spilled to disk.
sqlserver query_execution_batch_hash_join_spilled Occurs each time when hash join spills some data to disk in batch processing.
sqlserver query_optimizer_estimate_cardinality Occurs when the query optimizer estimates cardinality on a relational expression.
sqlserver query_optimizer_force_both_cardinality_estimation_behaviors Both traceflags 2312 and 9481 were enabled, attempting to force both old and new cardinality estimation behaviors at the same time. The traceflags were ignored. Disable one or both of the traceflags.
sqlserver query_store_failed_to_capture_query Fired if the Query Store failed to capture query. The Query Store will not track statistics for this query
sqlserver query_store_failed_to_load_forced_plan Fired if the query failed to load forced plan from QDS. Forcing policy will not be applied
sqlserver query_store_persist_on_shutdown_failed Occurs when SQL Server fails to store dirty entries in Query Store on database shutdown.
sqlserver recovery_indirect_checkpoint Chose to enqueue an indirect checkpoint as we are near our recovery target
sqlserver remove_database_cache Remove database cache
sqlserver server_max_workers Occurs when a request enqueue fails because a worker was not guaranteed.
sqlserver session_recoverable_state_change Occurs when the server determines a state change in term of session recovery on a connectionresilency-enabled connection.
sqlserver sql_transaction_commit_single_phase Occurs when a sql transaction is committed with single phase commit.
sqlserver xfcb_blob_properties_obtained Windows Azure Storage blob property is obtained from response header.
sqlserver xfcb_failed_request Failed to complete a request to Windows Azure Storage.
sqlserver xfcb_header_obtained Response header is obtained from request to Windows Azure Storage.
sqlserver xfcb_read_complete Read complete from Windows Azure Storage response.
sqlserver xfcb_request_opened A request is opened to Windows Azure Storage.
sqlserver xfcb_send_complete Request send to Windows Azure Storage is complete.
sqlserver xfcb_write_complete Request send to Windows Azure Storage is complete.
sqlserver xtp_create_procedure Occurs at start of XTP procedure creation.
sqlserver xtp_create_table Occurs at start of XTP table creation.
sqlserver xtp_db_page_allocation_allowed Indicates that page allocations for the database are allowed.
sqlserver xtp_db_page_allocation_disallowed Indicates that page allocations for the database are disallowed due to memory pressure.
sqlserver xtp_deploy_done Occurs at completion of XTP object deployment.
sqlserver xtp_matgen Occurs at start of MAT generation.
sqlserver xtp_offline_checkpoint_scan_start Fired by XTP offline checkpoint when the checkpoint thread begins.
sqlserver xtp_offline_checkpoint_scan_stop Fired by XTP offline checkpoint when the checkpoint thread stops.
sqlserver xtp_recover_done Occurs at completion of log recovery of XTP table.
sqlserver xtp_recover_table Occurs at start of log recovery of XTP table.
sqlserver xtp_storage_table_create Occurs at just before the XTP storage table is created.
ucs ucs_connection_rejected_by_proxy_whitelist After a connection attempt to the UCS proxy endpoint is rejected by whitelist check
ucs ucs_proxy_connect_next_hop UCS proxy next hop connection
ucs ucs_proxy_receive_proxy_connect_message UCS proxy receive proxy connect message
ucs ucs_proxy_route_add UCS proxy route added
ucs ucs_proxy_route_disable UCS proxy route disabled
ucs ucs_proxy_route_refresh UCS proxy route refreshed
ucs ucs_proxy_send_proxy_connect_message UCS proxy send proxy connect message
XtpCompile cgen Occurs at start of C code generation.
XtpCompile invoke_cl Occurs prior to the invocation of the C compiler.
XtpCompile mat_export Occurs at start of MAT export.
XtpCompile pitgen_procs Occurs at start of PIT generation for procedures.
XtpCompile pitgen_tables Occurs at start of PIT generation for tables.
XtpEngine after_changestatetx_event Fires after transaction changes state.
XtpEngine alloctx_event  
XtpEngine attempt_committx_event Is raised when a transaction is asked to commit.
XtpEngine before_changestatetx_event Fires before transaction changes state.
XtpEngine dependency_acquiredtx_event Raised after transaction takes a dependency on another transaction.
XtpEngine endts_acquiredtx_event Fires after transaction acquires an end timestamp.
XtpEngine gc_base_generation_evaluation Indicates that an evaluation of updating the GC base generation has been made.
XtpEngine gc_base_generation_updated Indicates that the oldest active transaction hint used for calculating the GC base generation has been updated.
XtpEngine gc_cycle_completed Indicates that a GC notification has been enqueued.
XtpEngine gc_notification Indicates that GC is processing a notification.
XtpEngine redo_single_hk_record Redo on a HK log record
XtpEngine trace_add_delta_filter_begin Adding delta filter.
XtpEngine trace_add_duplicate_delta_filter Adding duplicate delta filte.
XtpEngine trace_adding_tx_filter Adding tx filter.
XtpEngine trace_begin_close_ckpt_processing Beginning close checkpoint processing: checkpoint flush fence = $2 ($3 state).
XtpEngine trace_cfd_entry_deleted Cleaned up data CFD entry for file $2 $3.
XtpEngine trace_cfd_rows_created Successfully created CFD rows.
XtpEngine trace_cfdtable_dump CfdTable dump
XtpEngine trace_cfp_handles_opened Opened CFP handles for {data: $2 delta: $3} in section $4.
XtpEngine trace_cfp_removed_from_freelist Removed CFP from freelist for destination file.
XtpEngine trace_checkpoint_file_flush Indicating that a file has started a flush operation.
XtpEngine trace_checkpoint_load_begin Starting Checkpoint load with checkpoint timestamp=$2.
XtpEngine trace_checkpoint_write_io Logs an event indicating that an IO has started (when event_type == IoStarted) or that an IO has completed (when event_type == IoComplete).
XtpEngine trace_checksum_validation_succeeded Checksum validation for Hekaton checkpoint file during backup succeeded.
XtpEngine trace_ckpt_close_begin Closing checkpoint in active/passive state.
XtpEngine trace_ckpt_close_signaled Signaling checkpoint close. The checkpoint policy object is flagged to close the current checkpoint
XtpEngine trace_ckpt_closed Checkpoint closed
XtpEngine trace_ckpt_load_thread_stats Statistics of the checkpoint load thread.
XtpEngine trace_ckpt_mrt_dump Mrt dump
XtpEngine trace_ckpt_serialization_state_dump Checkpoint serialization state dump.
XtpEngine trace_ckpt_stream_io_stats Io statistics for this particular stream.
XtpEngine trace_close_file_log_rec_created Successfully created close file log record.
XtpEngine trace_data_file_pages_txs This event gives the number of pages and the transaction range for a data file.
XtpEngine trace_data_from_page_deserialized Deserialized data from page $2 in file $4.
XtpEngine trace_data_row_modified Data row modified/deleted.
XtpEngine trace_delete_cfd_rows_begin Matching MRT not found for the Data CFD. Deleting corresponding CFD Rows.
XtpEngine trace_delete_DeletedObjectTable_row_begin Deleting row from DeletedObjectTable in the context of transaction: $5.
XtpEngine trace_delete_merged_source_file Deleting merged source $7 file $5:$6. DeleteLSN = $2:$3:$4.
XtpEngine trace_delete_mrtrow_for_target_begin Deleting mrt row for target.
XtpEngine trace_delta_entry_skipped Skipping delta {$3, $4, $5} because it is beyond the snapshot checkpoint: $6.
XtpEngine trace_delta_file_future_count_rows_pages_update Updating future count pages and count rows for delta file.
XtpEngine trace_delta_file_lastgood_count_rows_pages_update Updating lastgood count pages and count rows for delta file.
XtpEngine trace_delta_file_pages_txs This event gives the number of pages and the transaction range while reading a delta file for a particular operations.
XtpEngine trace_delta_file_processed Completed processing of Delta file.
XtpEngine trace_delta_file_set_clean_or_dirty Delta file set clean or dirty.
XtpEngine trace_delta_filter_removed Removing delta filter from DeltaFilterMap due to transaction filter.
XtpEngine trace_delta_watermark_removed Removed delta watermark.
XtpEngine trace_delta_watermark_updated Updated delta watermark row for FileId: $4.
XtpEngine trace_deserialize_chained_records Info pertaining to the deserialized content of the mrtRecords chain.
XtpEngine trace_deserialize_data_from_page_begin Deserializing data from page $2 in file $4.
XtpEngine trace_deserialize_source_delta_file_begin Deserializing source delta file $4: page range [$2, $3).
XtpEngine trace_dump_cfd_row Dump cfd row
XtpEngine trace_dump_mrt_row Merge Request
XtpEngine trace_file_close_skipped Skipping file close for $2 as the cfp had been merged, It could not be found in the Storage array.
XtpEngine trace_file_skipped Skipping file $4 due to reason $5.
XtpEngine trace_file_skipped_with_tx_range Skipping file $5 with TX range { $3 -> $4 } due to MaxTxId == InvalidTxId.
XtpEngine trace_first_page_header_flushed Flushed first page header for file.
XtpEngine trace_flush_io_operation_for_delta_file This trace is trying to catch pages issued for flush that didn't make it to the file, or were lacking the correct DeltaWatermark Timestamp.
XtpEngine trace_flush_skipped_for_closed_data_file Skipping flush for data file ('$2') as it is closed.
XtpEngine trace_future_count_pages_update Updating future count pages.
XtpEngine trace_initial_merge Doing initial merge for destination $3 at CheckpointTs: $2.
XtpEngine trace_insert_DeletedObjectTable_row_begin Inserting row to DeletedObjectTable in the context of transaction: $5.
XtpEngine trace_intialize_worker_file_begin Processing file close.
XtpEngine trace_mark_data_file_closed Marking the active data file as closed to prevent the offline worker fom flushing them.
XtpEngine trace_merge_cancelled Merge was cancelled for destination $2.
XtpEngine trace_merge_complete_log_rec_ignored MergeCompleteLogRecord ignored for destination file $3.
XtpEngine trace_merge_complete_log_rec_processed Successfully processed MergeCompleteLogRecord.
XtpEngine trace_mrt_dump Mrt dump.
XtpEngine trace_mrt_row_inplace_update Mrt row updated in place.
XtpEngine trace_mrtrow_not_found Could not find row with Destination ID: $2 in MRT table.
XtpEngine trace_new_delta_watermark_inserted Inserted new delta watermark row for FileId $3.
XtpEngine trace_offline_process_stale_merge_item Offline processing of stale merge item {$2, $3} Destination $4.
XtpEngine trace_pending_tx Pending Transaction
XtpEngine trace_populate_storage_array Populating the storage array.
XtpEngine trace_post_writefile This event is fired after issuing IO on the proxy.
XtpEngine trace_process_file_close_begin Processing file close.
XtpEngine trace_process_merge_complete_log_record Process merge complete log record.
XtpEngine trace_process_merge_request Process Merge Request
XtpEngine trace_process_source_file Processing source $4 file $2.
XtpEngine trace_process_target_file Processing target $4 file $2.
XtpEngine trace_queue_merge_work_item Queue work item: {$2, $3} $5 - $6 with CheckpointTs as $4.
XtpEngine trace_recovered_existing_file Recovered exising files files allocated during forward processing that are not already part of the CCB.
XtpEngine trace_resyncing_state_of_file Resyncing state of file $4 ('$5') post recovery:  $2 pages, $3 rows.
XtpEngine trace_serialization_object_cleaned Cleaned serialization object.
XtpEngine trace_serialize_abort_transaction_begin Serializing the abort transaction filter to the delta cache corresponding to its own transaction range.
XtpEngine trace_serialize_tx_begin Serialize TS begin for completing the checkpoint in active state.
XtpEngine trace_serialize_tx_end Serialize TS end for completing the checkpoint.
XtpEngine trace_serialized_delta_rows_to_file Serialized delta rows to file.
XtpEngine trace_source_file_load_stats Load stats for source files in merge.
XtpEngine trace_storage_refreshed_for_file Storage refreshed for file.
XtpEngine trace_uninitialize_file uninitializing_file
XtpEngine trace_wrote_delta_watermark Wrote delta watermark for file: $3, checkpointTs: $2.
XtpEngine waiting_for_dependenciestx_event Raised when we have explicitly waited for dependencies to clear.
XtpEngine xtp_before_create_log_record Fired before submitting a request to the host to serialize a non-transactional log record.
XtpEngine xtp_checkpoint_file_flush Indicates the point at which a given file has been flushed to disk.
XtpEngine xtp_checkpoint_file_flush_complete Indicates the point at which all in-flight buffers have been flushed to disk.
XtpEngine xtp_checkpoint_file_read Indicates reading of a file in XTP checkpoint recovery.
XtpEngine xtp_checkpoint_worker_active_log Indicates that the checkpoint worker has started processing the log records in the active portion of the log.
XtpEngine xtp_checkpoint_worker_started Indicates that the checkpoint worker has started processing the log records.
XtpEngine xtp_checkpoint_worker_stopped Indicates that the checkpoint worker has started processing the log records.
XtpEngine xtp_checkpoint_write_io Indicates that the checkpointing subsystem has issued or completed a write IO.
XtpEngine xtp_complete_checkpoint Indicates the begin and end of complete checkpoint processing.
XtpEngine xtp_create_log_record Fires when the XTP engine creates a log record.
XtpEngine xtp_delta_marked_dirty Indicates that a delete/update was serialized and marked a delta file dirty
XtpEngine xtp_merge_complete_log_record Indicates merge complete log record is posted to the log.
XtpEngine xtp_merge_log_complete_log_record Indicates merge log record was interpreted by the offline worker.
XtpEngine xtp_merge_process_log_record Indicates merge log record was interpreted by the offline worker.
XtpEngine xtp_merge_request_log_record Indicates merge request log record is posted to the log.
XtpEngine xtp_merge_request_started Indicates merge request has been picked up by the merge worker thread.
XtpEngine xtp_root_deserialized Indicates that the load of a checkpoint root is complete.
XtpEngine xtp_root_serialized Indicates that the write of the checkpoint root is complete.
XtpRuntime bind_md Occurs prior to binding metadata for a memory optimized table.
XtpRuntime bind_tables Occurs prior to binding tables for a natively compiled procedure.
XtpRuntime create_table Occurs prior to creating memory optimized table.
XtpRuntime deserialize_md Occurs prior to deserializing metadata.
XtpRuntime load_dll Occurs prior to loading the generated DLL.
XtpRuntime recover_done Occurs at completion of checkpoint recovery of a memory optimized table.
XtpRuntime recover_table Occurs at start of checkpoint recovery of a memory optimized table.
XtpRuntime serialize_md Occurs prior to serializing metadata.
XtpRuntime unload_dll Occurs prior to unloading the generated DLL.

Happy tracing,

 

Andreas

Received MVP Award for SQL Server

Ausgezeichnet mit dem MVP-Award für SQL Server

Gestern, am 1. April 2014 erhielt ich die frohe Botschaft: Für meine Beiträge zur Community bin ich von Microsoft mit dem MVP Award (MVP=Most Valuable Professional) ausgezeichnet worden (zum MVP-Profil).

Yesterday, on 1 April 2014, I got great news:

I have been awarded with the MVP Award by Microsoft (MVP=Most Valuable Professional) for my contributions to the community (click here for MVP profile).

 

 

clip_image002

 

 

Ich freue mich riesig über diese Anerkennung meiner zahlreichen Konferenz-Beiträge, Usergroup-Meetings und anderen Aktivitäten!

So bin ich seit 2009 bis Stand heute auf 27 Konferenzen als Redner zu verschiedenen SQL Server Themen, von Sicherheit über Performance & Indexdesign bis hin zu Reporting Services aufgetreten und habe auf weiteren 34 Usergroup-Meetings Vorträge gehalten.

2013 hat sich meine Aktivität noch einmal gesteigert, so dass ich allein in diesem Jahr auf 11 Konferenzen, von Istanbul/Türkei bis Charlotte/USA, und 14 PASS Regionalgruppentreffen (Liste) als Sprecher angetreten bin.

Und auch 2014 habe ich bereits 2 Konferenzen und 4 Regionalgruppentreffen (Liste) hinter mir – weitere werden folgen: Portugal, England und wenn es hoffentlich? klappt zum 6. Mal in den USA :-)

Damit bin ich fast so viel auf Konferenzen unterwegs wie drei weitere deutsche MVP-Kollegen, die diese Auszeichnung bereits hochverdient für ihren Einsatz für die deutsche SQL Server Community PASS Deutschland e.V. erhalten haben: Tillmann Eitelberg, Oliver Engels – beide im Vorstand der PASS – und Constantin Klein, der unter anderem den Just Community e.V. und die .NET User Group Frankfurt leitet. – Ich freue mich, zu dieser illustren Runde dazustoßen zu können!

Dieser Award ist für mich daher eine tolle Anerkennung und ein Ansporn weiterzumachen – was natürlich nicht heißt, dass ich es nicht auch ohne diesen tun würde, denn die Interaktion mit der Community ist für sich gesehen schon eine echte Bereicherung, von der alle profitieren.

An dieser Stelle möchte ich einigen Personen persönlich meinen Dank aussprechen, die meine Nominierung zum MVP auf verschiedene Weise unterstützt haben:

I am very excited about this recognition of my many contributions to conferences, usergroup meetings, and other activities!

In fact, since 2009 till today, I have appeared as a speaker in 27 conferences, speaking on different SQL Server topics from security to performance & index design to reporting services, and have given presentations in 34 usergroup meetings.

Normal 0 false 21 false false false DE X-NONE X-NONE

2013 saw yet another boost in my activities: That year alone I was speaker at 11 conferences, from Istanbul/Turkey to Charlotte/USA, and at 14 PASS regional group meetings (list).

In 2014, too, I can already look back on 2 conferences and 4 regional group meetings (list) – with more to come: Portugal, England, and – hopefully it will work out – USA for the 6th time. :-)

Thus, I am participating in conferences to an almost similar extent as three other German MVP colleagues who have already been awarded, quite deservedly, the very award for their commitment to the German SQL Server Community PASS Deutschland e.V.: Tillmann Eitelberg, Oliver Engels – both of them in the chair of the PASS – and Constantin Klein who heads the Just Community e.V. and the .NET User Group Frankfurt, among others. – I am honored to be joining this illustrious circle!

This award is indeed a fantastic acknowledgement and incentive to continue – of course, this doesn’t mean I wouldn’t do so without this award, because the interaction with the community is in itself already an enrichment from which everyone is benefiting.

I would like to express my personal thanks to the following people who have supported my nomination to MVP in various ways:


Normal 0 21 false false false DE X-NONE X-NONE

Normal 0 21 false false false DE X-NONE X-NONE

Anna Feth (Microsoft MVP Programmkoordinator Region DACH), @AnnaFeth), Constantin Klein (MVP, Blog, @KostjaKlein), Daniel Weinmann (Product Marketing Manager - SQL Server/ BI Microsoft GmbH), Florian Endres (Community Program Manager, @senorf), Heike Ritter (Technical Evangelist Microsoft Deutschland GmbH, @HeikeRitter), Jack Richins (Principal Development Lead Microsoft SQL Server Security), Katrin Letzel (Microsoft MVP Community Program Manager, @katko), Niko Neugebauer (MVP, Blog, @NikoNeugebauer), Oliver Engels (MVP, @oengels), Scott Klein (SQL Server Evangelist, Microsoft, @SQLScott), Tillmann Eitelberg (MVP, Blog, @_Tillmann) and the Team of the datafino GmbH, to which I have a strong partnership as well as all anonymous supporters and technical sparring partners.

 

 

So bin ich mindestens genauso dankbar für all die wertvollen Kontakte, die Gesprächsmöglichkeiten und den Austausch untereinander wie für den Award selber.

Thus, I am at least equally grateful for all the valuable contacts, opportunities for dialogue and mutual exchange as for the award itself.

 

Andreas

MCSM, MCM and MVP :-)

DISABLE and DENY LOGIN, DENY USER & Effect on Impersonation and Permissions

DISABLE und DENY LOGIN, DENY USER & Effekt auf Impersonierung und Berechtigungen 

Ein kurzer Artikel zu den Effekten – oder fehlenden Effekten – in Bezug auf das Deaktivieren & Verbieten von Connect für Logins und Users auf Impersonierung und Berechtigungen.

A short article on the effects - or missing effects - regarding the disabling & denying connect of Logins & Users on impersonation and permission.

Immer mal wieder kann man beobachten, dass Logins oder Usern die Connect-Berechtigung verboten bekommen wurde, oder ein Login deaktiviert wurde.

Die richtige Erwartung und Verständnis kann daher kritisch sein.

Sehen wir uns also eine einfache Demo an:
Wir werden das eingebaute sa-Konto, welches von vielen unter anderem als Datenbankbesitzer (mehr dazu bald in einem anderen Artikel –
zwischenzeitlich lade ich Sie dazu ein, noch Daten zu der Umfrage zu diesem Thema einzusenden), ein weiteres frisch angelegtes Konto und eine Datenbank, genannt ImpersonateLogin mit dem entsprechenden User + einem weiteren User ohne Login: SQLUser.

Every once in a while one can observe that Logins or Users have been denied the Connect permission or a Login has been disabled.

Therefore a correct expectation and understanding can be critical.

So let’s see a simple demo:
We will use the built-in sa-Account, which is used by many as database owner among other (more on that soon in another article -
meanwhile I do invite you to still send in data for the survey on that topic), another freshly created Account DeniedLogin and a database called ImpersonateLogin with the according User + another User without Login: SQLUser.

 DisabledPrincipals_Script

Ich deaktiviere also das sa-Konto ebenso wie das „DeniedLogin“-Konto – letzterem verbiete ich außerdem die Connect-Berechtigung (Erinnern wir uns daran: „Berechtigungen können nicht für sa, dbo, Entitäts-Besitzer, information_schema, sys oder für den Benutzer selbst erteilt, verweigert oder aufgehoben werden.“)

Der Datenbank-User „SQLUser“ bekommt die Connect-Berechtigung auf die Datenbank verboten.
In der GUI sieht das Ergebnis so aus:

So I am disabling the sa-account as well as the “DeniedLogin”-Account – the latter I also Deny the Connect permission (Remember we “Cannot grant, deny, or revoke permissions to sa, dbo, entity owner, information_schema, sys, or yourself.”)

The Database-User “SQLUser” gets denied the Connect permission on the database.

In the GUI the result looks like this:

 DisabledPrincipals_Setup_Disabled_Login

DisabledPrincipals_Setup_Disabled_sa

Nun führen wir 4 Tests durch:

Now let’s run 4 tests.

 DisabledPrincipals_Test1

Was diese Abfragen im Wesentlichen machen, ist, zu versuchen, den entsprechenden Login oder User zu impersonieren – und den Erfolg dadurch belegen, dass sie die dann jeweils aktiven Rollen-Mitgliedschaften zurückgeben.
Ergebnisse:

So essentially what those queries do, is trying to impersonate the respective Login or User – and proofing success by returning the then respective active role-memberships.

Results:

 DisabledPrincipals_Result

DeniedLogin: Impersonierung funktioniert + kein Verlust an Berechtigungen.
In other words: Denying Connect to a Login does not disallow Impersonation.
Impersonation is actually another permission which one can use and is not affected even by Disabling the Login!

DeniedLogin: Impersonation works + No loss of permissions.
In other words: Denying Connect to a Login does not disallow Impersonation.
Impersonation is actually another permission which one can use and is not affected even by Disabling the Login!

 DisabledPrincipals_Result

Dasselbe gilt für den sa: Impersonierung funktioniert + kein Verlust a Berechtigungen.

Im Folgenden ein Test für den User, dem die Connect-Berechtigung auf die Datenbank entzogen worden ist – und nicht als Login verwendet werden kann.

Same applies for sa: Impersonation works + No loss of permissions.

In the following test for the User which has been denied the Connect-permission onto the database – and cannot be used as a Login.

 DisabledPrincipals_Test2

Ergebnisse:

Msg 15517, Level 16, State 1, Line 3

Die Ausführung als Datenbankprinzipal ist nicht möglich, weil der Prinzipal 'DeniedLogin' nicht vorhanden ist,
für diesen Typ von Prinzipal kein Identitätswechsel möglich ist, oder Sie nicht die erforderliche Berechtigung haben.

 

Msg 916, Level 14, State 1, Line 3

Der Serverprinzipal 'S-1-9-3-4049223906-1289824279-1154161590-488313048.'
kann unter dem aktuellen Sicherheitskontext nicht auf die ImpersonateLogin-Datenbank zugreifen.

Results:

Msg 15517, Level 16, State 1, Line 3

Cannot execute as the database principal because the principal "DeniedLogin" does not exist,
this type of principal cannot be impersonated, or you do not have permission.

 

Msg 916, Level 14, State 1, Line 3

The server principal "S-1-9-3-4049223906-1289824279-1154161590-488313048."
is not able to access the database "ImpersonateLogin" under the current security context.

Das Ergebnis ist für beide Datenbank-User effektiv das gleiche.

Die GUID repräsentiert keinen reellen Server-Prinzipal, denn der User SQLUser hat keinen entsprechenden Login.
Daher sagt es uns, dass die User nicht innerhalb der Datenbank impersoniert werden können.

Der Unterschied für den 2. User ist, dass dieser User nur innerhalb der Datenbank existiert, aber zugleich expliziert verboten wurde, sich mit ihr zu verbinden Das hat im Endeffekt dasselbe Resultat, wie ihn zu deaktivieren – genau wie der Guest-User es ist.

The GUID does not represent a real server-principal, because the User SQLUser does not have a matching Login.
So it tells us, that the users cannot be impersonated inside the database.

The difference for the second user is, that this user only exists inside the database but at the same time has been explicitly denied to connect to it. This has essentially the same result as “disabling” it – just as the guest-user is.

Damit wäre gezeigt, dass das Deaktivieren von Logins keinerlei Sicherheit gegenüber Angriffen von Innen gibt. Und sogenannte Privilegien Erweiterung findet in aller Regel z.B. von innen heraus statt.

Auch der alte „Trick“, die Standard-Datenbank des Logins zu löschen, ist da keine Hilfe.

Für Datenbank-User hat es durchaus Effekt und verhindert das Anmelden an der jeweiligen Datenbank – auch „von Innen heraus“.

 

Thereby it is shown, that disabling of Logins does not give any security against attacks from inside. And so-called privilege elevation (/-escalation) usually takes part from internal.

Also the old “trick”, to drop the default-database of a Login, is of little help.

For database-users is indeed does have an effect and prevents logon/connect to the respective database – also “from inside”.

Konsequenterweise bleiben alle Berechtigungen (natürlich abgesehen von dem jeweiligen Deny) der jeweiligen Logins und User absolut unbeeinflusst von einer Deaktivierung jeglicher Weise.

Das gilt auch im Zusammenhang mit „External Access“-Berechtigung für Logins basierend auf asymmetrischen Schlüsseln.
(Hier ein Forum-Thread, in dem die Frage auftauchte: “
SQL Login "disabled" flag does not work with asymmetric key??”)

ALTER LOGIN ist auch hier in BOL erklärt: technet.microsoft.com/en-us/library/ms189828.aspx

 

Ich hoffe, diese Dinge erklären einiges und speziell Empfehlungen in Sicherheits-Aspekten.

Consequentially all permissions (besides the one denied of course) of the respective Login and User stay totally unaffected by and method of deactivation.

This is also true in the context of “external access”-permission for Logins based on asymmetric keys.
(Here a forum-thread where the question appeared: “
SQL Login "disabled" flag does not work with asymmetric key??”)

ALTER LOGIN is also explained in BOL here: technet.microsoft.com/en-us/library/ms189828.aspx

 

I hope those things clarified some things and especially recommendations in security-matters

 

Happy securing

Andreas

Upcoming Conferences: SQLSaturdays in Denmark and Portugal. – Presenting In-Memory OLTP Deep-Dive for Administrators

 

Im März und April finden 2 europäischen SQLSaturdays statt, die Potential zu einem Geheimtipp haben:

Am 29. März in Kopenhagen, Dänemark
ind am 12. April in Lissabon, Portugal.

Da ich auch letztes Jahr bereits in Kopenhagen als Sprecher dabei war, kann ich aus erster Hand für die exzellente Organisation und Sprecherauswahl verbürgen.

Und für Portugal verbürgt mein sehr geschätzter Kollege Niko Neugebauer (Blog, Twitter:@NikoNeugebauer) – nach allem, was bisher „geleaked“ ist, wird es wieder ein Kongeniales Event. Würdig der ersten SQLSaturday-Location in Europa überhaupt.

In March and April, 2 European SQLSaturdays take place, which have the potential for a real insiders’ tip:

On March 29th in Copenhagen, Danmark
and April 12th in Lisbon, Portugal.

Since I already participated as a speaker in Copenhagen last year, I can avouch from “insider information” for the excellent organization and speaker choice.

And my much valued collegue Niko Neugebauer (Blog, Twitter:@NikoNeugebauer) vouches for Portugal – after all what has “leaked” in th emeantine, it will be another congenial event. Condign to the first SQLSaturday-Location in Europe ever.

 

 

Normal 0 21 false false false DE X-NONE X-NONE

Ich möchte zumindest einige, mir persönlich bekannte Sprecher namentlich erwähnen, aber gleich betonen, dass auch alle anderen Sessions definitiv einen Blick Wert sind(!):

In Dänemark sind dabei:

·       André Kamman aus den Niederlanden zu BIML und SSIS Deployment Automatisierung

·       Belkis Ozhorasan aus der Türkeit gibt einen Deep-Dive zu In-Memory für Entwickler
David Peter Hansen, MCM, zu Integration Services Internas

·       Glenn Berry aus den USA zu I/O Performance Analyse

·       Hugo Kornelis, wie sollte es anders sein mit Indexoptimierung

·       Jen Stirrup, die europäische Stimme im Board of Directors der PASS zu PowerBI und Big Data

·       Jens Vestergaard zu Analysis Services Sicherheit

·       Mikael Wedham zu SSIS Skript Komponenten

·       Milos Radivojevic aus Österreich, zu dem neuen Cardinality Estimator in SQL Server 2014

·       Marco Russo aus Italien zu DAX-Optimierung

·       Marcin Szeliga aus Polen zu Denormalisierung und Indexing

·       Margarita Naumova, eine MCM-Kollegin aus Bulgarien zu Abfrageoptimierung

·       Neil Hambly mit Memory Management

·       Uwe Ricken, MCM aus Deutschland mit einem Deep-Dive in CRUD-Operationen

Die vollständige Agenda befindet sich hier: www.sqlsaturday.com/275/schedule.aspx

Normal 0 21 false false false DE X-NONE X-NONE

I would like to at least name some speakers, which I personally know, by name, but I would also like to stress immediately, that also all other sessions are definitely worth looking at just as well:

In Denmark there will be:

·       André Kamman from the Netherlands on BIML and SSIS deployment automation

·       Belkis Ozhorasan from Turkey with a deep-dive on In-Memory for Developes
David Peter Hansen, MCM, on Integration Services Internals

·       Glenn Berry from then US on I/O Performance Analysis

·       Hugo Kornelis, what else would it be, on index optimization

·       Jen Stirrup, the European voice in the Board of Directors of the PASS on PowerBI and Big Data

·       Jens Vestergaard on Analysis Services Security

·       Mikael Wedham on SSIS Script components

·       Milos Radivojevic from Austria, on the new Cardinality Estimator in SQL Server 2014

·       Marco Russo from Italy on DAX-optimization

·       Marcin Szeliga from Poland on denormalization and Indexing

·       Margarita Naumova, an MCM-collegue from Bulgaria on Query optimization

·       Neil Hambly with Memory Management

·       Uwe Ricken, MCM from Germany with a deep-dive in CRUD-operations

I am excited to see all of you again soon!

The complete Agenda can be found here: www.sqlsaturday.com/275/schedule.aspx

I am excited to see all of you again soon in Copenhagen!

 

 

In Portugal sind dabei:

· Belkis Ozhorasan auch hier mit dem Deep-Dive zu In-Memory für Entwickler

· Brent Ozar zu AlwaysOn Availability Groups und Engine-Internas

· Constantin Klein, einem Kollegen aus der PASS Rhein/Main und Leiter der .Net Usergroup in Deutschland zu dem SQL Server Data Tools

· Dejan Sarka aus Slovenien zu hochperformanten statistischen Abfragen

· Edwin Sarmiento zum Einfluss des Transaktionsprotokolls auf HA/DR sowie Big Data in Sharepoint 2013

· Glenn Berry zu I/O Performance Analyse

· Hugo Kornelis aus den Niederlanden zu nutzerdefinierten Aggregaten

· Jen Stirrup, die europäische Stimme im Board of Directors der PASS zu Power View Visualisierungen

· Johan Bijnens aus Belgien zu Powershell für DBAs

· Matija Lah aus Slovenien zu XQuery

· Mihail Mateev aus Bulgarien zum Entity Framework 6

· Milos Radivojevic, auch hier zu dem neuen Cardinality Estimator in SQL Server 2014

· Niko Neugebauer mit einer weiteren Auflage seines Columnstore Index Deep-Dive

· Oliver Engels zusammen mit Julian Breunung, meine Kollegen aus der RG Rhein/Main mit dem legendären M vs P vs R Data Exploration-Sprach-Battle

· Oliver Engels noch einmal zusammen mit Tillmann Eitelberg, meinem Co-Regionalgruppenvertreter aus Köln zu Power in der Cloud

· Paul Turley zu Datenvisualisierungen sowie dem Tabular Model

· Peter ter Braake, aus den Niederlanden, zu MDX sowie DataMining

· Regis Baccaro, aus Dänemark zu Sharepoint Administration

· Scott Klein, dem wohl meist-bereisten Technical Evangelist von Microsoft/USA – wie sollte es anders sein: zu HA/DR und SQL Azure

· Sergey Olontsev zu Abfrageplänen im Deep-Dive

· Turgay Sahtiyan aus der Türkei mit 10 Performance Tipps zu SQL Server

Die vollständige Agenda befindet sich hier:

www.sqlsaturday.com/267/schedule.aspx

In Portugal there will be:

· Belkis Ozhorasan here as well with the Deep-Dive on In-Memory for Developers

· Brent Ozar on AlwaysOn Availability Groups and Engine-Internals

· Constantin Klein, einem Kollegen aus der PASS Rhein/Main und Leiter der .Net Usergroup in Deutschland zu dem SQL Server Data Tools

· Dejan Sarka from Slovenia on high performing statistical Queries

· Edwin Sarmiento on the influence of the transaction log on HA/DR as well as on Big Data in Sharepoint 2013

· Glenn Berry on I/O Performance analysis

· Hugo Kornelis from the Netherlands on user defined aggregates

· Johan Bijnens from Belgium on Powershell for DBAs

· Matija Lah from Slovenia on XQuery

· Mihail Mateev from Bulgaria on Entity Framework 6

· Milos Radivojevic, also here on the new Cardinality Estimator in SQL Server 2014

· Niko Neugebauer with another edition of his Columnstore Index Deep-Dive

· Oliver Engels together with Julian Breunung, my collegues from the Rhein/Main-Chapter in Germany with the legendary M vs P vs R Data Exploration-Language-Battle

· Oliver Engels another time with Tillmann Eitelberg, my Co-Chapter-Leader from Cologne on Power in the Cloud

· Paul Turley on data visualization as well as on the Tabular Model

· Peter ter Braake, from the Netherlands, on MDX as well as on DataMining

· Regis Baccaro, from Denmark on Sharepoint Administration

· Jen Stirrup, the European voice in the Board of Directors of the PASS on Power View visualization

· Scott Klein, the probably most-travelled Technical Evangelist from Microsoft/USA – what else should it be: on HA/DR and SQL Azure

· Sergey Olontsev on Query plans in Deep-Dive

· Turgay Sahtiyan from Turkey with 10 Performance Tips for SQL Server

The complete Agenda can be found here: www.sqlsaturday.com/267/schedule.aspx

I am excited to see all of you again soon in Lisbon!

Und meine Wenigkeit, was präsentiere ich?
Nachdem ich mich nun seit November 2013, wo ich die neue Technologie in Deutschland erstmalig öffentlich präsentierte, eingehend mit eXtreme Transactional Processing, der neuen, integrierten, In-Memory Engine des SQL Server beschäftige, gibt es nun den Deep-Dive für Administratoren:

And my humble self, what am I presenting?
After I have been engaged deeply with eXtreme Transactional Processing, the new, integrated, In-Memory Engine of SQL Server, since November 2013, where I presented this new technology for the first time publically in Germany, I will now give a Deep-Dive for Administrators:

 

SQL Server 2014 In-Memory OLTP / XTP Management Deep Dive
@SQLSaturday Denmark & Portugal

You have heard about Hekaton, respectively the new acronym XTP (eXtreme Transactional Processing) and you want to know how it works under the cover? In this session we will take a closer look at the architecture, where the performance benefits come from and how it works in detail. What kind of files is SQL Server using for transactional consistency, what happens when you delete data inside the log and inside the data files. We will see the Merge-Process and the Garbage Collector in action, see how memory management works for XTP enabled databases, and thereby get an in-depth understanding of how this completely new storage engine works and how to optimize for it.

Normal 0 21 false false false DE X-NONE X-NONE

CU in Copenhagen, Lisbon.. or at another conference soon Smile

Andreas

Spezialrabattaktionen: 22% zum Jubiläumsjahr der PASS Deutschland e.V für Sicherheits- XEvent Tracing, sowie SQL Server 2014 Seminare + 10% Microsoft TechNet Aktion für alle

Damit auch alle, die vor 2 Wochen nicht auf der SQL Konferenz in Darmstadt (www.sqlkonferenz.de) waren, oder nicht regelmäßig bei TechNet vorbeischauen, eine Chance haben, poste ich es hier einmal öffentlich:

1)       Zum Jubiläumsjahr der PASS Deutschland e.V erhalten alle Mitglieder den „Jubiläums-Rabatt“ von 22 Prozent (!) auf die folgenden SQL Server Master-Classes:

birthday-cake
(SES) SQL Server Security Essentials für Entwickler & Administratoren – am 3. April 2014 in Düsseldorf
- Dieses Seminar ist für alle Einsteiger geeignet, die hier alle Grundlagen für die Sicherheitsverwaltung & Architektur von SQL Server erlernen.
(SIA) Securityworkshop for SQL Server Administrators (advanced) – 4. April 2014 in Düsseldorf
- In diesem Workshop werden sicherheitsrelevante Internas der Authentifizierung, das Konzept der Contained Databases, Daten- & Backupverschlüsselung mit Transparent Data Encryption (TDE) bis hin zu Überwachungstechniken in SQL Server erlernt.
(XE1) Einsteiger-Workshop Tracing mit Extended Events in SQL Server - am 7. März 2014 in Frankfurt am Main
- Das Grundlagentraining für alle, die den Nachfolger von SQL Trace & Profiler von Grund auf beherrschen möchten.
(XE3) FastTrack to Tracing with Extended Events for SQL Server - am 1. April 2014 in Frankfurt am Main
- Für Einsteiger, die die Funktionalitäten und Einsatzmöglichkeiten der Extended Events von A-Z an einem verlängerten Tag kennenlernen möchten.
(UP2014) Aktualisierung der Kenntnisse von SQL Server 2012 auf SQL Server 2014 - am 15. Mai 2014 in Frankfurt am Main
- Der neue SQL Server 2014 steht vor der Tür. Von Buffer-Pool Erweiterungen bis zu In-Memory OLTP enthält dieser viele wichtige neue Technologien, die an diesem Tag praxisnah kennengelernt werden.
(XTC) Workshop In-Memory OLTP & ColumnStore - New Storage Engines in SQL Server 2014 - am 16. Mai 2014 in Frankfurt am Main
- An diesem eintägigen Workshop werden die neuen und verbesserten In-Memory Technologien XTP für extrem performantes OLTP und Clustered Columnstore Indexes für DataWarehousing in aller Tiefe praktisch kennengelernt.


Und das ist der Gutschein-Code (exklusiv für Mitglieder der PASS Deutschland e.V.):
10PASSDE2014 *1 *2

Tipp: jeder kann sich jederzeit noch schnell und kostenlos(!) als Mitglied bei der PASS Deutschland e.V. anmelden – Details dazu auf der Webseite der PASS: www.sqlpass.de/Mitgliedschaft/Mitgliedwerdenistkostenlos.aspx

2)       Außerdem freue ich mich, noch auf eine andere Aktion, und zwar in Zusammenarbeit mit der  Microsoft Technet IT Pro Academy hinweisen zu können. Für ausgewählte Seminare gibt es einen speziellen Rabattcode *1, der hier über die TechNet-Seite zu finden ist: technet.microsoft.com/de-de/bb291022?it_product=sql-server&it_topic=zertifizieren, für 10% auf weitere Seminare:


(PAT) Workshop Performance und Analyse, Techniken & -Tools
- 17./18. März 2014

(SHA) Workshop Hochverfügbarkeit für SQL Server - 6./7. Mai 2014

*1  Rabatt-Codes können nicht mit anderen Codes kombiniert werden
*2 Dieser Code ist gültig bei Verwendung bis zum bis 30.4.2014

Und hier findet Ihr die Gesamtübersicht der SQL Server Master-Classes und Links zur Anmeldung:
www.sarpedonqualitylab.com/SQL_Master-Classes.htm

Viel Spaß beim Lernen wünscht

Der Andreas

 

Microsoft Certified Solutions Master Data Platform (SQL Server 2012)
Microsoft Certified Master SQL Server 2008
Microsoft Certified Trainer

SQL Server Row- and Cell-Level Security – Disclosure vulnerability // Schwachstellen in Zeilen-basierter Sicherheit

 

 

Es ist Zeit für einen weiteren Artikel zum Thema Sicherheit.
Und durch einen Forum Thread zu „Datengesteuerter Sicherheit“ mittels der IS_MEMBER(), USER_NAME(), SUSER_SNAME() – Funktionen kam ich auf die Idee, ein kurzes Beispiel zu zeigen, wie sich solche Konstrukte leicht umgehen lassen und die geschützten/verborgenen Daten offengelegt werden können, wenn sie nicht mit weiteren Mitteln gesichert werden.
Sehen wir uns ein Beispiel an.

It’s time for another post on security matters.
And through a forum-thread on data-driven security by the means of views using the IS_MEMBER(), USER_NAME(), SUSER_SNAME() – functions, I came up with the idea of giving a short example how such constructs can easily be circumvented and the protected/hidden data become disclosed, when not being secured by further means.
So let’s look at an example.

Im Folgenden werden wir ein recht verbreitetes Szenario sehen, wie Sicherheit auf Zeilenebene / Row-Level Security (und auch Zellenebene/Cell-Level Security) implementiert werden kann.

Die Architektur ist recht einfach:
Eine Tabelle enthält Datenzeilen, von welchen einige von einer bestimmten Gruppe Personen gelesen werden darf, und andere Zeilen von anderen Personen – jeweils exklusiv.
Um das zu erreichen, wird eine Sicht angelegt. Diese Sicht muss natürlich denselben Besitzer haben, so dass der Prinzipal Berechtigungen auf die Sicht alleine erhalten kann, und durch die Besitzerkette an die Daten gelangt.
Innerhalb der Sicht ist eine Where-Klause, die einen Filter auf ein bestimmtes Attribut in der Tabelle enthält, durch das der Benutzer der aktuellen Sitzung erkannt wird und ausschließlich die Daten zurückgeliefert werden, die seiner Rollen-Mitgliedschaft entsprechen.
Natürlich gibt es auch komplexere Designs mit Zwischentabellen und mehrfachen Rollenmitgliedschaften/Rechten, aber am Ende teilen alle dieselbe Schwachstelle, die ich demonstrieren werde.
Im Folgenden zunächst ein Diagramm der Architektur.

In the following we will see a quite common scenario of how Row-Level Security (and also Cell-Level Security) can be implemented.

The architecture is quite simple:
A table is holding rows of data, some of which are supposed to be readable by a certain group of people, and other rows by other people – in each case exclusively.
In order to achieve this, a view is created. This view naturally must have the same owner, so the principal can be granted permissions on nothing but the view get to the data by means of the ownership-chain.
Within the view there is a Where-clause which contains a filter on a certain attribute in the table, by which the user of the current session is detected and returned solely the data which matches his role-membership.

Of course there are also more complex designs with intermediate tables and multi-role-memberships/permissions, but it all comes down sharing the same vulnerability which I am about to demonstrate.

First of all here's a diagram of the high-level architecture:

 

clip_image002

Sehen wir uns das ganze also an.
Die Einrichtung Tabelle und der Sicht, inklusive 2er Beispieldatensätze:

So let’s see it in action.
The Setup of the Table and the View including 2 sample data rows:

 

clip_image003

Die Spalte „Role“ wird von der Sicht verwendet, um die jeweilige Zeile, unter Verwendung der IS_MEMBER()-Funktion nur Mitgliedern der jeweils hinterlegten Datenbankrolle durchzureichen.

The column “Role” is used by the view to return the respective row by using the IS_MEMBER()-function only to members of the respectively stored database-role.

 

clip_image004

Benutzer, Rollen und Berechtigungen:

User(s), Roles and Permissions:

 

clip_image005

Erinnern wir uns, was die Tabelle enthält:

Now, remember what our table contains:

 

clip_image006

In einer heilen Welt, vor dem Sündenfall, wäre dies ausreichend.
(Nachdem wir uns als „Andreas“, der Mitglied der Datenbankrolle RoleAlpha ist, einloggen) würden unsere Abfragen wie folgt aussehen, und lediglich die Zeilen zurückliefern, die der RoleAlpha „gehören“:

So in an innocent world, before the fall of mankind, this would be sufficient.
(After logging in as “Andreas”, who is member of the RoleAlpha database-role) our queries would look like this and only return the rows which “belong” to RoleAlpha:

 

clip_image007

- Natürlich wird die Funktion User_Name() nur für Demo-Zwecke eingesetzt.
Ergebnis:

- Of course the function User_Name() is only used for demo-purposes.
Result:

 

clip_image008

Angriff
Aber Andreas spielt nicht fair. Er ist neugierig, was sonst noch in der Tabelle stehen könnte.
Also schreibt er eine Abfrage wie diese:

Attack
But, Andreas does not play nice. He is curious on what else might be in the table.
So he crafts a query like this:

 

clip_image009

Und das Ergebnis ist:

And the result is:

 

clip_image011

Nicht „schön“, aber wir haben, was wir wollten: die „geschützten“ Daten.
Der bereits geschulte Leser erkennt diese Form des Angriffs vielleicht aus einem anderen Bereich wieder: SQL Injection.
Es ist eine Form des alten Freundes „Error Based Attack“ oder „Error Disclosure“, die auch bei schlecht geschriebenen Webanwendungen zum Zuge kommt. Das habe ich u.a. 2013 auf diversen Konferenzen gezeigt (Vortragsreihe).
Der Kontext ist ein wenig anders, aber die Idee dahinter ist dieselbe.

Not exactly “pretty”, but we got what we want: the “protected” data.

The well-educated reader may remember this kind of attack from a different area as well: SQL Injection.
It’s a form of the old fried “error based attack” or “error-disclosure”, which can also be used for badly written web-applications. I have also shown that amongst others in 2013 at several conferences (series of sessions).
The context is a little bit different, but the idea is the same.

 

1401_Security-Gate-Fail

 

Einigen kommt das Bild vielleicht schon bekannt vor :-)

Some may remember this picture already :-)

Schutzmaßnahmen

Was kann man gegen solche Angriffe tun?
Im Wesentlichen stehen einem 3 bekannte Möglichkeiten zur Verfügung:

1) Einsatz von gespeicherten Prozeduren, die alle Fehler abfangen, oder, wenn man unbedingt mit Sichten Arbeiten möchte, der Einsatz einer dazwischengeschalteten Multi-Statement-Tabellenwertfunktion

2) Datenverschlüsselung (Nicht TDE!)

3) Ähnlich wie 1, Aufbau einer Mittelschicht in der Anwendung, die derartiges unterbindet.

Und schlussendlich sollte man für kritische Daten auch über eine Überwachungslösung nachdenken.

Security-measures

What can prevent such forms of attack?
Essentially there are 3 well-known methods at hand:

1) The use of stored procedures which catch all errors, or, if one really wants to use views for some reason, using of a multi-statement table valued function which will be put between.

2) Data encryption (Not TDE!)

3) Similar to 1, implementation of a mid-tier in the application which prohibits such actions.

Finally one should also think about an Auditing solution for critical data.

Das hier gezeigte Technik der Row-Level Disclosure ist nicht wirklich etwas Neues, wird aber gerne immer mal wieder vergessen.
Nachlesen kann man darüber zum Beispiel auch in diesem (alten) Whitepaper:

The technique of Row-Level Disclosure shown above isn’t really new, but frequently forgotten about.
One can read about this, for example, in this (old) whitepaper:

 

Implementing Row- and Cell-Level Security in Classified Databases Using SQL Server 2005

Happy securing,

Andreas

 

Normal 0 21 false false false DE X-NONE X-NONE

Wer sich ermuntert fühlt, nun einmal richtig in das Thema „Sicherheit mit SQL Server“ einzusteigen, für den habe ich auch 3 erstklassige Trainings im Angebot:

If you now feel encouraged to really dive into the subject of “Security with SQL Server”, I do have 3 first-class Trainings on offer:

Für Beginner, die hier einen guten Überblick erhalten und Grundlegende Kenntnisse erlernen:

For Starters, who gain a good overview and learn essential knowledge in the basics:

(SES) SQL Server Security Essentials for Developers & Administrators (1 day)
3. April 2014 in Düsseldorf

Für Administratoren, die fortgeschrittene Sicherheitskonzepte umsetzen müssen:

For Administrators that have to implement advanced security concepts:

(SIA) Securityworkshop for SQL Server Administrators (advanced) (1 day)
4.
April 2014 in Düsseldorf

Für Entwickler, die fortgeschrittene Sicherheitskonzepte umsetzen müssen:

For Developers that have to implement advanced security concepts:

(SID) Securitysworkshop for SQL Server Developers (advanced) (1 day)
24.
April 2014 in Düsseldorf

 

 

MCSM (Microsoft Certified Solutions Master) Data Platform on SQL Server 2012


Einige meiner engsten Kollegen wissen es bereits, und nun teile ich es öffentlich mit:

Seit 31.12.2013 bin ich nicht mehr „nur“
Microsoft Certified Master SQL Server 2008 (MCM) sondern auch
Microsoft Certified Solutions Master Data Platform (MCSM), der höchsten Zertifizierungsstufe die man für SQL Server 2012 erreichen konnte!

Normal 0 21 false false false DE X-NONE X-NONE

Hier ist der Eintrag auf dem „Master-Blog“:
Introducing our latest MCSM: Data Platform Master - Andreas Wolter

:-)

 

A few of my closest colleagues already know, and now I am announcing it publicly:

Since 31 December 2013 I am no longer “merely”
Microsoft Certified Master SQL Server 2008 (MCM) but also
Microsoft Certified Solutions Master Data Platform (MCSM), the highest certification that was achievable for SQL Server 2012!

 

Here the entry on the „Master-Blog“:
Introducing our latest MCSM: Data Platform Master - Andreas Wolter

:-)

 

clip_image001

Normal 0 21 false false false DE X-NONE X-NONE

MCSM: Data Platform Solutions Master

Der wahrlich krönende Abschluss eines Jahres mit mehr als einem Dutzend Vorträgen auf deutschen und internationalen Konferenzen, die ich aufgrund der Einstellung der „fortgeschrittenen Zertifizierungen“ durch Microsoft schwerlich noch toppen werden kann. Zugleich ist das ein super Einstieg für 2014.

 

Die Entscheidung, auch diese Zertifizierung noch anzustreben, habe ich erst relativ spät getroffen: auf dem deutschen PASS Camp. Die Zeitplanung dafür konnte ich jedoch erst Mitte Dezember angehen.
Und so lief es ab:

Normal 0 21 false false false DE X-NONE X-NONE

MCSM: Data Platform Solutions Master

This makes for a truly crowning conclusion of a year with more than a dozen presentations at German and international conferences, which I will hardly be able to outdo due to Microsoft’s shutting down of the “advanced certifications”. At the same time, it is a great start into 2014.

 

I have made the decision to pursue this certification fairly late – at the German PASS Camp. However, I could only tend to the timing in mid-December.

This is how it went: Normal 0 21 false false false DE X-NONE X-NONE

Am 17.12. habe ich mich für das Knowledge-Examen für den 18.12. angemeldet. Absolviert habe ich es dann innerhalb von knapp zwei Stunden bei einem Zwischenstopp auf dem Weg nach Hamburg zu einem Kunden.

Exam 88-986: MCSM Data Platform Knowledge Exam

Die Ergebnisse erhielt ich prompt.
Daraufhin konnte ich mich am selben Tag noch schnell für die praktische Prüfung, das „Lab Examen“ anmelden.

Am 31.12. war noch ein Slot von 16:00 - 23:30 Uhr frei. Erfreulicherweise konnte dieser dann kurzfristig noch einen Tag vorverlegt werden, so dass ich nicht bis kurz vor Neujahr am Rechner sitzen musste.

Normal 0 21 false false false DE X-NONE X-NONE Da ich an den Feiertagen dann auch noch zweimal quer durch Deutschland fuhr, war eigentlich ohnehin nur wenig Gelegenheit für intensives Lernen.

Am Freitag vorher habe ich noch meine Umfrage zu Datenbankbesitz & Sicherheit gestartet (an der teilzunehmen ich euch alle herzlich einlade) und hatte dann noch ein Wochenende, mich geistig fit zu machen. Das Wissen, dass dies die letzte Gelegenheit sein würde, da Microsoft diese Prüfung am 31.12.13 letztmalig durchführte, hat ordentlich Druck erzeugt: Es würde keine Wiederholungschance geben. Letztlich war auch keine nötig: ich habe bestanden.

On 17 December, I signed up for the Knowledge Exam to be taken on 18 December. I then passed the exam within just under two hours during a stopover on my way to a customer in Hamburg.

I received the results immediately.
Subsequently, I was able to quickly register for the practical exam, the so-called “Lab Exam,” on the same day.

They had a slot available on 31 December, from 4 pm to 11:30 pm. Fortunately, they were able to move it to one day earlier on short notice so that I did not have to end up staying at the PC just shortly before New Year’s.

Normal 0 21 false false false DE X-NONE X-NONE

Since I was also travelling across Germany during the holidays, it actually left only few occasions for intensive study.

 

That previous Friday, I also launched my survey on Database Ownership & Security (to which I am inviting you all cordially to participate) and thus had one weekend to prep myself mentally. Add to this the extra pressure of knowing that this would be the last opportunity, as Microsoft carried out this exam one last time on 31 December 2013: meaning, there would be no chance to retake the exam. Which, ultimately, was not necessary: I passed the exam.

Exam 88-987: MCSM Data Platform Lab Exam

Zum Lab-Examen selber: Im Gegensatz zu den 5:25 Stunden für das „Exam 88-971: SQL Server 2008 Microsoft Certified Master: Lab Exam waren für das MCSM-Lab 7 Stunden angesetzt. Entsprechend gab es auch mehr Aufgaben. Genauer darf ich darauf nicht eingehen.

Als vermutlich letzter Prüfling darf ich aber sagen: Es hat Spaß gemacht! Und alle Mühen für den MCM und MCSM waren es Wert.

Exam 88-987: MCSM Data Platform Lab Exam

About the Lab Exam: Contrary to the 5:25 hours allotted for the „Exam 88-971: SQL Server 2008 Microsoft Certified Master: Lab Exam, it was 7 hours for the MCSM-Lab. Correspondingly, it consisted of more tasks as well. Evidently, I cannot go into detail.

However, presumably being the last examinee, I may say: It was fun! And all the efforts for the MCM and MCSM were worth it. Normal 0 21 false false false DE X-NONE X-NONE

Noch ein paar Statistiken zum Ende des „Rennens“:

Weltweit gibt es (Stand 2.1.2014): Normal 0 21 false false false DE X-NONE X-NONE

Some statistics at the end of the “race”:

Worldwide, there are (as of 2 January 2014): Normal 0 21 false false false DE X-NONE X-NONE

MCM SQL Server 2005

MCA SQL Server 2005

MCM SQL Server 2008

MCA SQL Server 2008

MCSM Data Platform

33

23

154

7

6

 

Quelle // Source: Microsoft Certified Masters and Architects: Microsoft SQL Server
 

- Ich nehme an, dass noch zwei bis drei Master dazukommen, wenn die letzten erfolgreichen Kandidaten veröffentlich werden. Ich werde diese Liste also in ein paar Tagen noch einmal updaten.

 

- I suppose two or three more Masters will join the ranks once the last successful candidates are made public. So I am going to update this list in a few days.

Dieser Liste nach haben also nur sechs Experten diese Zertifizierung auf dem SQL Server 2012 abgeschlossen. Die meisten „Neuen“ haben sich also weiter auf SQL Server 2008 prüfen lassen.

Normal 0 21 false false false DE X-NONE X-NONE

Davon kommen zwei aus dem europäischen Raum (beide aus Finnland), womit ich im gesamten deutschsprachigen Raum der zugleich erste und letzte mit diesem Abschluss bin.
Interessanterweise haben sich weltweit nur zwei Leute überhaupt sowohl unter SQL Server 2008 als auch SQL Server 2012 erfolgreich prüfen lassen. Vesa Tikkanen (Twitter: @vesat | Blog) aus Finnland ist der geschätzte MCM&MCSM Kollege!

 

Damit habe ich die Antwort auf meinen Artikel vom September „Wer wird der letzte MCM SQL Server ;-) ?“ wohl selbst gegeben… ;-)

Normal 0 21 false false false DE X-NONE X-NONE Schade, dass es so wenige versucht und/oder geschafft haben. Denn seien wir ehrlich: Der MCM/MCSM ist keine „Guru-only-Zertifizierung“, sondern er bestätigt praktische Erfahrung. Wenn man über diese auch in der Breite, von Sicherheit über Performance-Tuning, Datenbankdesign bis hin zu Hochverfügbarkeit und Datenwiederherstellung verfügt, dann kann man ihn in einem oder zwei Zügen, um sich an das Prüfungsformat zu gewöhnen, bestehen. – „Konnte“ muss man nun sagen. In jedem Fall meine Hochachtung an alle, die sich den Prüfungen gestellt haben.

According to this list, there are only six experts to have passed this certification on the SQL Server 2012. Most of the “new ones” thus have undergone the exam on SQL Server 2008.

Normal 0 21 false false false DE X-NONE X-NONE Of the former, two are from the European region (both of whom from Finland), which means I am the first and last to be carrying this title in the entire German-speaking region.
Interesting to note: only two people worldwide have successfully undergone the exam based on both SQL Server 2008 and SQL Server 2012. Vesa Tikkanen
(Twitter: @vesat | Blog) from Finland is the much valued MCM&MCSM colleague!

As it turns out, I have provided the answer to my article from September, “Who will be the last MCM SQL Server ;-)?” myself… ;-)

It’s too bad that only so few have tried and/or made it. Because, let’s be honest: The MCM/MCSM isn’t a “guru-only-certification,” but rather it verifies practical experience. If one has it also in its broadness, from security to performance tuning, database design to high availability and data recovery, one can, or rather could have, pass(ed) the certification in one shot, or two, to familiarize oneself with the exam format. In any case, kudos to those who endeavored the exams.

Update (3.1.):
Aufgrund der häufiger gestellten und berechtigten Frage „Warum“, möchte ich darauf hier noch kurz eingehen:

Warum habe ich mir also diese Prüfung noch „angetan“, obwohl die Zertifizierung ab dem 1.1.2014 nicht mehr erhältlich ist?
Man merkt vielleicht schon an der mit Bedacht gewählten Formulierung, dass es ja nicht so ist, dass die Zertifizierung mit einem Male „Nicht mehr existiert“. Es ist lediglich so, dass sie ab jetzt niemand mehr neu machen kann.
Demnach sah ich zumindest darin erstmal keinen Grund, sie nicht abzulegen. Nur der Zeitdruck ist größer – und Druck liegt mir praktischerweise :-)

Sodann gibt es einen ganz rationalen Grund:
Der MCM basiert auf SQL Server 2008, und dieser ist mit dem Erscheinen von SQL Server 2014 nur noch die „Vor-Vor-Version“.
Und auch wenn der MCM ganz allgemein „praktische Fähigkeiten“ belegen soll, ist die Verbindung mit einer bestimmten Version ja nicht ganz abwegig.
Der MCSM basiert auf SQL Server 2012 und dieser enthält von Extended Events über ColumnStore Indexes bis hin zu AlwaysOn einige wesentliche Neuerungen – die im SQL Server 2014 weiter verbessert werden.

Und schon immer lege ich Wert darauf, meinen Kunden einen „zertifizierten“ Beleg bieten zu können, auf den aktuellsten Technologien absolut und umfassend fit zu sein.

Im Prinzip also kein wesentlicher Unterschied dazu, warum ich 2012 den MCM abgelegt habe.

Und zuguterletzt gibt es noch einen persönlichen Grund:
Ich hätte einfach keine
Ruhe gehabt, nicht zu wissen, ob ich das MCSM Lab unter SQL Server 2012 aus dem Stegreif bestehen würde und wie diese Prüfung ist :-)
Neugierde hat schon immer vieles bewegt…
Das war am Ende der endgültige Grund, die Lab auch unter hohem Zeitdruck noch am vor/letzten  Tag abzulegen.
Man kann mich natürlich auch einfach „verrückt“ nennen ;-)

 

Update (3 January):
Because of the frequent and legitimate question as to “why,” I will shortly go into the matter:

Why have I even bothered to take this exam when the certification is no longer available as of 1 January 2014?
One may already notice through the careful phrasing that it is in fact not the case that the certification does “no longer exist” all of a sudden. It is simply no longer possible for anyone to take the exam from now on. That is why, for once, I did not see any reason why not to take it. The only difference is that the time pressure was greater – and I’m all for it :-)

Then, there is a plainly rational reason:
The MCM is based on SQL Server 2008, and will be, with the release of SQL Server 2014, only the “pre-pre-version.” And even if the MCM is meant to generally prove “practical skills,” the connection to a specific version is not that beside the point.
By contrast, the MCSM is based on SQL Server 2012, which contains some significant improvements, from Extended Events to
ColumnStore Indexes up to AlwaysOn – all of which will be further improved in SQL Server 2014.

Also, I have always been attaching great importance to offering my customers a “certified” proof, and to being absolutely and comprehensively versed in the latest technologies.

Basically, it is hardly any different as to why I have done the MCM in 2012.

And last but not least, there is a personal reason as well:
I just couldn’t have borne not to know whether I would pass the MCSM Lab based on SQL Server 2012 off the cuff, and what this exam is made of :-)
More often than not, curiosity has been the trigger to many things...
Ultimately, this was the final reason for taking the Lab even under the utmost pressure at the last day (turned day before last).

Or one could just call me plain “crazy” ;-)

Für alle, die jetzt knapp gescheitert sind, oder es generell erst für später anvisiert hatten:
Lasst Euch nicht demotivieren durch die Einstellung dieser höchsten technischen Zertifizierung.

Letztlich sollte man vor allem einfach des Wissens wegen Lernen. Ob zertifiziert oder nicht: die Erweiterung der eigenen Kenntnisse und  praktische Erfahrung ist immer eine gute Sache.

Zertifizierungen bieten vor allem Vergleichbarkeit und Standardisierung. Insofern ist der Wegfall vor allem für die Leute „auf der anderen Seite des Verhandlungstisches“ bedauerlich.

In diesem Sinne

To those of you who just narrowly failed the exam or had planned on taking it at a later time:  Don’t be demotivated by the discontinuation of this highest technical certification.

At the end of the day, one should study, above, all, for the sake of knowledge. Whether certified or not: expanding one’s knowledge and skills is always worthwhile.

First and foremost, certifications offer comparability and standardization. Consequently, the discontinuation is regrettable in the first place on behalf of the people “on the other side of the negotiation table.”

In this spirit,

Normal 0 21 false false false DE X-NONE X-NONE

Happy studies,

Andreas

 

MCM SQL Server, MCSM Data Platform

clip_image003 clip_image005

Normal 0 21 false false false DE X-NONE X-NONE

 

 

Danksagung:

Ich möchte folgenden Personen Dank sagen, die dieses Examen mit möglich gemacht haben:
Cindy McCormack, die mein Lab-Examen und die Vorverlegung noch so spontan eingeplant, Ralph Beatty, der von 5 Uhr morgens an von Redmond aus mein Examen live überwacht hat,
Bob Taylor (Twitter: @SQLboBT | Blog) dafür, dass er mein Examen fast direkt im Anschluss benotet und mir damit am 31.12. noch mein Bestehen mitgeteilt hat – sowie für seinen Einsatz für die MCM Community generell, und auch nach Ablauf seines Amtes(!) als MCM-Programm-Manager.
Schließlich danke ich auch Ralf Dietrich, der mich auf dem PASS Camp in dem Gedanken bestärkt hat, die Zertifizierung noch abzulegen.
Normal 0 21 false false false DE X-NONE X-NONE

 

Acknowledgements:

I would like to express my gratitude to the following people who have made this exam possible: Cindy McCormack, who planned my Lab Exam and its last-minute bringing forward; Ralph Beatty, who proctored my exam from Redmond as early as from 5 am; Bob Taylor (Twitter: @SQLboBT | Blog) for grading my exam almost immediately afterwards and informing me on December 311th that I passed – plus for all the work for the MCM Community in general and even after expiration of his function(!) as MCM-Program Manager.
Finally, I am also giving my thanks to Ralf Dietrich who at the PASS Camp encouraged me with my idea of still doing the certification.
Normal 0 21 false false false DE X-NONE X-NONE Normal 0 21 false false false DE X-NONE X-NONE

 

 

Security-Check-Script & Survey: SQL Server Security - Database-Owners, critical Permissions and role membership / Sicherheitsprüfungs-Script & Umfrage: SQL Server Datenbankbesitzer, kritische Rechte und Rollenmitgliedschaft

Normal 0 21 false false false DE X-NONE X-NONE In dieser Umfrage möchte ich einmal in einem größeren Kreis ermitteln, welche Accounts typischerweise als Datenbankbesitzer eingetragen werden. Die kumulierten Ergebnisse werde ich anschließend hier veröffentlichen um sie mit der Community zu teilen, zusammen mit einigen Empfehlungen hinsichtlich Sicherheits-Härtung.

Dabei interessieren vor allem bestimmte serverweite Berechtigungen nicht nur des verwendeten Logins selber, sondern auch, falls er Mitglied einer (custom) Server Role ist, bestimmte, kritische Rechte dieser Rolle.

Wer meine Vorträge zum Thema „Sicherheit in SQL Server“ in den letzten Jahren, und insbesondere der im Sommer 2013 gestarteten Reihe „SQL Server Attacked“ verfolgt hat, wird sich vielleicht hat erinnern, wie ich dort auch gezeigt habe, wie man aus einer Datenbank ausbrechen und volle Systemrechte erlangen kann („Privilegien Erweiterung“) – basierend auf einer Kombination von Datenbankbesitzer, -Konfiguration und Impersonierung.

Hier stelle ich nun einen T-SQL Script zur Verfügung, welcher

  • Den jeweiligen Datenbankbesitzer aller Datenbanken ermittelt
  • Ungültige/Fehlende Datenbankbesitzer erkennt
  • Anzeigt, ob der Besitzer direkt über sicherheitskritische systemweite Rechte verfügt
  • Mitgliedschaft in hochprivilegierten Server-Rollen anzeigt – inklusive der benutzerdefinierten Serverrollen (ab SQL 2012 möglich)
  • Die kritischen Datenbankeinstellungen „Vertrauenswürdig“ und „Datenbankverkettung“ anzeigt.

Und hier ist der Script:

Normal 0 21 false false false DE X-NONE X-NONE

Normal 0 21 false false false DE X-NONE X-NONE

In this survey, I would like to explore in a greater radius which accounts are typically used as database owners. I will subsequently publish the cumulated results here to share them with the community together with some recommendations for hardening security.

 

In this instance, particular server-wide permissions both of the used account as well as, in case of membership of a (custom) Server Role, critical permissions of that role, are of interest.

Those who have followed my presentations on the topic “Security in SQL Server” in the last years, and especially the „SQL Server Attacked“ series launched in the summer of 2013, may remember how I had also demonstrated there how to break out of a database and be granted full system rights (“Elevation of privileges”), - based on a combination of database owner, configuration and impersonation.

Here, I am providing a T-SQL Script which

  • Identifies the respective database owners of all databases
  • Detects invalid/missing database owners
  • Indicates whether the owner directly possesses security-critical system-wide rights
  • Indicates membership in high privilege Server Roles – including the user defined Server Roles (possible since SQL 2012)
  • Indicates the critical database configurations “trustworthy” and “database chaining”.
Here you can find the script: Normal 0 21 false false false DE X-NONE X-NONE

 

 

Server 1: http://j.mp/13_SQL_DBO_Survey
Server 2:
gallery.technet.microsoft.com/scriptcenter/Database-Owners-role-3af181f5/

 

Normal 0 21 false false false DE X-NONE X-NONE

- Er sollte auf allen SQL Servern ab der Version 2005 funktionieren (getestet 2008-2014).

Zum Zwecke der Umfrage bitte ich Euch, die anonymisierten Ergebnisse (am Besten in Excel-Format) an die Email survey@SarpedonQualityLab.com zu senden, oder auch hier in den Kommentaren zu posten.


Zum Zwecke der Anonymisierung kann man einfach die letzten 3 Spalten aus dem Resultset auslassen – diese haben für eine statistische Erhebung auch keinen Nutzen sondern sind nur für Eure internen Zwecke bestimmt :-).

Hier seht ihr ein Beispiel-Ergebnis:

-           It should be working on all SQL Servers since the 2005 version (tested: 2008-2014).

For the purpose of the survey, I would like to ask you to send the anonymized results (preferably in excel-format) to the email survey@SarpedonQualityLab.com, or as well post them here in the comments.

For anonymization purposes, you can simply leave out the last three columns from the result set – these are not of use to a data collection and only meant for your internal usage :-).

Here, you can see a sample result:

 

image

 -> click to enlarge

Mehrere Einträge für dieselbe Datenbank entstehen, wenn der Datenbankbesitzer – oder seine Serverrolle(!) über mehrere, der von mir als sicherheitskritisch klassifizierten Rechte verfügt. Diese stehen dann in der Spalte login_permission bzw. role_permission. Hinter den Kürzeln verbergen sich:
ALLG = ALTER ANY LOGIN
ALSR = ALTER ANY SERVER ROLE
CL  = CONTROL SERVER
XA  = EXTERNAL ACCESS ASSEMBLY
(mehr dazu auch hier: CONTROL SERVER vs. sysadmin/sa: permissions, system procedures, DBCC, automatic schema creation and privilege escalation - caveats).

Die Inhalte der Spalten DatabaseNo, database_owner und external_owner sind absichtlich allgemein gehalten – die exakten Namen sind wie gesagt in den letzten 3 Spalten zu finden.

Die Spalte db_owner_valid zeigt an, ob die Datenbank einen gültigen Besitzer hat. In diesem Fall besteht ein match zwischen dem „externen Besitzer“ und dem in der Datenbank selber hinterlegten. In der Spalte external_owner steht nur ob dieser „externe Besitzer“ sa ist oder nicht – der genaue Login steht dann in *External_Owner.Der Script speichert keine Daten dauerhaft im System ab und beseitigt seine temporären Zwischenergebnisse selbst.

Der Script speichert keine Daten dauerhaft im System ab und beseitigt seine temporären Zwischenergebnisse selbst.

Normal 0 21 false false false DE X-NONE X-NONE

Normal 0 21 false false false DE X-NONE X-NONE

Ich hoffe, ihr findet die Auswertung hilfreich – und ich hoffe, ihr könnt die (anonymisierten) Ergebnisse mit der Community teilen. Ich werde keine Email speichern oder verwenden, sondern nur die anonymisierten Abfrageergebnisse.

Ich bedanke mich für eure Teilnahme und Unterstützung der Community!
Ich verspreche, die Ergebnisse in den nächsten Monaten zusammen mit entsprechenden Hinweisen auf Best & Bad Practices zu veröffentlichen.

 

Multiple entries for the same database occur when the database owner – or his serverrole(!) possess multiple of the permissions which I classified as security-wise critical. These are listed in the column login_permission respectively role_permission. The codes stand for:
ALLG = ALTER ANY LOGIN
ALSR = ALTER ANY SERVER ROLE
CL  = CONTROL SERVER
XA  = EXTERNAL ACCESS ASSEMBLY
(you can read more on that here: CONTROL SERVER vs. sysadmin/sa: permissions, system procedures, DBCC, automatic schema creation and privilege escalation - caveats).

The contents of the columns DatabaseNo, database_owner and external_owner are left general on purpose – the exact names can be found in the last 3 columns s mentioned above.

The column db_owner_valid indicates, whether the database has a valid owner. In this case there is a match between the „external owner“ and the one stored within the database itself. The column external_owner only shows whether that „external owner“ is sa or not –the exact Login is shown in *External_Owner.

The script does not permanently save any data in the system and removes its temporary intermediary results by itself.

Normal 0 21 false false false DE X-NONE X-NONE

Normal 0 21 false false false DE X-NONE X-NONE

I hope you find the report useful and I hope you can share the (anonymized) results with the community.
I will not store or use any email but only use the anonymized Query-results.

 

Thank you in advance for your participation and support of the community!
I promise to publish the results with according details on best & bad practices in the next months.

 


Andreas

Die Agenda der SQL Server Konferenz 2014 ist online!

Vom 10.-12. Februar 2014 findet in Darmstadt die erste Deutsche SQL Server Konferenz statt. Zeitgleich feiert die PASS Deutschland e.V. ihr 10-jähriges Bestehen. Also Geburtstag :-)

clip_image002

Seit heute steht auch die Agenda fest.
Es gibt 4 Tracks:

· Administration (DBA)

· Business Intelligence (BI)

· Entwicklung (DEV)

· Big Data & Information Management (BD)

Ich darf im Admin-Track gleich in der ersten Session In-Memory OLTP mit SQL Server 2014 XTP (Project Hekaton, jetzt "EXtreme Transactional Processing") vorstellen.

- Nachdem ich mich bereits intensiv mit Columnstore Indexes beschäftigt habe, ist das die zweite wichtige und komplett neue Technologie, in die ich mich rechtzeitig zur ersten Präsentation von Hekaton/XTP im November 2013 auf Microsoft’s TechNet Conf eingearbeitet habe. „Mission accomplished“. :-)
An dieser Stelle ein Dankeschön an die Veranstalter für das in mich gesetzte Vertrauen.

Danach geht es gleich weiter mit neuem heißen Content: mein geschätzter Kollegen Niko Neugebauer, hält einen Deep Dive in die neuen Rewritable Columnstore Indexes. Eine In-Memory Analytics Engine & Memory-Optimized Columnstore Index, die die Architektur von künftigen DataWarehouses verändert wird, wie ich schon diesen Sommer „prophezeite“. (The Columnstore Indexes & Batch Mode Processing (R)Evolution in SQL Server 2014)

Am 2. Tag der Hauptkonferenz geht es im Administrationstrack um den Bereich SQL Azure, Virtualisierung und Hochverfügbarkeitsarchitekturen mit AlwaysOn. Hierzu werden sogar Sprecher vom SQL CAT Team präsentieren.

Und auch die Tracks Business Intelligence, Entwicklung und Information Management bieten hochkarätige Themen und international erfahrene Sprecher.
Herausheben möchte ich an dieser Stelle das Gespann der Kollegen Georg Urban & Olivia Klose von Microsoft zu Big Data mit HDInsight oder Tillmann Eitelberg zu SSIS und HDInsight.

Artus Krohn-Grimberghe & Martin Vach stellen mit Predictive Analytics mit SQL Server & Project Passau ein DataMining Projekt vor
Diese und viele andere tolle Vorträge, die vollständige Agenda findet sich hier: www.sqlkonferenz.de/Agenda.aspx

Wem die jeweils einstündigen Vorträge nicht genügen, sondern gleich richtig in ein Thema einsteigen möchte, dem empfehle ich eine der 3 PreCons, die am 10.2. stattfinden. – PreCons sind ganztägige Veranstaltungen, die sich intensiv einem bestimmten Themenkomplex widmen.
Und das ist die Auswahl:

Power Workshop 1: Azure Platform Immersion Day: Building Highly Available and Scalable Solutions in a Hybrid World
Trainer: tbd

Power Workshop 2: In-Memory Technologies im SQL Server 2014 – Die Performance Booster
Trainer: Niko Neugebauer & Andreas Wolter

-           In diesem “gemischten Doppel” zeigen wir die neuen Storage Engines im SQL Server 2014: ColumnStore Indexes und In-Memory OLTP

Power Workshop 3: Microsoft Self-Service BI Landschaften – Professionell implementiert
Trainer: Kay Unkroth


Die vollständige Agenda findet sich hier: www.sqlkonferenz.de/Agenda.aspx

 

Ich hoffe man sieht sich in im Februar in Darmstadt

 

Andreas

Where are the scripts to the session „SQL Attacked/Hacking SQL Server“ ? ;-)

Wo sind die Scripte zu dem Vortrag „SQL Attacked/Hacking SQL Server“ ? ;-)

Im Anschluss an die Vorträge aus meiner „Hacking SQL Server“-Reihe „SQL Server Sicherheit „SQL Attack..ed“ – Angriffszenarien auf SQL Server („SQL Server Hacken“)“, die ich bisher bereits auf den SQLSaturdays Rheinland, Istanbul, auf der SQLRally Amsterdam und in vielen Regionalgruppen der PASS Deutschland zeigte, kommt öfters die Frage auf, ob ich den gezeigten Code öffentlich verfügbar mache. Da Twitter sich als Diskussionsmedium nicht so eignet (schöne Grüße an @DirkHondong und @FrankGeisler ;-) ), das Thema aber doch etwas mehr Beachtung verdient, möchte ich darauf in einigen Sätzen eingehen.

Subsequent to the lectures from my “Hacking SQL Server” series “Security Session „SQL Attack..ed“ – Attack scenarios on SQL Server ("Hacking SQL Server")” which I have already given at the SQLSaturdays Rheinland, Istanbul, at the SQLRAlly Amsterdam and at many regional groups of PASS Germany, more often than not the question arises whether I make the presented code available to the public. With Twitter not being that suitable a medium of discussion (greetings to @DirkHondong and @FrankGeisler ;-)), yet the topic deserving some more attention, I will get into the matter in the following.

Der Hintergrund, das ich die dafür entwickelten Scripts nicht veröffentliche, ist eigentlich recht einfach: ich zeige darin unter anderem Angriffsvarianten und Techniken, die so noch nicht dokumentiert oder in der „Szene“ bekannt sind(?).

Und da ich die frei verfügbaren SQL-Injection- und allgemein „Hacking“/DoS -Tools ein wenig kenne, möchte ich vermeiden, denjenigen, die diese entwickeln, neue Ideen zu geben um Server in die Knie zu zwingen. Das bringt keinem (aus der SQL Server Community) etwas (- höchstens "Auftragshackern", aber "leider" habe ich da keine Aktien drinnen ;-) ).

- Die meisten SQL-Injection-Varianten sind übrigens auch wirklich gut im Netz dokumentiert, und eine einfache Suche wird eine Vielfalt an Code-Beispielen zutage bringen. Es macht kaum einen Unterschied, welche Vorlage man verwendet, man muss so und so noch Anpassungen vornehmen. ;-)

Im Gegensatz zu landläufiger Meinung, glaube ich nicht daran, dass jeder alle „Hacking“-Techniken selber durchführen können muss. Ich denke das ist häufig ein Vorwand, sicherheitsbedenkliche Aktionen pauschal zu rechtfertigen.

Ich bin der Ansicht, dass es genügt, zu wissen/gesehen zu haben, wo man angreifbar sein kann, und das es wichtiger ist, die Zeit darauf zu verwenden, die Skills für die Sicherung zu entwickeln.

Um selber zu „Hacken“, ist das übrigens eine gute Voraussetzung (und der Unterschied zum sogenannten „Script-Kiddie“). Nur das man dann einfach noch mehr Kenntnisse benötigt.

In aller Regel sehe ich jedoch eher einen Mangel an Kenntnissen über die Zusammenhänge in der Sicherheitsarchitektur von SQL Server, auf den ich mich naturgemäß fokussiere, sowie natürlich dem darunterliegenden Windows-Server und der Domain-Architektur allgemein.
„Hacken“ zu können bringt für sich gesehen erst einmal gar nichts. Das kann man, wenn man alles bekannte abgesichert hat immer noch angehen. Wenn das nötig ist, befindet man sich in dem grauen Bereich von „Penetration Testing“.

The background to why I don’t make public the scripts developed for this purpose is actually quite simple: in the scripts, I am showing attack variants and techniques, among others, which have not been documented or are not known within the “scene” (?).

And since I am a little familiar with the discretionary SQL injection and “Hacking”/DoS tools in general I would like to avoid giving those parties developing these tools new ideas for bringing servers down. This wouldn’t be of use to anyone (from the SQL Server community) (- except maybe to “contract hackers,” but I’m “afraid” I don’t hold any stocks in there ;-)).

- By the way, most of the SQL injection variants are very well documented in the internet, and a simple search will spill out a variety of code examples. It will hardly make a difference which template one is using, as one will need to make adaptions anyway. ;-)

In contrast to general opinion, I do not believe that everyone needs to be able to carry out all “hacking” techniques by themselves. I think this is often used as a blanket pretext for justifying security-wise questionable actions.

I am of the opinion that it is sufficient to know/have seen where one can be vulnerable, and that it is more important to invest the time into developing skills for protection.

And this is a good prerequisite for “hacking” oneself (and the difference to the so-called “script kiddie”). Only that even more knowledge will be required then.

In principle, however, I am rather observing a lack of knowledge of the correlations in the security architecture of SQL Server on which I am by nature focusing, as well as, of course, the Windows Server beneath it and the domain architecture in general.

To be able to “hack” alone is of no avail. Once one has covered everything known, one can still get to that. If this is necessary, one will end up in the grey area of “penetration testing.”

Das eigentliche Ziel meiner Vorträge/“Shows“(?) ist die "Awareness/Wahrnehmung", und Verbesserung der Sensibilität für das Thema Sicherheit im Sinne von:
„Habe ich das alles schon einmal bedacht?“

„Könnte ich doch noch Lücken haben und ein leichtes Angriffsziel sein, ohne es bislang gemerkt zu haben?“

Nicht:
"Um meine SQL Server Umgebung sicherer zu machen, möchte ich mich selber im „Hacken“ versuchen."

Ich hoffe das macht Sinn für Euch :-)

In jedem Fall ist eine offene Diskussion zu diesem Thema durchaus in meinem Sinne.

The actual goal of my lectures/ “shows” (?) is the “awareness/perception,” and the enhancement of sensitivity for the topic of security in the sense of:

“Have I taken all this into consideration?”

“Could I still have gaps and be an easy target without having noticed up to now?”

Not:

“In order to make my SQL Server environment more secure I would like to dabble in ‘hacking.’”

I hope this makes sense to you J

Either way, an open discussion on this topic is absolutely along my lines.

Happy securing

Andreas

 

PS: Aus diesem Grunde biete ich ja schon seit einigen Jahren immer wieder den Security Essential für die PASS Deutschland an – aber wie wir wissen, zieht das Thema „Sichern“ einfach weniger als „Hacken“ ;-)

Und für diejenigen, die die Grundlagen schon beherrschen, aber komplexere Anforderungen oder kritischere Umgebungen haben, kommen dann die Master-Classes zum Thema Sicherheit: www.sarpedonqualitylab.com/SQL_Master-Classes.htm

PS: For those who already know the basics, but have more complex requirements or critical environments, there are the Master-Classes on Security: en.sarpedonqualitylab.com/SQL_Master-Classes.htm

 

Mapping Extended Events with sys.trace_xe_event_map to SQL Trace

Hier die Liste aller Extended Events in SQL Server 2012 SP1 samt Ihrem Gegenstück in SQL Trace, die man auch für Migrationszwecke (SQLTrace -> XEvent Trace) verwenden kann.

Dafür wird die DMV sys.trace_xe_event_map da. Durch den OUTER JOIN zeigt das Ergebnis schön die Überzahl der Extended Events gegenüber der vergleichsweise geradezu geringen Anzahl an SQL Trace Events:

Here a list of all Extended Events in SQL Server 2012 SP1 including their counterpart in SQL Trace, which can also be used for migration purposes (SQLTrace -> XEvent Trace).

That’s what the DMV sys.trace_xe_event_map is for. By the use of the OUTER JOIN the result shows well the superior number of Extended Events against the really few SQL Trace Events comparatively.

-- Query to match XEvents to SQL Trace Events (if available)

SELECT

 

        dm_xe_objects.name  AS Extended_Event_name

    ,   trace_events.name   AS Trace_Event_name

  

FROM sys.trace_events                   AS trace_events

 

RIGHT OUTER JOIN sys.trace_xe_event_map AS trace_xe_event_map

    ON trace_events.trace_event_id = trace_xe_event_map.trace_event_id

 

RIGHT OUTER JOIN sys.dm_xe_objects      AS dm_xe_objects

    ON trace_xe_event_map.xe_event_name COLLATE Latin1_General_CI_AS = dm_xe_objects.name

 

WHERE

    (

        dm_xe_objects.object_type = 'event'

    OR

        dm_xe_objects.object_type IS NULL

    )

    AND

    (

        dm_xe_objects.capabilities IS NULL

    OR 

        dm_xe_objects.capabilities & 1 = 0

    )

       

ORDER BY dm_xe_objects.NAME

 

Result:
(If you change the LEFT to an FULL OUTER Join, you will see, that there are ~130 SQLTrace Events, that do not match to an XEvent(!) – Those are the Audit Events, which can only be used with the Auditing-Feature of SQL Server)

Extended_Event_name

Trace_Event_name

NULL

Audit Login Failed

NULL

Audit Database Scope GDR Event

NULL

Audit Schema Object GDR Event

NULL

Audit Addlogin Event

NULL

Audit Login GDR Event

NULL

Audit Login Change Property Event

NULL

Mount Tape

NULL

Audit Fulltext

NULL

Audit Server Operation Event

NULL

Audit Server Alter Trace Event

NULL

Audit Server Object Management Event

NULL

Audit Server Principal Management Event

NULL

Audit Database Operation Event

NULL

Audit Database Object Access Event

NULL

Audit Database Mirroring Login

NULL

Audit Broker Conversation

NULL

Audit Broker Login

NULL

Audit Server Scope GDR Event

NULL

Audit Server Object GDR Event

NULL

Audit Database Object GDR Event

NULL

Audit Database Principal Impersonation Event

NULL

Audit Server Object Take Ownership Event

NULL

Audit Database Object Take Ownership Event

NULL

Trace File Close

NULL

Audit Change Database Owner

NULL

Audit Schema Object Take Ownership Event

NULL

SQL:FullTextQuery

NULL

Audit Database Management Event

NULL

Audit Database Object Management Event

NULL

Audit Database Principal Management Event

NULL

Audit Schema Object Management Event

NULL

Audit Server Principal Impersonation Event

NULL

Audit Statement Permission Event

NULL

Audit Schema Object Access Event

NULL

Audit Backup/Restore Event

NULL

Audit DBCC Event

NULL

Audit Change Audit Event

NULL

Audit Object Derived Permission Event

NULL

Audit Login Change Password Event

NULL

Audit Add Login to Server Role Event

NULL

Audit Add DB User Event

NULL

Audit Add Member to DB Role Event

NULL

Audit Add Role Event

NULL

Audit App Role Change Password Event

additional_memory_grant

NULL

after_snipping_some_log

NULL

allocation_failure

NULL

allocation_ring_buffer_recorded

NULL

alter_table_update_data

NULL

alwayson_ddl_executed

NULL

app_domain_ring_buffer_recorded

NULL

assembly_load

Assembly Load

assert_fired

NULL

async_io_completed

NULL

async_io_requested

NULL

attention

Attention

auto_stats

Auto Stats

availability_group_lease_expired

NULL

availability_replica_automatic_failover_validation

NULL

availability_replica_manager_state_change

NULL

availability_replica_state_change

NULL

background_job_error

Background Job Error

bad_memory_detected

NULL

bad_memory_fixed

NULL

batch_hash_join_separate_hash_column

NULL

batch_hash_table_build_bailout

NULL

begin_tran_completed

TM: Begin Tran completed

begin_tran_starting

TM: Begin Tran starting

bitmap_disabled_warning

Bitmap Warning

blocked_process_report

Blocked process report

broker_activation

Broker:Activation

broker_activation_stored_procedure_invoked

NULL

broker_activation_task_aborted

NULL

broker_activation_task_limit_reached

NULL

broker_activation_task_started

NULL

broker_conversation

Broker:Conversation

broker_conversation_group

Broker:Conversation Group

broker_corrupted_message

Broker:Corrupted Message

broker_dialog_transmission_body_dequeue

NULL

broker_dialog_transmission_body_enqueue

NULL

broker_dialog_transmission_queue_dequeue

NULL

broker_dialog_transmission_queue_enqueue

NULL

broker_forwarded_message_dropped

Broker:Forwarded Message Dropped

broker_forwarded_message_sent

Broker:Forwarded Message Sent

broker_message_classify

Broker:Message Classify

broker_message_undeliverable

Broker:Message Undeliverable

broker_mirrored_route_state_changed

Broker:Mirrored Route State Changed

broker_queue_activation_alert

NULL

broker_queue_disabled

Broker:Queue Disabled

broker_remote_message_acknowledgement

Broker:Remote Message Acknowledgement

broker_transmission_acksm_action_fire

NULL

broker_transmission_acksm_event_begin

NULL

broker_transmission_acksm_event_end

NULL

broker_transmission_deliverysm_action_fire

NULL

broker_transmission_deliverysm_event_begin

NULL

broker_transmission_deliverysm_event_end

NULL

broker_transmission_exception

Broker:Transmission

broker_transmission_lazyflusher_processing_begin

NULL

broker_transmission_lazyflusher_processing_end

NULL

broker_transmission_lazyflusher_remove

NULL

broker_transmission_lazyflusher_submit

NULL

broker_transmission_object_delete_begin

NULL

broker_transmission_object_delete_end

NULL

broker_transmission_object_get

NULL

broker_transmission_object_worktable_load_begin

NULL

broker_transmission_object_worktable_load_end

NULL

broker_transmission_object_worktable_save_begin

NULL

broker_transmission_object_worktable_save_end

NULL

broker_transmission_timer_armed

NULL

broker_transmission_timer_fire

NULL

broker_transmission_timer_reset

NULL

broker_transmission_timer_set

NULL

buffer_manager_database_pages

NULL

buffer_manager_page_life_expectancy

NULL

buffer_manager_target_pages

NULL

buffer_node_database_pages

NULL

buffer_node_page_life_expectancy

NULL

buffer_pool_page_allocated

NULL

buffer_pool_page_freed

NULL

catalog_metadata_cache_entry_added

NULL

catalog_metadata_cache_entry_pinned

NULL

catalog_metadata_cache_entry_removed

NULL

catalog_metadata_cache_entry_unpinned

NULL

catalog_metadata_cache_hit

NULL

cdc_error

NULL

cdc_session

NULL

change_tracking_cleanup

NULL

checkpoint_begin

NULL

checkpoint_end

NULL

clr_allocation_failure

NULL

clr_init_failure

NULL

clr_virtual_alloc_failure

NULL

column_store_object_pool_hit

NULL

column_store_object_pool_miss

NULL

column_store_rowgroup_read_issued

NULL

column_store_rowgroup_readahead_issued

NULL

column_store_segment_eliminate

NULL

commit_tran_completed

TM: Commit Tran completed

commit_tran_starting

TM: Commit Tran starting

connectivity_ring_buffer_recorded

NULL

constant_page_corruption_detected

NULL

cpu_config_changed

NULL

cpu_threshold_exceeded

CPU threshold exceeded

crt_out_of_memory_routine_executed

NULL

crt_signal_abort_called

NULL

cursor_close

CursorClose

cursor_execute

CursorExecute

cursor_implicit_conversion

CursorImplicitConversion

cursor_manager_cached_cursor_added

NULL

cursor_manager_cached_cursor_removed

NULL

cursor_manager_cursor_begin

NULL

cursor_manager_cursor_cache_attempt

NULL

cursor_manager_cursor_cache_hit

NULL

cursor_manager_cursor_end

NULL

cursor_manager_cursor_memory_usage

NULL

cursor_manager_cursor_plan_begin

NULL

cursor_manager_cursor_plan_end

NULL

cursor_manager_cursor_worktable_use_begin

NULL

cursor_manager_cursor_worktable_use_end

NULL

cursor_open

CursorOpen

cursor_prepare

CursorPrepare

cursor_recompile

CursorRecompile

cursor_unprepare

CursorUnprepare

database_attached

NULL

database_created

NULL

database_detached

NULL

database_file_size_change

Data File Auto Grow

database_file_size_change

Log File Auto Grow

database_file_size_change

Data File Auto Shrink

database_file_size_change

Log File Auto Shrink

database_mirroring_state_change

Database Mirroring State Change

database_started

NULL

database_stopped

NULL

database_suspect_data_page

Database Suspect Data Page

database_transaction_begin

NULL

database_transaction_end

NULL

database_uncontained_usage

NULL

databases_backup_restore_throughput

NULL

databases_bulk_copy_rows

NULL

databases_bulk_copy_throughput

NULL

databases_bulk_insert_rows

NULL

databases_bulk_insert_throughput

NULL

databases_data_file_size_changed

NULL

databases_dbcc_logical_scan

NULL

databases_log_cache_hit

NULL

databases_log_cache_read

NULL

databases_log_file_size_changed

NULL

databases_log_file_used_size_changed

NULL

databases_log_flush

NULL

databases_log_flush_wait

NULL

databases_log_growth

NULL

databases_log_shrink

NULL

databases_log_truncation

NULL

databases_shrink_data_movement

NULL

deadlock_monitor_mem_stats

NULL

deadlock_monitor_perf_stats

NULL

deadlock_monitor_pmo_status

NULL

deadlock_monitor_serialized_local_wait_for_graph

NULL

deadlock_monitor_state_transition

NULL

deadlock_scheduler_callback_executed

NULL

degree_of_parallelism

Degree of Parallelism

deprecation_announcement

Deprecation Announcement

deprecation_final_support

Deprecation Final Support

disk_log_read

NULL

disk_log_read_ignore

NULL

dtc_transaction

DTCTransaction

dump_exception_routine_executed

NULL

error_reported

EventLog

error_reported

FT:Crawl Aborted

error_reported

User Error Message

errorlog_written

ErrorLog

ex_terminator_called

NULL

exception_ring_buffer_recorded

Exception

exchange_spill

Exchange Spill Event

exec_prepared_sql

Exec Prepared SQL

execution_warning

Execution Warnings

existing_connection

ExistingConnection

exit_routine_executed

NULL

expression_compile_stop_batch_processing

NULL

extent_activation_cache_overflow

NULL

failed_hresult

NULL

failed_hresult_msg

NULL

fastloadcontext_enabled

NULL

file_read

NULL

file_read_completed

NULL

file_write_completed

NULL

file_written

NULL

file_written_to_replica

NULL

filestream_file_io_dump

NULL

filestream_file_io_failure

NULL

filestream_file_io_request

NULL

filestream_file_io_response

NULL

filestream_file_io_trace

NULL

filestream_file_write_completion

NULL

filetable_application_error

NULL

filetable_file_io_request

NULL

filetable_file_io_response

NULL

filetable_nso_error

NULL

filetable_nso_kill

NULL

filetable_nso_operation

NULL

filetable_store_database_operation

NULL

filetable_store_enumerate_getitem

NULL

filetable_store_item_get

NULL

filetable_store_item_modify

NULL

filetable_store_item_moverename

NULL

filetable_store_operation

NULL

filetable_store_table_operation

NULL

flush_file_buffers

NULL

full_text_crawl_started

FT:Crawl Started

full_text_crawl_stopped

FT:Crawl Stopped

full_update_instead_of_partial_update

NULL

fulltext_query_exec_stats

NULL

fulltext_query_recompile

NULL

fulltext_reorganize_phase1_destination_fragment

NULL

fulltext_reorganize_phase1_source_fragment

NULL

fulltext_reorganize_progress

NULL

fulltext_reorganize_source_fragment

NULL

fulltext_reorganize_start

NULL

fulltext_semantic_document_language

NULL

function_hook_changed

NULL

gc_suspension

NULL

ghost_cleanup

NULL

group_commit_value_changed

NULL

hadr_ag_config_data_mutex_acquisition_state

NULL

hadr_ag_database_api_call

NULL

hadr_ag_lease_renewal

NULL

hadr_ag_wsfc_resource_state

NULL

hadr_apply_log_block

NULL

hadr_apply_vlfheader

NULL

hadr_ar_api_call

NULL

hadr_ar_critical_section_entry_state

NULL

hadr_ar_manager_mutex_acquisition_state

NULL

hadr_ar_manager_starting

NULL

hadr_capture_compressed_log_cache

NULL

hadr_capture_log_block

NULL

hadr_capture_vlfheader

NULL

hadr_database_flow_control_action

NULL

hadr_database_replica_disjoin_completion

NULL

hadr_db_commit_mgr_harden

NULL

hadr_db_commit_mgr_harden_still_waiting

NULL

hadr_db_commit_mgr_set_policy

NULL

hadr_db_commit_mgr_update_harden

NULL

hadr_db_manager_backup_info_msg

NULL

hadr_db_manager_backup_sync_msg

NULL

hadr_db_manager_db_queue_restart

NULL

hadr_db_manager_db_restart

NULL

hadr_db_manager_db_shutdown

NULL

hadr_db_manager_db_startdb

NULL

hadr_db_manager_establish_db_msg

NULL

hadr_db_manager_filemetadata_request

NULL

hadr_db_manager_lsn_sync_msg

NULL

hadr_db_manager_page_request

NULL

hadr_db_manager_redo

NULL

hadr_db_manager_redo_control

NULL

hadr_db_manager_scan_control

NULL

hadr_db_manager_state

NULL

hadr_db_manager_status_change

NULL

hadr_db_manager_suspend_resume

NULL

hadr_db_manager_undo

NULL

hadr_db_manager_user_control

NULL

hadr_db_partner_set_policy

NULL

hadr_db_partner_set_sync_state

NULL

hadr_ddl_failover_execution_state

NULL

hadr_dump_log_block

NULL

hadr_dump_log_progress

NULL

hadr_dump_primary_progress

NULL

hadr_dump_sync_primary_progress

NULL

hadr_dump_vlf_header

NULL

hadr_evaluate_readonly_routing_info

NULL

hadr_filestream_corrupt_message

NULL

hadr_filestream_directory_create

NULL

hadr_filestream_file_close

NULL

hadr_filestream_file_flush

NULL

hadr_filestream_file_open

NULL

hadr_filestream_file_set_eof

NULL

hadr_filestream_log_interpreter

NULL

hadr_filestream_message_block_end

NULL

hadr_filestream_message_dir_create

NULL

hadr_filestream_message_file_request

NULL

hadr_filestream_message_file_write

NULL

hadr_filestream_processed_block

NULL

hadr_filestream_undo_inplace_update

NULL

hadr_online_availability_group_first_attempt_failure

NULL

hadr_online_availability_group_retry_end

NULL

hadr_scan_state

NULL

hadr_sql_instance_to_node_map_entry_deleted

NULL

hadr_thread_pool_worker_start

NULL

hadr_transport_dump_config_message

NULL

hadr_transport_dump_message

NULL

hadr_transport_flow_control_action

NULL

hadr_transport_session_state

NULL

hadr_transport_ucs_connection_info

NULL

hadr_undo_of_redo_log_scan

NULL

hadr_worker_pool_task

NULL

hadr_worker_pool_thread

NULL

hadr_wsfc_change_notifier_node_not_online

NULL

hadr_wsfc_change_notifier_severe_error

NULL

hadr_wsfc_change_notifier_start_ag_specific_notifications

NULL

hadr_wsfc_change_notifier_status

NULL

hadr_xrf_copyXrf_partialCopy

NULL

hadr_xrf_deleteAllXrf_beforeEntry

NULL

hadr_xrf_deleteRecLsn_beforeEntry

NULL

hadr_xrf_updateXrf_before_recoveryLsn_update

NULL

hadr_xrf_updateXrf_partialUpdate

NULL

hash_warning

Hash Warning

hekaton_slow_param_passing

NULL

hobt_schema_mgr_allocation_unit

NULL

hobt_schema_mgr_column

NULL

hobt_schema_mgr_factory

NULL

hobt_schema_mgr_hobt

NULL

hobt_schema_mgr_hobt_attributes

NULL

hobt_schema_mgr_hobt_page

NULL

host_task_ring_buffer_recorded

NULL

idle_server_callback_executed

NULL

inaccurate_cardinality_estimate

NULL

index_build_extents_allocation

NULL

ioaff_node_summary

NULL

ioaff_scan_end

NULL

ioaff_scan_start

NULL

ioaff_scan_worker_end

NULL

ioaff_scan_worker_start

NULL

large_cache_caching_decision

NULL

large_cache_entry_value_change

NULL

large_cache_memory_pressure

NULL

large_cache_state_change

NULL

large_cache_sweep

NULL

latch_acquire_time

NULL

latch_demoted

NULL

latch_promoted

NULL

latch_suspend_begin

NULL

latch_suspend_end

NULL

latch_suspend_warning

NULL

leaf_page_disfavored

NULL

lock_acquired

Lock:Acquired

lock_cancel

Lock:Cancel

lock_deadlock

Lock:Deadlock

lock_deadlock_chain

Lock:Deadlock Chain

lock_escalation

Lock:Escalation

lock_redo_blocked

NULL

lock_redo_unblocked

NULL

lock_released

Lock:Released

lock_timeout

Lock:Timeout

lock_timeout_greater_than_0

Lock:Timeout (timeout > 0)

locks_lock_waits

NULL

log_block_cache

NULL

log_block_consume

NULL

log_block_move

NULL

log_block_persistence_reset

NULL

log_blocks_uncache

NULL

log_buffer_allocated

NULL