Καθημερινά λαμβάνω αρκετές ερωτήσεις από μέλη του SQLschool.gr για διάφορα θέματα που αφορούν το Microsoft Data Platform. Πάντα προσπαθώ να απαντήσω το συντομότερο δυνατόν, άλλες φορές τα καταφέρνω, άλλες όχι, αλλά πάντα θα απαντήσω ή προσωπικά ή γράφοντας κάποιο άρθρο.
Σήμερα μου ήρθε μια ερώτηση που πραγματικά με ξάφνιασε θετικά καθώς αφορούσε το Policy Based Management που προσωπικά λατρεύω και χρησιμοποιώ σε όλες τις δικιές μου εγκαταστάσεις καθώς έχω την δυνατότητα με αυτό να βάλω τις πολιτικές μου ώστε να επιτρέπω ή να αποτρέπω να γίνονται συγκεκριμένες ενέργειες στο SQL Server Instance.
Με ξάφνιασε καθώς μέχρι τώρα δεν είχα δει κάποιον να τα χρησιμοποιεί. Τολμώ να πω ότι η ύπαρξη τους αγνοείται από αρκετούς και είμαι σίγουρος 99% για αυτό καθώς στα τόσα SQL Server instances που τόσα χρόνια έχω δει δεν χρησιμοποιούνται πουθενά :-(
Φυσικά η εφαρμογή πολιτικών δεν αφήνει τον οποιοδήποτε να κάνει ότι θέλει και αυτό δημιουργεί τις γνωστές "γκρίνιες". Αλλά αυτό προσωπικά δεν με απασχολεί καθώς σαν DBA είμαι υπεύθυνος για το instance και πρέπει να μην αφήνω τον οποιοδήποτε να κάνει ότι θέλει. Δεν συμφωνείτε;
Στο Policy Based Management υπάρχουν τρία βασικά components.
Τα policies που είναι οι πολιτικές που ορίζουμε και τα οποία περιέχουν τις συνθήκες που θέλουμε να ελέγξουμε (conditions) που εφαρμόζονται πάνω σε facets (που είναι predefined) και τα οποία είναι groups από properties συγκεκριμένων targets/objects που εφαρμόζεται η εκάστοτε πολιτική.
Τα policies έχουν τέσσερεις διαφορετικούς τρόπους evaluation:
On Demand
Evaluate την πολιτική όταν το επιλέξουμε να γίνει αυτό και όλα τα facets το υποστηρίζουν αυτό.
On Schedule
Evaluate την πολιτική με schedule job στο SQL Server Agent και σχεδόν όλα τα facets το υποστηρίζουν.
On Change: Log Only
Είναι ένα αυτοματοποιημένο evaluation της πολιτικής και μόνο συγκεκριμένα facets το υποστηρίζουν καθώς αυτά πρέπει αυτή να μπορεί να γίνει captured by an event.
On Change: Prevent
Είναι ένα αυτοματοποιημένο evaluation της πολιτικής που αποτρέπει να γίνει η αλλαγή και μόνο συγκεκριμένα facets το υποστηρίζουν καθώς αυτά πρέπει να υποστηρίζονται από DDL triggers.
Q&A
Η ερώτηση του αγαπητού μέλους ήταν πως μπορεί να βρει ποια facets υποστηρίζουν ποιο evaluation method ώστε να μπορεί να γνωρίζει με ποιο τρόπο θα φτιάξει τις πολιτικές του.
Για να μπορέσει κάποιος να πάρει την πληροφορία αυτή υπάρχει ένα όχι και τόσο documented DMV το msdb.dbo.syspolicy_management_facets.
Σε αυτό υπάρχει το execution_mode field το οποίο με bitwise μπορούμε να έχουμε μια ωραιότατη λίστα για το κάθε facet και τα evaluation method που αυτό υποστηρίζει. Απλά όπως είπα και παραπάνω όλα υποστηρίζουν το On Demand για αυτό και το έχω βάλει σταθερά σε 1.
CODE #1
select
name as Facet_Name,
1 as On_Demand,
CONVERT(BIT, execution_mode & 4) as On_Schedule,
CONVERT(BIT, execution_mode & 2) as On_Change_Log,
CONVERT(BIT, execution_mode & 1) as On_Change_Prevent
from msdb.dbo.syspolicy_management_facets
Supported Evaluation Modes per Facet
Facet_Name |
On_Demand |
On_Schedule |
On_Change_Log |
On_Change_Prevent |
ApplicationRole |
1 |
1 |
1 |
1 |
AsymmetricKey |
1 |
1 |
1 |
1 |
Audit |
1 |
1 |
0 |
0 |
AvailabilityDatabase |
1 |
1 |
0 |
0 |
AvailabilityGroup |
1 |
1 |
0 |
0 |
AvailabilityReplica |
1 |
1 |
0 |
0 |
DatabaseReplicaState |
1 |
1 |
0 |
0 |
BackupDevice |
1 |
1 |
0 |
0 |
BrokerPriority |
1 |
1 |
0 |
0 |
BrokerService |
1 |
1 |
0 |
0 |
Certificate |
1 |
1 |
0 |
0 |
ColumnEncryptionKey |
1 |
1 |
1 |
1 |
ColumnEncryptionKeyValue |
1 |
1 |
1 |
1 |
ColumnMasterKey |
1 |
1 |
1 |
1 |
Computer |
1 |
1 |
0 |
0 |
Credential |
1 |
1 |
0 |
0 |
CryptographicProvider |
1 |
1 |
0 |
0 |
Database |
1 |
1 |
0 |
0 |
DatabaseAuditSpecification |
1 |
1 |
0 |
0 |
DatabaseDdlTrigger |
1 |
1 |
0 |
0 |
DatabaseRole |
1 |
1 |
1 |
1 |
DataFile |
1 |
1 |
0 |
0 |
Default |
1 |
1 |
0 |
0 |
DeployedDac |
1 |
1 |
0 |
0 |
Endpoint |
1 |
1 |
1 |
1 |
Utility |
1 |
1 |
0 |
0 |
FileGroup |
1 |
1 |
0 |
0 |
FullTextCatalog |
1 |
1 |
0 |
0 |
FullTextIndex |
1 |
1 |
0 |
0 |
FullTextStopList |
1 |
1 |
0 |
0 |
IAvailabilityGroupState |
1 |
1 |
0 |
0 |
IDatabaseMaintenanceFacet |
1 |
1 |
0 |
0 |
IDatabaseOptions |
1 |
1 |
1 |
0 |
IDatabasePerformanceFacet |
1 |
1 |
0 |
0 |
IDatabaseSecurityFacet |
1 |
1 |
0 |
0 |
ILoginOptions |
1 |
1 |
1 |
1 |
IMultipartNameFacet |
1 |
1 |
1 |
1 |
INameFacet |
1 |
1 |
0 |
0 |
ITableOptions |
1 |
1 |
1 |
1 |
IUserOptions |
1 |
1 |
1 |
1 |
IViewOptions |
1 |
1 |
1 |
1 |
Index |
1 |
1 |
0 |
0 |
IServerAuditFacet |
1 |
1 |
0 |
0 |
IServerConfigurationFacet |
1 |
1 |
1 |
0 |
IServerInformation |
1 |
1 |
0 |
0 |
IServerPerformanceFacet |
1 |
1 |
0 |
0 |
IServerProtocolSettingsFacet |
1 |
1 |
0 |
0 |
IServerSecurityFacet |
1 |
1 |
0 |
0 |
IServerSetupFacet |
1 |
1 |
0 |
0 |
IServerSelectionFacet |
1 |
0 |
0 |
0 |
IServerSettings |
1 |
1 |
0 |
0 |
ISmartAdminState |
1 |
1 |
0 |
0 |
ISurfaceAreaConfigurationForAnalysisServer |
1 |
0 |
0 |
0 |
ISurfaceAreaConfigurationForReportingServices |
1 |
0 |
0 |
0 |
ISurfaceAreaFacet |
1 |
1 |
1 |
0 |
LinkedServer |
1 |
1 |
0 |
0 |
LogFile |
1 |
1 |
0 |
0 |
Login |
1 |
1 |
0 |
0 |
MessageType |
1 |
1 |
0 |
0 |
PartitionFunction |
1 |
1 |
0 |
0 |
PartitionScheme |
1 |
1 |
0 |
0 |
Processor |
1 |
1 |
0 |
0 |
PlanGuide |
1 |
1 |
0 |
0 |
RemoteServiceBinding |
1 |
1 |
0 |
0 |
ResourceGovernor |
1 |
1 |
0 |
0 |
ResourcePool |
1 |
1 |
1 |
1 |
Rule |
1 |
1 |
0 |
0 |
Schema |
1 |
1 |
1 |
1 |
SearchPropertyList |
1 |
1 |
1 |
0 |
Server |
1 |
1 |
0 |
0 |
ServerAuditSpecification |
1 |
1 |
0 |
0 |
ServerDdlTrigger |
1 |
1 |
0 |
0 |
ServerRole |
1 |
1 |
1 |
1 |
ServiceContract |
1 |
1 |
0 |
0 |
ServiceQueue |
1 |
1 |
0 |
0 |
ServiceRoute |
1 |
1 |
0 |
0 |
SmartAdmin |
1 |
1 |
0 |
0 |
Statistic |
1 |
1 |
0 |
0 |
StoredProcedure |
1 |
1 |
1 |
1 |
SymmetricKey |
1 |
1 |
0 |
0 |
Synonym |
1 |
1 |
0 |
0 |
Sequence |
1 |
1 |
1 |
1 |
Table |
1 |
1 |
0 |
0 |
Trigger |
1 |
1 |
0 |
0 |
User |
1 |
1 |
0 |
0 |
UserDefinedAggregate |
1 |
1 |
0 |
0 |
UserDefinedDataType |
1 |
1 |
0 |
0 |
UserDefinedFunction |
1 |
1 |
1 |
1 |
UserDefinedTableType |
1 |
1 |
0 |
0 |
UserDefinedType |
1 |
1 |
0 |
0 |
View |
1 |
1 |
0 |
0 |
Volume |
1 |
1 |
0 |
0 |
WorkloadGroup |
1 |
1 |
1 |
1 |
XmlSchemaCollection |
1 |
1 |
0 |
0 |
IDataFilePerformanceFacet |
1 |
1 |
0 |
0 |
ILogFilePerformanceFacet |
1 |
1 |
0 |
0 |
NOTE
Υπόσχομαι ότι θα κάνω είτε video είτε SQL Night με θέμα το Policy Based Management ώστε να το φέρω ακόμα μια φορά στην επιφάνεια καθώς η εμπειρία μου με αυτό μόνο θετικά έχει.
Μέχρι τότε να είστε όλες και όλοι καλά.
//Antonios Chatzipavlis