mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-14 01:25:40 -05:00
Port code for Application Role, Database Role, Permission Data and Securable search (#1992)
* port code for db role and app role * port permissionData (wip) * port securable search data
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -5403,4 +5403,444 @@ The Query Processor estimates that implementing the following index could improv
|
||||
<value>Reset password for the login while unlocking.</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Alter" xml:space="preserve">
|
||||
<value>Alter</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Connect" xml:space="preserve">
|
||||
<value>Connect</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Control" xml:space="preserve">
|
||||
<value>Control</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Delete" xml:space="preserve">
|
||||
<value>Delete</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Execute" xml:space="preserve">
|
||||
<value>Execute</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Impersonate" xml:space="preserve">
|
||||
<value>Impersonate</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Insert" xml:space="preserve">
|
||||
<value>Insert</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Receive" xml:space="preserve">
|
||||
<value>Receive</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_References" xml:space="preserve">
|
||||
<value>References</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Select" xml:space="preserve">
|
||||
<value>Select</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Send" xml:space="preserve">
|
||||
<value>Send</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_TakeOwnership" xml:space="preserve">
|
||||
<value>Take ownership</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Update" xml:space="preserve">
|
||||
<value>Update</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewDefinition" xml:space="preserve">
|
||||
<value>View definition</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewChangeTracking" xml:space="preserve">
|
||||
<value>View change tracking</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyApplicationRole" xml:space="preserve">
|
||||
<value>Alter any application role</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyAssembly" xml:space="preserve">
|
||||
<value>Alter any assembly</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyAsymmetricKey" xml:space="preserve">
|
||||
<value>Alter any asymmetric key</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyCertificate" xml:space="preserve">
|
||||
<value>Alter any certificate</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyDatabaseAudit" xml:space="preserve">
|
||||
<value>Alter any database audit</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyContract" xml:space="preserve">
|
||||
<value>Alter any contract</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyDatabaseDdlTrigger" xml:space="preserve">
|
||||
<value>Alter any database DDL trigger</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyDatabaseEventNotification" xml:space="preserve">
|
||||
<value>Alter any database event notification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyDataspace" xml:space="preserve">
|
||||
<value>Alter any dataspace</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyExternalDataSource" xml:space="preserve">
|
||||
<value>Alter any external data source</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyExternalFileFormat" xml:space="preserve">
|
||||
<value>Alter any external file format</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyFulltextCatalog" xml:space="preserve">
|
||||
<value>Alter any fulltext catalog</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyMask" xml:space="preserve">
|
||||
<value>Alter any mask</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyMessageType" xml:space="preserve">
|
||||
<value>Alter any message type</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyRemoteServiceBinding" xml:space="preserve">
|
||||
<value>Alter any remote service binding</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyRole" xml:space="preserve">
|
||||
<value>Alter any role</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyRoute" xml:space="preserve">
|
||||
<value>Alter any route</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnySchema" xml:space="preserve">
|
||||
<value>Alter any schema</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnySecurityPolicy" xml:space="preserve">
|
||||
<value>Alter any security policy</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnySensitivityClassification" xml:space="preserve">
|
||||
<value>Alter any sensitivity classification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyService" xml:space="preserve">
|
||||
<value>Alter any service</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyUser" xml:space="preserve">
|
||||
<value>Alter any user</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnySymmetricKey" xml:space="preserve">
|
||||
<value>Alter any symmetric key</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Authenticate" xml:space="preserve">
|
||||
<value>Authenticate</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_BackupDatabase" xml:space="preserve">
|
||||
<value>Backup database</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_BackupLog" xml:space="preserve">
|
||||
<value>Backup log</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Checkpoint" xml:space="preserve">
|
||||
<value>Checkpoint</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ConnectReplication" xml:space="preserve">
|
||||
<value>Connect replication</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateAggregate" xml:space="preserve">
|
||||
<value>Create aggregate</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateAssembly" xml:space="preserve">
|
||||
<value>Create assembly</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateAsymmetricKey" xml:space="preserve">
|
||||
<value>Create asymmetric key</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateCertificate" xml:space="preserve">
|
||||
<value>Create certificate</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateContract" xml:space="preserve">
|
||||
<value>Create contract</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateDatabase" xml:space="preserve">
|
||||
<value>Create database</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateDatabaseDdlEventNotification" xml:space="preserve">
|
||||
<value>Create database DDL event notification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateDefault" xml:space="preserve">
|
||||
<value>Create default</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateFulltextCatalog" xml:space="preserve">
|
||||
<value>Create fulltext catalog</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateFunction" xml:space="preserve">
|
||||
<value>Create function</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateMessageType" xml:space="preserve">
|
||||
<value>Create message type</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateProcedure" xml:space="preserve">
|
||||
<value>Create procedure</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateQueue" xml:space="preserve">
|
||||
<value>Create queue</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateRemoteServiceBinding" xml:space="preserve">
|
||||
<value>Create remote service binding</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateRole" xml:space="preserve">
|
||||
<value>Create role</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateRoute" xml:space="preserve">
|
||||
<value>Create route</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateRule" xml:space="preserve">
|
||||
<value>Create rule</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateSchema" xml:space="preserve">
|
||||
<value>Create schema</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateService" xml:space="preserve">
|
||||
<value>Create service</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateSymmetricKey" xml:space="preserve">
|
||||
<value>Create symmetric key</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateSynonym" xml:space="preserve">
|
||||
<value>Create synonym</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateSequence" xml:space="preserve">
|
||||
<value>Create sequence</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateTable" xml:space="preserve">
|
||||
<value>Create table</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateType" xml:space="preserve">
|
||||
<value>Create type</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateView" xml:space="preserve">
|
||||
<value>Create view</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateXmlSchemaCollection" xml:space="preserve">
|
||||
<value>Create XML schema collection</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Showplan" xml:space="preserve">
|
||||
<value>Show plan</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_SubscribeQueryNotifications" xml:space="preserve">
|
||||
<value>Subscribe query notifications</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Unmask" xml:space="preserve">
|
||||
<value>Unmask</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewAnyColumnEncryptionKeyDefinition" xml:space="preserve">
|
||||
<value>View any column encryption key definition</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewAnyColumnMasterKeyDefinition" xml:space="preserve">
|
||||
<value>View any column master key definition</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewAnySensitivityClassification" xml:space="preserve">
|
||||
<value>View any sensitivity classification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewDatabaseState" xml:space="preserve">
|
||||
<value>View database state</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AdministerBulkOperations" xml:space="preserve">
|
||||
<value>Administer bulk operations</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyServerAudit" xml:space="preserve">
|
||||
<value>Alter any server audit</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyConnection" xml:space="preserve">
|
||||
<value>Alter any connection</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyCredential" xml:space="preserve">
|
||||
<value>Alter any credential</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyDatabase" xml:space="preserve">
|
||||
<value>Alter any database</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyEndpoint" xml:space="preserve">
|
||||
<value>Alter any endpoint</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyEventNotification" xml:space="preserve">
|
||||
<value>Alter any event notification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyEventSession" xml:space="preserve">
|
||||
<value>Alter any event session</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyLinkedServer" xml:space="preserve">
|
||||
<value>Alter any linked server</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyLogin" xml:space="preserve">
|
||||
<value>Alter any login</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyServerRole" xml:space="preserve">
|
||||
<value>Alter any server role</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterResources" xml:space="preserve">
|
||||
<value>Alter resources</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterServerState" xml:space="preserve">
|
||||
<value>Alter server state</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterSettings" xml:space="preserve">
|
||||
<value>Alter settings</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterTrace" xml:space="preserve">
|
||||
<value>Alter trace</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AuthenticateServer" xml:space="preserve">
|
||||
<value>Authenticate server</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ConnectSql" xml:space="preserve">
|
||||
<value>Connect SQL</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ControlServer" xml:space="preserve">
|
||||
<value>Control server</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateAnyDatabase" xml:space="preserve">
|
||||
<value>Create any database</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateDdlEventNotification" xml:space="preserve">
|
||||
<value>Create DDL event notification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateEndpoint" xml:space="preserve">
|
||||
<value>Create endpoint</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateTraceEventNotification" xml:space="preserve">
|
||||
<value>Create trace event notification</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateServerRole" xml:space="preserve">
|
||||
<value>Create server role</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ExternalAccessAssembly" xml:space="preserve">
|
||||
<value>External access assembly</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_Shutdown" xml:space="preserve">
|
||||
<value>Shutdown</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_UnsafeAssembly" xml:space="preserve">
|
||||
<value>Unsafe assembly</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewAnyDatabase" xml:space="preserve">
|
||||
<value>View any database</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewAnyDefinition" xml:space="preserve">
|
||||
<value>View any definition</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ViewServerState" xml:space="preserve">
|
||||
<value>View server state</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_AlterAnyAvailabilityGroup" xml:space="preserve">
|
||||
<value>Alter any availability group</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_CreateAvailabilityGroup" xml:space="preserve">
|
||||
<value>Create availability group</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_SelectAllUserSecurables" xml:space="preserve">
|
||||
<value>Select All User Securables</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ConnectAnyDatabase" xml:space="preserve">
|
||||
<value>Connect Any Database</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
<data name="Permission_ImpersonateAnyLogin" xml:space="preserve">
|
||||
<value>Impersonate Any Login</value>
|
||||
<comment></comment>
|
||||
</data>
|
||||
</root>
|
||||
|
||||
@@ -2451,3 +2451,119 @@ ObjectNotRenamable(string urn) = The object could not be renamed. URN: '{0}'.
|
||||
# Security Service
|
||||
DefaultLanguagePlaceholder = <default>
|
||||
ResetPasswordWhileUnlocking = Reset password for the login while unlocking.
|
||||
|
||||
#Object permission names
|
||||
Permission_Alter = Alter
|
||||
Permission_Connect = Connect
|
||||
Permission_Control = Control
|
||||
Permission_Delete = Delete
|
||||
Permission_Execute = Execute
|
||||
Permission_Impersonate = Impersonate
|
||||
Permission_Insert = Insert
|
||||
Permission_Receive = Receive
|
||||
Permission_References = References
|
||||
Permission_Select = Select
|
||||
Permission_Send = Send
|
||||
Permission_TakeOwnership = Take ownership
|
||||
Permission_Update = Update
|
||||
Permission_ViewDefinition = View definition
|
||||
Permission_ViewChangeTracking = View change tracking
|
||||
|
||||
#Database permission names
|
||||
Permission_AlterAnyApplicationRole = Alter any application role
|
||||
Permission_AlterAnyAssembly = Alter any assembly
|
||||
Permission_AlterAnyAsymmetricKey = Alter any asymmetric key
|
||||
Permission_AlterAnyCertificate = Alter any certificate
|
||||
Permission_AlterAnyDatabaseAudit = Alter any database audit
|
||||
Permission_AlterAnyContract = Alter any contract
|
||||
Permission_AlterAnyDatabaseDdlTrigger = Alter any database DDL trigger
|
||||
Permission_AlterAnyDatabaseEventNotification = Alter any database event notification
|
||||
Permission_AlterAnyDataspace = Alter any dataspace
|
||||
Permission_AlterAnyExternalDataSource = Alter any external data source
|
||||
Permission_AlterAnyExternalFileFormat = Alter any external file format
|
||||
Permission_AlterAnyFulltextCatalog = Alter any fulltext catalog
|
||||
Permission_AlterAnyMask = Alter any mask
|
||||
Permission_AlterAnyMessageType = Alter any message type
|
||||
Permission_AlterAnyRemoteServiceBinding = Alter any remote service binding
|
||||
Permission_AlterAnyRole = Alter any role
|
||||
Permission_AlterAnyRoute = Alter any route
|
||||
Permission_AlterAnySchema = Alter any schema
|
||||
Permission_AlterAnySecurityPolicy = Alter any security policy
|
||||
Permission_AlterAnySensitivityClassification = Alter any sensitivity classification
|
||||
Permission_AlterAnyService = Alter any service
|
||||
Permission_AlterAnyUser = Alter any user
|
||||
Permission_AlterAnySymmetricKey = Alter any symmetric key
|
||||
Permission_Authenticate = Authenticate
|
||||
Permission_BackupDatabase = Backup database
|
||||
Permission_BackupLog = Backup log
|
||||
Permission_Checkpoint = Checkpoint
|
||||
Permission_ConnectReplication = Connect replication
|
||||
Permission_CreateAggregate = Create aggregate
|
||||
Permission_CreateAssembly = Create assembly
|
||||
Permission_CreateAsymmetricKey = Create asymmetric key
|
||||
Permission_CreateCertificate = Create certificate
|
||||
Permission_CreateContract = Create contract
|
||||
Permission_CreateDatabase = Create database
|
||||
Permission_CreateDatabaseDdlEventNotification = Create database DDL event notification
|
||||
Permission_CreateDefault = Create default
|
||||
Permission_CreateFulltextCatalog = Create fulltext catalog
|
||||
Permission_CreateFunction = Create function
|
||||
Permission_CreateMessageType = Create message type
|
||||
Permission_CreateProcedure = Create procedure
|
||||
Permission_CreateQueue = Create queue
|
||||
Permission_CreateRemoteServiceBinding = Create remote service binding
|
||||
Permission_CreateRole = Create role
|
||||
Permission_CreateRoute = Create route
|
||||
Permission_CreateRule = Create rule
|
||||
Permission_CreateSchema = Create schema
|
||||
Permission_CreateService = Create service
|
||||
Permission_CreateSymmetricKey = Create symmetric key
|
||||
Permission_CreateSynonym = Create synonym
|
||||
Permission_CreateSequence = Create sequence
|
||||
Permission_CreateTable = Create table
|
||||
Permission_CreateType = Create type
|
||||
Permission_CreateView = Create view
|
||||
Permission_CreateXmlSchemaCollection = Create XML schema collection
|
||||
Permission_Showplan = Show plan
|
||||
Permission_SubscribeQueryNotifications = Subscribe query notifications
|
||||
Permission_Unmask = Unmask
|
||||
Permission_ViewAnyColumnEncryptionKeyDefinition = View any column encryption key definition
|
||||
Permission_ViewAnyColumnMasterKeyDefinition = View any column master key definition
|
||||
Permission_ViewAnySensitivityClassification = View any sensitivity classification
|
||||
Permission_ViewDatabaseState = View database state
|
||||
|
||||
#Server permissions names
|
||||
Permission_AdministerBulkOperations = Administer bulk operations
|
||||
Permission_AlterAnyServerAudit = Alter any server audit
|
||||
Permission_AlterAnyConnection = Alter any connection
|
||||
Permission_AlterAnyCredential = Alter any credential
|
||||
Permission_AlterAnyDatabase = Alter any database
|
||||
Permission_AlterAnyEndpoint = Alter any endpoint
|
||||
Permission_AlterAnyEventNotification = Alter any event notification
|
||||
Permission_AlterAnyEventSession = Alter any event session
|
||||
Permission_AlterAnyLinkedServer = Alter any linked server
|
||||
Permission_AlterAnyLogin = Alter any login
|
||||
Permission_AlterAnyServerRole = Alter any server role
|
||||
Permission_AlterResources = Alter resources
|
||||
Permission_AlterServerState = Alter server state
|
||||
Permission_AlterSettings = Alter settings
|
||||
Permission_AlterTrace = Alter trace
|
||||
Permission_AuthenticateServer = Authenticate server
|
||||
Permission_ConnectSql = Connect SQL
|
||||
Permission_ControlServer = Control server
|
||||
Permission_CreateAnyDatabase = Create any database
|
||||
Permission_CreateDdlEventNotification = Create DDL event notification
|
||||
Permission_CreateEndpoint = Create endpoint
|
||||
Permission_CreateTraceEventNotification = Create trace event notification
|
||||
Permission_CreateServerRole = Create server role
|
||||
Permission_ExternalAccessAssembly = External access assembly
|
||||
Permission_Shutdown = Shutdown
|
||||
Permission_UnsafeAssembly = Unsafe assembly
|
||||
Permission_ViewAnyDatabase = View any database
|
||||
Permission_ViewAnyDefinition = View any definition
|
||||
Permission_ViewServerState = View server state
|
||||
Permission_AlterAnyAvailabilityGroup = Alter any availability group
|
||||
Permission_CreateAvailabilityGroup = Create availability group
|
||||
Permission_SelectAllUserSecurables = Select All User Securables
|
||||
Permission_ConnectAnyDatabase = Connect Any Database
|
||||
Permission_ImpersonateAnyLogin = Impersonate Any Login
|
||||
|
||||
@@ -6587,6 +6587,556 @@ The Query Processor estimates that implementing the following index could improv
|
||||
<target state="new">Attestation protocol cannot be empty with Secure enclaves enabled.</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Alter">
|
||||
<source>Alter</source>
|
||||
<target state="new">Alter</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Connect">
|
||||
<source>Connect</source>
|
||||
<target state="new">Connect</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Control">
|
||||
<source>Control</source>
|
||||
<target state="new">Control</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Delete">
|
||||
<source>Delete</source>
|
||||
<target state="new">Delete</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Execute">
|
||||
<source>Execute</source>
|
||||
<target state="new">Execute</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Impersonate">
|
||||
<source>Impersonate</source>
|
||||
<target state="new">Impersonate</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Insert">
|
||||
<source>Insert</source>
|
||||
<target state="new">Insert</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Receive">
|
||||
<source>Receive</source>
|
||||
<target state="new">Receive</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_References">
|
||||
<source>References</source>
|
||||
<target state="new">References</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Select">
|
||||
<source>Select</source>
|
||||
<target state="new">Select</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Send">
|
||||
<source>Send</source>
|
||||
<target state="new">Send</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_TakeOwnership">
|
||||
<source>Take ownership</source>
|
||||
<target state="new">Take ownership</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Update">
|
||||
<source>Update</source>
|
||||
<target state="new">Update</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewDefinition">
|
||||
<source>View definition</source>
|
||||
<target state="new">View definition</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewChangeTracking">
|
||||
<source>View change tracking</source>
|
||||
<target state="new">View change tracking</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyApplicationRole">
|
||||
<source>Alter any application role</source>
|
||||
<target state="new">Alter any application role</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyAssembly">
|
||||
<source>Alter any assembly</source>
|
||||
<target state="new">Alter any assembly</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyAsymmetricKey">
|
||||
<source>Alter any asymmetric key</source>
|
||||
<target state="new">Alter any asymmetric key</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyCertificate">
|
||||
<source>Alter any certificate</source>
|
||||
<target state="new">Alter any certificate</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyDatabaseAudit">
|
||||
<source>Alter any database audit</source>
|
||||
<target state="new">Alter any database audit</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyContract">
|
||||
<source>Alter any contract</source>
|
||||
<target state="new">Alter any contract</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyDatabaseDdlTrigger">
|
||||
<source>Alter any database DDL trigger</source>
|
||||
<target state="new">Alter any database DDL trigger</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyDatabaseEventNotification">
|
||||
<source>Alter any database event notification</source>
|
||||
<target state="new">Alter any database event notification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyDataspace">
|
||||
<source>Alter any dataspace</source>
|
||||
<target state="new">Alter any dataspace</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyExternalDataSource">
|
||||
<source>Alter any external data source</source>
|
||||
<target state="new">Alter any external data source</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyExternalFileFormat">
|
||||
<source>Alter any external file format</source>
|
||||
<target state="new">Alter any external file format</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyFulltextCatalog">
|
||||
<source>Alter any fulltext catalog</source>
|
||||
<target state="new">Alter any fulltext catalog</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyMask">
|
||||
<source>Alter any mask</source>
|
||||
<target state="new">Alter any mask</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyMessageType">
|
||||
<source>Alter any message type</source>
|
||||
<target state="new">Alter any message type</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyRemoteServiceBinding">
|
||||
<source>Alter any remote service binding</source>
|
||||
<target state="new">Alter any remote service binding</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyRole">
|
||||
<source>Alter any role</source>
|
||||
<target state="new">Alter any role</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyRoute">
|
||||
<source>Alter any route</source>
|
||||
<target state="new">Alter any route</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnySchema">
|
||||
<source>Alter any schema</source>
|
||||
<target state="new">Alter any schema</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnySecurityPolicy">
|
||||
<source>Alter any security policy</source>
|
||||
<target state="new">Alter any security policy</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnySensitivityClassification">
|
||||
<source>Alter any sensitivity classification</source>
|
||||
<target state="new">Alter any sensitivity classification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyService">
|
||||
<source>Alter any service</source>
|
||||
<target state="new">Alter any service</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyUser">
|
||||
<source>Alter any user</source>
|
||||
<target state="new">Alter any user</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnySymmetricKey">
|
||||
<source>Alter any symmetric key</source>
|
||||
<target state="new">Alter any symmetric key</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Authenticate">
|
||||
<source>Authenticate</source>
|
||||
<target state="new">Authenticate</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_BackupDatabase">
|
||||
<source>Backup database</source>
|
||||
<target state="new">Backup database</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_BackupLog">
|
||||
<source>Backup log</source>
|
||||
<target state="new">Backup log</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Checkpoint">
|
||||
<source>Checkpoint</source>
|
||||
<target state="new">Checkpoint</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ConnectReplication">
|
||||
<source>Connect replication</source>
|
||||
<target state="new">Connect replication</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateAggregate">
|
||||
<source>Create aggregate</source>
|
||||
<target state="new">Create aggregate</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateAssembly">
|
||||
<source>Create assembly</source>
|
||||
<target state="new">Create assembly</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateAsymmetricKey">
|
||||
<source>Create asymmetric key</source>
|
||||
<target state="new">Create asymmetric key</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateCertificate">
|
||||
<source>Create certificate</source>
|
||||
<target state="new">Create certificate</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateContract">
|
||||
<source>Create contract</source>
|
||||
<target state="new">Create contract</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateDatabase">
|
||||
<source>Create database</source>
|
||||
<target state="new">Create database</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateDatabaseDdlEventNotification">
|
||||
<source>Create database DDL event notification</source>
|
||||
<target state="new">Create database DDL event notification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateDefault">
|
||||
<source>Create default</source>
|
||||
<target state="new">Create default</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateFulltextCatalog">
|
||||
<source>Create fulltext catalog</source>
|
||||
<target state="new">Create fulltext catalog</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateFunction">
|
||||
<source>Create function</source>
|
||||
<target state="new">Create function</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateMessageType">
|
||||
<source>Create message type</source>
|
||||
<target state="new">Create message type</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateProcedure">
|
||||
<source>Create procedure</source>
|
||||
<target state="new">Create procedure</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateQueue">
|
||||
<source>Create queue</source>
|
||||
<target state="new">Create queue</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateRemoteServiceBinding">
|
||||
<source>Create remote service binding</source>
|
||||
<target state="new">Create remote service binding</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateRole">
|
||||
<source>Create role</source>
|
||||
<target state="new">Create role</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateRoute">
|
||||
<source>Create route</source>
|
||||
<target state="new">Create route</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateRule">
|
||||
<source>Create rule</source>
|
||||
<target state="new">Create rule</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateSchema">
|
||||
<source>Create schema</source>
|
||||
<target state="new">Create schema</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateService">
|
||||
<source>Create service</source>
|
||||
<target state="new">Create service</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateSymmetricKey">
|
||||
<source>Create symmetric key</source>
|
||||
<target state="new">Create symmetric key</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateSynonym">
|
||||
<source>Create synonym</source>
|
||||
<target state="new">Create synonym</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateSequence">
|
||||
<source>Create sequence</source>
|
||||
<target state="new">Create sequence</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateTable">
|
||||
<source>Create table</source>
|
||||
<target state="new">Create table</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateType">
|
||||
<source>Create type</source>
|
||||
<target state="new">Create type</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateView">
|
||||
<source>Create view</source>
|
||||
<target state="new">Create view</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateXmlSchemaCollection">
|
||||
<source>Create XML schema collection</source>
|
||||
<target state="new">Create XML schema collection</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Showplan">
|
||||
<source>Show plan</source>
|
||||
<target state="new">Show plan</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_SubscribeQueryNotifications">
|
||||
<source>Subscribe query notifications</source>
|
||||
<target state="new">Subscribe query notifications</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Unmask">
|
||||
<source>Unmask</source>
|
||||
<target state="new">Unmask</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewAnyColumnEncryptionKeyDefinition">
|
||||
<source>View any column encryption key definition</source>
|
||||
<target state="new">View any column encryption key definition</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewAnyColumnMasterKeyDefinition">
|
||||
<source>View any column master key definition</source>
|
||||
<target state="new">View any column master key definition</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewAnySensitivityClassification">
|
||||
<source>View any sensitivity classification</source>
|
||||
<target state="new">View any sensitivity classification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewDatabaseState">
|
||||
<source>View database state</source>
|
||||
<target state="new">View database state</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AdministerBulkOperations">
|
||||
<source>Administer bulk operations</source>
|
||||
<target state="new">Administer bulk operations</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyServerAudit">
|
||||
<source>Alter any server audit</source>
|
||||
<target state="new">Alter any server audit</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyConnection">
|
||||
<source>Alter any connection</source>
|
||||
<target state="new">Alter any connection</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyCredential">
|
||||
<source>Alter any credential</source>
|
||||
<target state="new">Alter any credential</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyDatabase">
|
||||
<source>Alter any database</source>
|
||||
<target state="new">Alter any database</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyEndpoint">
|
||||
<source>Alter any endpoint</source>
|
||||
<target state="new">Alter any endpoint</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyEventNotification">
|
||||
<source>Alter any event notification</source>
|
||||
<target state="new">Alter any event notification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyEventSession">
|
||||
<source>Alter any event session</source>
|
||||
<target state="new">Alter any event session</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyLinkedServer">
|
||||
<source>Alter any linked server</source>
|
||||
<target state="new">Alter any linked server</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyLogin">
|
||||
<source>Alter any login</source>
|
||||
<target state="new">Alter any login</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyServerRole">
|
||||
<source>Alter any server role</source>
|
||||
<target state="new">Alter any server role</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterResources">
|
||||
<source>Alter resources</source>
|
||||
<target state="new">Alter resources</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterServerState">
|
||||
<source>Alter server state</source>
|
||||
<target state="new">Alter server state</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterSettings">
|
||||
<source>Alter settings</source>
|
||||
<target state="new">Alter settings</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterTrace">
|
||||
<source>Alter trace</source>
|
||||
<target state="new">Alter trace</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AuthenticateServer">
|
||||
<source>Authenticate server</source>
|
||||
<target state="new">Authenticate server</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ConnectSql">
|
||||
<source>Connect SQL</source>
|
||||
<target state="new">Connect SQL</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ControlServer">
|
||||
<source>Control server</source>
|
||||
<target state="new">Control server</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateAnyDatabase">
|
||||
<source>Create any database</source>
|
||||
<target state="new">Create any database</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateDdlEventNotification">
|
||||
<source>Create DDL event notification</source>
|
||||
<target state="new">Create DDL event notification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateEndpoint">
|
||||
<source>Create endpoint</source>
|
||||
<target state="new">Create endpoint</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateTraceEventNotification">
|
||||
<source>Create trace event notification</source>
|
||||
<target state="new">Create trace event notification</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateServerRole">
|
||||
<source>Create server role</source>
|
||||
<target state="new">Create server role</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ExternalAccessAssembly">
|
||||
<source>External access assembly</source>
|
||||
<target state="new">External access assembly</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_Shutdown">
|
||||
<source>Shutdown</source>
|
||||
<target state="new">Shutdown</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_UnsafeAssembly">
|
||||
<source>Unsafe assembly</source>
|
||||
<target state="new">Unsafe assembly</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewAnyDatabase">
|
||||
<source>View any database</source>
|
||||
<target state="new">View any database</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewAnyDefinition">
|
||||
<source>View any definition</source>
|
||||
<target state="new">View any definition</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ViewServerState">
|
||||
<source>View server state</source>
|
||||
<target state="new">View server state</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_AlterAnyAvailabilityGroup">
|
||||
<source>Alter any availability group</source>
|
||||
<target state="new">Alter any availability group</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_CreateAvailabilityGroup">
|
||||
<source>Create availability group</source>
|
||||
<target state="new">Create availability group</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_SelectAllUserSecurables">
|
||||
<source>Select All User Securables</source>
|
||||
<target state="new">Select All User Securables</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ConnectAnyDatabase">
|
||||
<source>Connect Any Database</source>
|
||||
<target state="new">Connect Any Database</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
<trans-unit id="Permission_ImpersonateAnyLogin">
|
||||
<source>Impersonate Any Login</source>
|
||||
<target state="new">Impersonate Any Login</target>
|
||||
<note></note>
|
||||
</trans-unit>
|
||||
</body>
|
||||
</file>
|
||||
</xliff>
|
||||
1191
src/Microsoft.SqlTools.ServiceLayer/Security/AppRoleGeneral.cs
Normal file
1191
src/Microsoft.SqlTools.ServiceLayer/Security/AppRoleGeneral.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,925 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
#nullable disable
|
||||
|
||||
using Microsoft.SqlServer.Management.Sdk.Sfc;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Specialized;
|
||||
using System.Xml;
|
||||
using System.Data;
|
||||
using Microsoft.SqlServer.Management.Common;
|
||||
using Microsoft.SqlServer.Management.Smo;
|
||||
using Microsoft.SqlTools.ServiceLayer.Management;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.Security
|
||||
|
||||
{
|
||||
/// <summary>
|
||||
/// DatabaseRoleGeneral - main panel for database role
|
||||
/// </summary>
|
||||
internal class DatabaseRoleGeneral
|
||||
{
|
||||
#region Members
|
||||
|
||||
private IServiceProvider serviceProvider = null;
|
||||
|
||||
/// <summary>
|
||||
/// data container member that contains data specific information like
|
||||
/// connection infor, SMO server object or an AMO server object as well
|
||||
/// as a hash table where one can manipulate custom data
|
||||
/// </summary>
|
||||
private CDataContainer dataContainer = null;
|
||||
|
||||
//SMO Server connection that MUST be used for all enumerator calls
|
||||
//We'll get this object out of CDataContainer, that must be initialized
|
||||
//property by the initialization code
|
||||
private ServerConnection serverConnection;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// execution mode by default for now is success
|
||||
/// </summary>
|
||||
private ExecutionMode m_executionMode = ExecutionMode.Success;
|
||||
|
||||
/// <summary>
|
||||
/// should UI be enabled?
|
||||
/// </summary>
|
||||
private bool executeEnabled = true;
|
||||
|
||||
/// <summary>
|
||||
/// should script buttons be enabled?
|
||||
/// </summary>
|
||||
private bool scriptEnabled = true;
|
||||
|
||||
/// <summary>
|
||||
/// F1 keyword to be passed to books on-line
|
||||
/// </summary>
|
||||
private string helpF1Keyword = null;
|
||||
private RunType runType;
|
||||
|
||||
//if derived class tries to call a protected method that relies on service provider,
|
||||
//and the service provider hasn't been set yet, we will cache the values and will
|
||||
//propagate them when we get the provider set
|
||||
private System.Drawing.Icon cachedIcon = null;
|
||||
private string cachedCaption = null;
|
||||
|
||||
//whether or not try to auto resize grid columns inside OnLoad method
|
||||
private bool attemtGridAutoResize = true;
|
||||
#endregion
|
||||
|
||||
#region Trace support
|
||||
private const string componentName = "DatabaseRoleGeneral";
|
||||
|
||||
public string ComponentName
|
||||
{
|
||||
get
|
||||
{
|
||||
return componentName;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
private class SchemaOwnership
|
||||
{
|
||||
public bool initiallyOwned;
|
||||
public bool currentlyOwned;
|
||||
|
||||
public SchemaOwnership(bool initiallyOwned)
|
||||
{
|
||||
this.initiallyOwned = initiallyOwned;
|
||||
this.currentlyOwned = initiallyOwned;
|
||||
}
|
||||
}
|
||||
|
||||
private class RoleMembership
|
||||
{
|
||||
public bool initiallyAMember;
|
||||
public bool currentlyAMember;
|
||||
|
||||
public RoleMembership(bool initiallyAMember)
|
||||
{
|
||||
this.initiallyAMember = initiallyAMember;
|
||||
this.currentlyAMember = initiallyAMember;
|
||||
}
|
||||
|
||||
public RoleMembership(bool initiallyAMember, bool currentlyAMember)
|
||||
{
|
||||
this.initiallyAMember = initiallyAMember;
|
||||
this.currentlyAMember = currentlyAMember;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region Constants - urn fields, etc...
|
||||
private const string ownerField = "Owner";
|
||||
private const string schemaOwnerField = "Owner";
|
||||
private const string schemaNameField = "Name";
|
||||
private const string memberNameField = "Name";
|
||||
private const string memberUrnField = "Urn";
|
||||
#endregion
|
||||
|
||||
#region Constants - grid columns positions, etc...
|
||||
private const int colSchemasChecked = 0;
|
||||
private const int colSchemasOwnedSchemas = 1;
|
||||
|
||||
private const int colMembershipBitmap = 0;
|
||||
private const int colMembershipRoleMembers = 1;
|
||||
|
||||
private const int sizeCheckboxColumn = 20;
|
||||
private const int sizeBitmapColumn = 20;
|
||||
#endregion
|
||||
|
||||
#region Non-UI variables
|
||||
|
||||
private System.Xml.XmlDocument document = null;
|
||||
private bool panelInitialized = false;
|
||||
|
||||
// info extracted from context
|
||||
private string serverName;
|
||||
private string databaseName;
|
||||
private string dbroleName;
|
||||
private string dbroleUrn;
|
||||
|
||||
// initial values loaded from server
|
||||
private string initialOwner;
|
||||
|
||||
private string ownerName = String.Empty;
|
||||
private string roleName = String.Empty;
|
||||
private HybridDictionary schemaOwnership = null;
|
||||
private HybridDictionary roleMembers = null;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties: CreateNew/Properties mode
|
||||
private bool IsPropertiesMode
|
||||
{
|
||||
get
|
||||
{
|
||||
return(dbroleName!=null) && (dbroleName.Trim().Length != 0);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constructors / Dispose
|
||||
public DatabaseRoleGeneral()
|
||||
{
|
||||
// This call is required by the Windows.Forms Form Designer.
|
||||
// InitializeComponent();
|
||||
}
|
||||
|
||||
public DatabaseRoleGeneral(CDataContainer context)
|
||||
{
|
||||
// InitializeComponent();
|
||||
dataContainer = context;
|
||||
|
||||
if (dataContainer != null)
|
||||
{
|
||||
document = dataContainer.Document;
|
||||
}
|
||||
else
|
||||
{
|
||||
document = null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Implementation: LoadData(), InitProp(), SendDataToServer()
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// LoadData
|
||||
///
|
||||
/// loads connection parameters from an xml
|
||||
/// </summary>
|
||||
/// <param name="doc"></param>
|
||||
private void LoadData(XmlDocument doc)
|
||||
{
|
||||
// STrace.Params(ComponentName, "LoadData", "XmlDocument doc=\"{0}\"", doc.OuterXml);
|
||||
|
||||
STParameters param;
|
||||
bool bStatus;
|
||||
|
||||
param = new STParameters();
|
||||
|
||||
param.SetDocument(doc);
|
||||
|
||||
bStatus = param.GetParam("servername", ref this.serverName);
|
||||
bStatus = param.GetParam("database", ref this.databaseName);
|
||||
|
||||
bStatus = param.GetParam("role", ref this.dbroleName);
|
||||
bStatus = param.GetParam("urn", ref this.dbroleUrn);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// InitProp
|
||||
///
|
||||
/// talks with enumerator an retrievives info
|
||||
/// </summary>
|
||||
private void InitProp()
|
||||
{
|
||||
// STrace.Params(ComponentName, "InitProp", "", null);
|
||||
|
||||
System.Diagnostics.Debug.Assert(this.serverName!=null);
|
||||
System.Diagnostics.Debug.Assert((this.databaseName!=null) && (this.databaseName.Trim().Length!=0));
|
||||
|
||||
|
||||
// InitializeSchemasGridColumns();
|
||||
if (this.dataContainer.Server.Information.Version.Major >= 9)
|
||||
{
|
||||
LoadSchemas();
|
||||
// FillSchemasGrid();
|
||||
}
|
||||
else
|
||||
{
|
||||
// panelSchema.Enabled = false;
|
||||
}
|
||||
|
||||
LoadMembership();
|
||||
// InitializeMembershipGridColumns();
|
||||
// FillMembershipGrid();
|
||||
|
||||
if (this.IsPropertiesMode == true)
|
||||
{
|
||||
// initialize from enumerator in properties mode
|
||||
System.Diagnostics.Debug.Assert(this.dbroleName!=null);
|
||||
System.Diagnostics.Debug.Assert(this.dbroleName.Trim().Length !=0);
|
||||
System.Diagnostics.Debug.Assert(this.dbroleUrn!=null);
|
||||
System.Diagnostics.Debug.Assert(this.dbroleUrn.Trim().Length != 0);
|
||||
|
||||
// this.textBoxDbRoleName.Text = this.dbroleName;
|
||||
|
||||
Enumerator en = new Enumerator();
|
||||
Request req = new Request();
|
||||
req.Fields = new String [] {DatabaseRoleGeneral.ownerField};
|
||||
|
||||
if ((this.dbroleUrn!=null) && (this.dbroleUrn.Trim().Length != 0))
|
||||
{
|
||||
req.Urn = this.dbroleUrn;
|
||||
}
|
||||
else
|
||||
{
|
||||
req.Urn = "Server/Database[@Name='" + Urn.EscapeString(this.databaseName) + "']/Role[@Name='" + Urn.EscapeString(this.dbroleName) + "]";
|
||||
}
|
||||
|
||||
DataTable dt = en.Process(serverConnection,req);
|
||||
System.Diagnostics.Debug.Assert(dt!=null);
|
||||
System.Diagnostics.Debug.Assert(dt.Rows.Count==1);
|
||||
|
||||
if (dt.Rows.Count==0)
|
||||
{
|
||||
throw new Exception("DatabaseRoleSR.ErrorDbRoleNotFound");
|
||||
}
|
||||
|
||||
DataRow dr = dt.Rows[0];
|
||||
this.initialOwner = Convert.ToString(dr[DatabaseRoleGeneral.ownerField],System.Globalization.CultureInfo.InvariantCulture);
|
||||
// this.textBoxOwner.Text = this.initialOwner;
|
||||
}
|
||||
else
|
||||
{
|
||||
// initialize with empty values in create new mode
|
||||
// this.textBoxDbRoleName.Text = String.Empty;
|
||||
// this.textBoxOwner.Text = String.Empty;
|
||||
}
|
||||
|
||||
// update UI enable/disable controls
|
||||
// EnableDisableControls();
|
||||
}
|
||||
|
||||
|
||||
// public override void OnGatherUiInformation(RunType runType)
|
||||
// {
|
||||
// base.OnGatherUiInformation(runType);
|
||||
|
||||
// this.ownerName = this.textBoxOwner.Text;
|
||||
// this.roleName = this.textBoxDbRoleName.Text;
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// SendDataToServer
|
||||
///
|
||||
/// here we talk with server via smo and do the actual data changing
|
||||
/// </summary>
|
||||
private void SendDataToServer()
|
||||
{
|
||||
// STrace.Params(ComponentName, "SendDataToServer", "", null);
|
||||
|
||||
// STrace.Assert(this.databaseName != null && this.databaseName.Trim().Length != 0, "database name is empty");
|
||||
// STrace.Assert(this.DataContainer.Server != null, "server is null");
|
||||
|
||||
Database database = this.dataContainer.Server.Databases[this.databaseName];
|
||||
// STrace.Assert(database!= null, "database is null");
|
||||
|
||||
DatabaseRole role = null;
|
||||
|
||||
if (this.IsPropertiesMode == true) // in properties mode -> alter role
|
||||
{
|
||||
// STrace.Assert(this.dbroleName != null && this.dbroleName.Trim().Length != 0, "role name is empty");
|
||||
|
||||
role = database.Roles[this.dbroleName];
|
||||
// STrace.Assert(role != null, "role is null");
|
||||
|
||||
if (0 != String.Compare(this.ownerName, this.initialOwner, StringComparison.Ordinal))
|
||||
{
|
||||
role.Owner = this.ownerName;
|
||||
role.Alter();
|
||||
}
|
||||
}
|
||||
else // not in properties mode -> create role
|
||||
{
|
||||
role = new DatabaseRole(database, this.roleName);
|
||||
if (this.ownerName.Length != 0)
|
||||
{
|
||||
role.Owner = this.ownerName;
|
||||
}
|
||||
|
||||
role.Create();
|
||||
}
|
||||
|
||||
SendToServerSchemaOwnershipChanges(database, role);
|
||||
SendToServerMembershipChanges(database, role);
|
||||
|
||||
this.dataContainer.ObjectName = role.Name;
|
||||
this.dataContainer.SqlDialogSubject = role; // needed by extended properties page
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
// #region Update UI enable/disable controls
|
||||
// private void EnableDisableControls()
|
||||
// {
|
||||
// if (this.DataContainer.Server.Information.Version.Major<9)
|
||||
// {
|
||||
// panelSchema.Enabled = false;
|
||||
// }
|
||||
|
||||
// if (this.IsPropertiesMode == true)
|
||||
// {
|
||||
// this.textBoxDbRoleName.Enabled = false;
|
||||
|
||||
// this.AllUIEnabled = true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.textBoxDbRoleName.Enabled = true;
|
||||
|
||||
// this.AllUIEnabled = (this.textBoxDbRoleName.Text.Trim().Length!=0);
|
||||
// }
|
||||
|
||||
// buttonRemove.Enabled = (gridRoleMembership.SelectedRow>=0);
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
// #region ISupportValidation Members
|
||||
|
||||
// bool ISupportValidation.Validate()
|
||||
// {
|
||||
// if (IsPropertiesMode == false)
|
||||
// {
|
||||
// if (this.textBoxDbRoleName.Text.Trim().Length==0)
|
||||
// {
|
||||
// System.Exception e = new System.Exception(DatabaseRoleSR.Error_SpecifyAName);
|
||||
// this.DisplayExceptionMessage(e);
|
||||
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
|
||||
// return true;
|
||||
// }
|
||||
|
||||
// #endregion
|
||||
|
||||
// #region Component Designer generated code
|
||||
// /// <summary>
|
||||
// /// Required method for Designer support - do not modify
|
||||
// /// the contents of this method with the code editor.
|
||||
// /// </summary>
|
||||
// private void InitializeComponent()
|
||||
// {
|
||||
// System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DatabaseRoleGeneral));
|
||||
// this.panelEntireUserControl = new System.Windows.Forms.Panel();
|
||||
// this.panelSchema = new System.Windows.Forms.Panel();
|
||||
// this.gridSchemasOwned = new Microsoft.SqlServer.Management.SqlManagerUI.SqlManagerUIDlgGrid();
|
||||
// this.labelSchemasOwnedByDbRole = new System.Windows.Forms.Label();
|
||||
// this.panelMembership = new System.Windows.Forms.Panel();
|
||||
// this.buttonRemove = new System.Windows.Forms.Button();
|
||||
// this.buttonAdd = new System.Windows.Forms.Button();
|
||||
// this.gridRoleMembership = new Microsoft.SqlServer.Management.SqlManagerUI.SqlManagerUIDlgGrid();
|
||||
// this.labelMembersOfDbRole = new System.Windows.Forms.Label();
|
||||
// this.panelDbRoleGeneralInfo = new System.Windows.Forms.Panel();
|
||||
// this.buttonSearchOwner = new System.Windows.Forms.Button();
|
||||
// this.textBoxOwner = new System.Windows.Forms.TextBox();
|
||||
// this.labelDbRoleOwner = new System.Windows.Forms.Label();
|
||||
// this.textBoxDbRoleName = new System.Windows.Forms.TextBox();
|
||||
// this.labelDbRoleName = new System.Windows.Forms.Label();
|
||||
// this.panelEntireUserControl.SuspendLayout();
|
||||
// this.panelSchema.SuspendLayout();
|
||||
// ((System.ComponentModel.ISupportInitialize)(this.gridSchemasOwned)).BeginInit();
|
||||
// this.panelMembership.SuspendLayout();
|
||||
// ((System.ComponentModel.ISupportInitialize)(this.gridRoleMembership)).BeginInit();
|
||||
// this.panelDbRoleGeneralInfo.SuspendLayout();
|
||||
// this.SuspendLayout();
|
||||
// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
// this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
// //
|
||||
// // panelEntireUserControl
|
||||
// //
|
||||
// this.panelEntireUserControl.Controls.Add(this.panelSchema);
|
||||
// this.panelEntireUserControl.Controls.Add(this.panelMembership);
|
||||
// this.panelEntireUserControl.Controls.Add(this.panelDbRoleGeneralInfo);
|
||||
// resources.ApplyResources(this.panelEntireUserControl, "panelEntireUserControl");
|
||||
// this.panelEntireUserControl.Name = "panelEntireUserControl";
|
||||
// //
|
||||
// // panelSchema
|
||||
// //
|
||||
// resources.ApplyResources(this.panelSchema, "panelSchema");
|
||||
// this.panelSchema.Controls.Add(this.gridSchemasOwned);
|
||||
// this.panelSchema.Controls.Add(this.labelSchemasOwnedByDbRole);
|
||||
// this.panelSchema.Name = "panelSchema";
|
||||
// //
|
||||
// // gridSchemasOwned
|
||||
// //
|
||||
// resources.ApplyResources(this.gridSchemasOwned, "gridSchemasOwned");
|
||||
// this.gridSchemasOwned.BackColor = System.Drawing.SystemColors.Window;
|
||||
// this.gridSchemasOwned.ForceEnabled = false;
|
||||
// this.gridSchemasOwned.Name = "gridSchemasOwned";
|
||||
// this.gridSchemasOwned.MouseButtonClicked += new Microsoft.SqlServer.Management.UI.Grid.MouseButtonClickedEventHandler(this.gridSchemasOwned_MouseButtonClicked);
|
||||
// //
|
||||
// // labelSchemasOwnedByDbRole
|
||||
// //
|
||||
// resources.ApplyResources(this.labelSchemasOwnedByDbRole, "labelSchemasOwnedByDbRole");
|
||||
// this.labelSchemasOwnedByDbRole.Name = "labelSchemasOwnedByDbRole";
|
||||
// //
|
||||
// // panelMembership
|
||||
// //
|
||||
// resources.ApplyResources(this.panelMembership, "panelMembership");
|
||||
// this.panelMembership.Controls.Add(this.buttonRemove);
|
||||
// this.panelMembership.Controls.Add(this.buttonAdd);
|
||||
// this.panelMembership.Controls.Add(this.gridRoleMembership);
|
||||
// this.panelMembership.Controls.Add(this.labelMembersOfDbRole);
|
||||
// this.panelMembership.Name = "panelMembership";
|
||||
// //
|
||||
// // buttonRemove
|
||||
// //
|
||||
// resources.ApplyResources(this.buttonRemove, "buttonRemove");
|
||||
// this.buttonRemove.Name = "buttonRemove";
|
||||
// this.buttonRemove.Click += new System.EventHandler(this.buttonRemove_Click);
|
||||
// //
|
||||
// // buttonAdd
|
||||
// //
|
||||
// resources.ApplyResources(this.buttonAdd, "buttonAdd");
|
||||
// this.buttonAdd.Name = "buttonAdd";
|
||||
// this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);
|
||||
// //
|
||||
// // gridRoleMembership
|
||||
// //
|
||||
// resources.ApplyResources(this.gridRoleMembership, "gridRoleMembership");
|
||||
// this.gridRoleMembership.BackColor = System.Drawing.SystemColors.Window;
|
||||
// this.gridRoleMembership.ForceEnabled = false;
|
||||
// this.gridRoleMembership.Name = "gridRoleMembership";
|
||||
// this.gridRoleMembership.SelectionChanged += new Microsoft.SqlServer.Management.UI.Grid.SelectionChangedEventHandler(this.gridRoleMembership_SelectionChanged);
|
||||
// //
|
||||
// // labelMembersOfDbRole
|
||||
// //
|
||||
// resources.ApplyResources(this.labelMembersOfDbRole, "labelMembersOfDbRole");
|
||||
// this.labelMembersOfDbRole.Name = "labelMembersOfDbRole";
|
||||
// //
|
||||
// // panelDbRoleGeneralInfo
|
||||
// //
|
||||
// resources.ApplyResources(this.panelDbRoleGeneralInfo, "panelDbRoleGeneralInfo");
|
||||
// this.panelDbRoleGeneralInfo.Controls.Add(this.buttonSearchOwner);
|
||||
// this.panelDbRoleGeneralInfo.Controls.Add(this.textBoxOwner);
|
||||
// this.panelDbRoleGeneralInfo.Controls.Add(this.labelDbRoleOwner);
|
||||
// this.panelDbRoleGeneralInfo.Controls.Add(this.textBoxDbRoleName);
|
||||
// this.panelDbRoleGeneralInfo.Controls.Add(this.labelDbRoleName);
|
||||
// this.panelDbRoleGeneralInfo.Name = "panelDbRoleGeneralInfo";
|
||||
// //
|
||||
// // buttonSearchOwner
|
||||
// //
|
||||
// resources.ApplyResources(this.buttonSearchOwner, "buttonSearchOwner");
|
||||
// this.buttonSearchOwner.Name = "buttonSearchOwner";
|
||||
// this.buttonSearchOwner.Click += new System.EventHandler(this.buttonSearchOwner_Click);
|
||||
// //
|
||||
// // textBoxOwner
|
||||
// //
|
||||
// resources.ApplyResources(this.textBoxOwner, "textBoxOwner");
|
||||
// this.textBoxOwner.Name = "textBoxOwner";
|
||||
// //
|
||||
// // labelDbRoleOwner
|
||||
// //
|
||||
// resources.ApplyResources(this.labelDbRoleOwner, "labelDbRoleOwner");
|
||||
// this.labelDbRoleOwner.Name = "labelDbRoleOwner";
|
||||
// //
|
||||
// // textBoxDbRoleName
|
||||
// //
|
||||
// resources.ApplyResources(this.textBoxDbRoleName, "textBoxDbRoleName");
|
||||
// this.textBoxDbRoleName.Name = "textBoxDbRoleName";
|
||||
// //
|
||||
// // labelDbRoleName
|
||||
// //
|
||||
// resources.ApplyResources(this.labelDbRoleName, "labelDbRoleName");
|
||||
// this.labelDbRoleName.Name = "labelDbRoleName";
|
||||
// //
|
||||
// // DatabaseRoleGeneral
|
||||
// //
|
||||
// this.Controls.Add(this.panelEntireUserControl);
|
||||
// this.Name = "DatabaseRoleGeneral";
|
||||
// resources.ApplyResources(this, "$this");
|
||||
// this.panelEntireUserControl.ResumeLayout(false);
|
||||
// this.panelSchema.ResumeLayout(false);
|
||||
// ((System.ComponentModel.ISupportInitialize)(this.gridSchemasOwned)).EndInit();
|
||||
// this.panelMembership.ResumeLayout(false);
|
||||
// ((System.ComponentModel.ISupportInitialize)(this.gridRoleMembership)).EndInit();
|
||||
// this.panelDbRoleGeneralInfo.ResumeLayout(false);
|
||||
// this.panelDbRoleGeneralInfo.PerformLayout();
|
||||
// this.ResumeLayout(false);
|
||||
|
||||
// }
|
||||
// #endregion
|
||||
|
||||
#region Schemas - general operations with ...
|
||||
/// <summary>
|
||||
/// loads initial schemas from server together with information about the schema owner
|
||||
/// </summary>
|
||||
private void LoadSchemas()
|
||||
{
|
||||
this.schemaOwnership = new HybridDictionary();
|
||||
|
||||
Enumerator en = new Enumerator();
|
||||
Request req = new Request();
|
||||
req.Fields = new String [] {DatabaseRoleGeneral.schemaNameField, DatabaseRoleGeneral.schemaOwnerField};
|
||||
req.Urn = "Server/Database[@Name='" + Urn.EscapeString(this.databaseName) + "']/Schema";
|
||||
|
||||
DataTable dt = en.Process(serverConnection,req);
|
||||
// STrace.Assert((dt != null) && (0 < dt.Rows.Count), "enumerator did not return schemas");
|
||||
// STrace.Assert(!this.IsPropertiesMode || (this.dbroleName.Length != 0), "role name is not known");
|
||||
|
||||
foreach (DataRow dr in dt.Rows)
|
||||
{
|
||||
string schemaName = Convert.ToString(dr[DatabaseRoleGeneral.schemaNameField],System.Globalization.CultureInfo.InvariantCulture);
|
||||
string schemaOwner = Convert.ToString(dr[DatabaseRoleGeneral.schemaOwnerField],System.Globalization.CultureInfo.InvariantCulture);
|
||||
bool roleOwnsSchema =
|
||||
this.IsPropertiesMode &&
|
||||
(0 == String.Compare(this.dbroleName, schemaOwner, StringComparison.Ordinal));
|
||||
|
||||
this.schemaOwnership[schemaName] = new SchemaOwnership(roleOwnsSchema);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// initializes the columns and headers of schema grid - but doesnt populate grid with any data
|
||||
/// </summary>
|
||||
// private void InitializeSchemasGridColumns()
|
||||
// {
|
||||
// Microsoft.SqlServer.Management.UI.Grid.DlgGridControl grid = this.gridSchemasOwned;
|
||||
|
||||
// if (grid.RowsNumber != 0)
|
||||
// {
|
||||
// grid.DeleteAllRows();
|
||||
// }
|
||||
|
||||
// while (grid.ColumnsNumber != 0)
|
||||
// {
|
||||
// grid.DeleteColumn(0);
|
||||
// }
|
||||
|
||||
// GridColumnInfo colInfo = null;
|
||||
|
||||
// // checkbox owned/not-owned
|
||||
// colInfo = new GridColumnInfo();
|
||||
// colInfo.ColumnWidth = sizeCheckboxColumn;
|
||||
// colInfo.WidthType = GridColumnWidthType.InPixels;
|
||||
// colInfo.ColumnType = GridColumnType.Checkbox;
|
||||
// grid.AddColumn(colInfo);
|
||||
|
||||
// // schema name
|
||||
// colInfo = new GridColumnInfo();
|
||||
// colInfo.ColumnWidth = grid.Width - sizeCheckboxColumn - 2;
|
||||
// colInfo.WidthType = GridColumnWidthType.InPixels;
|
||||
// grid.AddColumn(colInfo);
|
||||
|
||||
// grid.SetHeaderInfo(colSchemasOwnedSchemas, DatabaseRoleSR.HeaderOwnedSchemas, null);
|
||||
|
||||
// grid.SelectionType = GridSelectionType.SingleRow;
|
||||
// grid.UpdateGrid();
|
||||
// }
|
||||
|
||||
// private void FillSchemasGrid()
|
||||
// {
|
||||
// Microsoft.SqlServer.Management.UI.Grid.DlgGridControl grid = this.gridSchemasOwned;
|
||||
|
||||
// grid.BeginInit();
|
||||
// grid.DeleteAllRows();
|
||||
|
||||
// IDictionaryEnumerator enumerator = this.schemaOwnership.GetEnumerator();
|
||||
// enumerator.Reset();
|
||||
// while (enumerator.MoveNext())
|
||||
// {
|
||||
// DictionaryEntry entry = enumerator.Entry;
|
||||
// GridCellCollection row = new GridCellCollection();
|
||||
// GridCell cell = null;
|
||||
|
||||
// string schemaName = entry.Key.ToString();
|
||||
// bool roleCurrentlyOwnsSchema = ((SchemaOwnership)entry.Value).currentlyOwned;
|
||||
|
||||
// // grid is filled either
|
||||
// // a) disabled-checked checkboxes: Indeterminate - if already owning schema - we cannot renounce ownership
|
||||
// // b) enabled-unchecked checkboxes: Unchecked - user can check / uncheck them and we read final state
|
||||
// cell = new GridCell(roleCurrentlyOwnsSchema ? GridCheckBoxState.Indeterminate : GridCheckBoxState.Unchecked);
|
||||
// row.Add(cell);
|
||||
|
||||
// cell = new GridCell(schemaName);
|
||||
// row.Add(cell);
|
||||
|
||||
// grid.AddRow(row);
|
||||
// }
|
||||
|
||||
// grid.EndInit();
|
||||
|
||||
// if (grid.RowsNumber > 0)
|
||||
// {
|
||||
// grid.SelectedRow = 0;
|
||||
// }
|
||||
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// sends to server changes related to schema ownership
|
||||
/// </summary>
|
||||
private void SendToServerSchemaOwnershipChanges(Database db, DatabaseRole dbrole)
|
||||
{
|
||||
if (9 <= this.dataContainer.Server.Information.Version.Major)
|
||||
{
|
||||
IDictionaryEnumerator enumerator = this.schemaOwnership.GetEnumerator();
|
||||
enumerator.Reset();
|
||||
while (enumerator.MoveNext())
|
||||
{
|
||||
DictionaryEntry de = enumerator.Entry;
|
||||
string schemaName = de.Key.ToString();
|
||||
SchemaOwnership ownership = (SchemaOwnership)de.Value;
|
||||
|
||||
// If we are creating a new role, then no schema will have been initially owned by this role.
|
||||
// If we are modifying an existing role, we can only take ownership of roles. (Ownership can't
|
||||
// be renounced, it can only be positively assigned to a principal.)
|
||||
if (ownership.currentlyOwned && !ownership.initiallyOwned)
|
||||
{
|
||||
Schema schema = db.Schemas[schemaName];
|
||||
schema.Owner = dbrole.Name;
|
||||
schema.Alter();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// private void gridSchemasOwned_MouseButtonClicked(object sender, Microsoft.SqlServer.Management.UI.Grid.MouseButtonClickedEventArgs args)
|
||||
// {
|
||||
// if ((args.Button == MouseButtons.Left) &&
|
||||
// (colSchemasChecked == args.ColumnIndex))
|
||||
// {
|
||||
// int row = (int) args.RowIndex;
|
||||
// string schemaName = this.gridSchemasOwned.GetCellInfo(row, colSchemasOwnedSchemas).CellData.ToString();
|
||||
// GridCheckBoxState newState = this.FlipCheckbox(this.gridSchemasOwned, row, colSchemasChecked);
|
||||
// bool nowOwned = ((GridCheckBoxState.Checked == newState) || (GridCheckBoxState.Indeterminate == newState));
|
||||
|
||||
// ((SchemaOwnership) this.schemaOwnership[schemaName]).currentlyOwned = nowOwned;
|
||||
// }
|
||||
// }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Membership - general operations with ...
|
||||
|
||||
/// <summary>
|
||||
/// loads from server initial membership information
|
||||
/// </summary>
|
||||
private void LoadMembership()
|
||||
{
|
||||
this.roleMembers = new HybridDictionary();
|
||||
|
||||
if (this.IsPropertiesMode)
|
||||
{
|
||||
Enumerator enumerator = new Enumerator();
|
||||
Urn urn = String.Format(System.Globalization.CultureInfo.InvariantCulture,
|
||||
"Server/Database[@Name='{0}']/Role[@Name='{1}']/Member",
|
||||
Urn.EscapeString(this.databaseName),
|
||||
Urn.EscapeString(this.dbroleName));
|
||||
string[] fields = new string[] { DatabaseRoleGeneral.memberNameField};
|
||||
OrderBy[] orderBy = new OrderBy[] { new OrderBy(DatabaseRoleGeneral.memberNameField, OrderBy.Direction.Asc)};
|
||||
Request request = new Request(urn, fields, orderBy);
|
||||
DataTable dt = enumerator.Process(this.serverConnection, request);
|
||||
|
||||
foreach (DataRow dr in dt.Rows)
|
||||
{
|
||||
string memberName = dr[DatabaseRoleGeneral.memberNameField].ToString();
|
||||
this.roleMembers[memberName] = new RoleMembership(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// initialize grid column headers, but not the content
|
||||
/// </summary>
|
||||
// private void InitializeMembershipGridColumns()
|
||||
// {
|
||||
// Microsoft.SqlServer.Management.UI.Grid.DlgGridControl grid = this.gridRoleMembership;
|
||||
|
||||
// if (grid.RowsNumber != 0)
|
||||
// {
|
||||
// grid.DeleteAllRows();
|
||||
// }
|
||||
|
||||
// while (grid.ColumnsNumber != 0)
|
||||
// {
|
||||
// grid.DeleteColumn(0);
|
||||
// }
|
||||
|
||||
// GridColumnInfo colInfo = null;
|
||||
|
||||
// // bitmap member type
|
||||
// colInfo = new GridColumnInfo();
|
||||
// colInfo.ColumnWidth = sizeBitmapColumn;
|
||||
// colInfo.WidthType = GridColumnWidthType.InPixels;
|
||||
// colInfo.ColumnType = GridColumnType.Bitmap;
|
||||
// grid.AddColumn(colInfo);
|
||||
|
||||
// // member name
|
||||
// colInfo = new GridColumnInfo();
|
||||
// colInfo.ColumnWidth = grid.Width - sizeBitmapColumn - 2;
|
||||
// colInfo.WidthType = GridColumnWidthType.InPixels;
|
||||
// grid.AddColumn(colInfo);
|
||||
|
||||
// grid.SetHeaderInfo(colMembershipRoleMembers, DatabaseRoleSR.HeaderRoleMembers, null);
|
||||
|
||||
// grid.SelectionType = GridSelectionType.SingleRow;
|
||||
// grid.UpdateGrid();
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// fills the membership grid with data (bitmaps, names, etc)
|
||||
/// </summary>
|
||||
// private void FillMembershipGrid()
|
||||
// {
|
||||
// Microsoft.SqlServer.Management.UI.Grid.DlgGridControl grid = this.gridRoleMembership;
|
||||
|
||||
// grid.BeginInit();
|
||||
// grid.DeleteAllRows();
|
||||
|
||||
// IDictionaryEnumerator enumerator = this.roleMembers.GetEnumerator();
|
||||
// enumerator.Reset();
|
||||
// while (enumerator.MoveNext())
|
||||
// {
|
||||
// DictionaryEntry entry = enumerator.Entry;
|
||||
// string memberName = entry.Key.ToString();
|
||||
// RoleMembership membership = (RoleMembership) entry.Value;
|
||||
|
||||
// if (membership.currentlyAMember)
|
||||
// {
|
||||
// GridCellCollection row = new GridCellCollection();
|
||||
// GridCell cell = null;
|
||||
|
||||
// cell = new GridCell(bitmapMember);
|
||||
// row.Add(cell);
|
||||
|
||||
// cell = new GridCell(memberName);
|
||||
// row.Add(cell);
|
||||
|
||||
// grid.AddRow(row);
|
||||
// }
|
||||
// }
|
||||
|
||||
// grid.EndInit();
|
||||
|
||||
// if (grid.RowsNumber > 0)
|
||||
// {
|
||||
// grid.SelectedRow = 0;
|
||||
// }
|
||||
// }
|
||||
|
||||
/// <summary>
|
||||
/// sends to server user changes related to membership
|
||||
/// </summary>
|
||||
private void SendToServerMembershipChanges(Database db, DatabaseRole dbrole)
|
||||
{
|
||||
IDictionaryEnumerator enumerator = this.roleMembers.GetEnumerator();
|
||||
enumerator.Reset();
|
||||
|
||||
while (enumerator.MoveNext())
|
||||
{
|
||||
DictionaryEntry entry = enumerator.Entry;
|
||||
string memberName = entry.Key.ToString();
|
||||
RoleMembership membership = (RoleMembership) entry.Value;
|
||||
|
||||
if (!membership.initiallyAMember && membership.currentlyAMember)
|
||||
{
|
||||
dbrole.AddMember(memberName);
|
||||
}
|
||||
else if (membership.initiallyAMember && !membership.currentlyAMember)
|
||||
{
|
||||
dbrole.DropMember(memberName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// private void gridRoleMembership_SelectionChanged(object sender, Microsoft.SqlServer.Management.UI.Grid.SelectionChangedEventArgs args)
|
||||
// {
|
||||
// EnableDisableControls();
|
||||
// }
|
||||
|
||||
// private void buttonAdd_Click(object sender, System.EventArgs e)
|
||||
// {
|
||||
|
||||
// using (SqlObjectSearch dlg = new SqlObjectSearch(
|
||||
// this.Font,
|
||||
// iconSearchRolesAndUsers,
|
||||
// this.HelpProvider,
|
||||
// DatabaseRoleSR.Add_DialogTitle,
|
||||
// this.DataContainer.ConnectionInfo,
|
||||
// this.databaseName,
|
||||
// new SearchableObjectTypeCollection(SearchableObjectType.User, SearchableObjectType.DatabaseRole),
|
||||
// new SearchableObjectTypeCollection(SearchableObjectType.User, SearchableObjectType.DatabaseRole),
|
||||
// false))
|
||||
// {
|
||||
// if (DialogResult.OK == dlg.ShowDialog(this.FindForm()))
|
||||
// {
|
||||
// bool memberAdded = false;
|
||||
|
||||
// this.gridRoleMembership.BeginInit();
|
||||
|
||||
// foreach (SearchableObject principal in dlg.SearchResults)
|
||||
// {
|
||||
// if (!this.roleMembers.Contains(principal.Name))
|
||||
// {
|
||||
// this.roleMembers[principal.Name] = new RoleMembership(false, true);
|
||||
// memberAdded = true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// RoleMembership membership = (RoleMembership) this.roleMembers[principal.Name];
|
||||
|
||||
// if (!membership.currentlyAMember)
|
||||
// {
|
||||
// membership.currentlyAMember = true;
|
||||
// memberAdded = true;
|
||||
// }
|
||||
// }
|
||||
|
||||
// if (memberAdded)
|
||||
// {
|
||||
// GridCellCollection row = new GridCellCollection();
|
||||
// GridCell cell = null;
|
||||
|
||||
// cell = new GridCell(bitmapMember);
|
||||
// row.Add(cell);
|
||||
|
||||
// cell = new GridCell(principal.Name);
|
||||
// row.Add(cell);
|
||||
|
||||
// this.gridRoleMembership.AddRow(row);
|
||||
// }
|
||||
// }
|
||||
|
||||
// this.gridRoleMembership.EndInit();
|
||||
|
||||
// if (memberAdded)
|
||||
// {
|
||||
// this.gridRoleMembership.SelectedRow = this.gridRoleMembership.RowsNumber - 1;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// private void buttonRemove_Click(object sender, System.EventArgs e)
|
||||
// {
|
||||
// DlgGridControl grid = this.gridRoleMembership;
|
||||
|
||||
// int row = this.gridRoleMembership.SelectedRow;
|
||||
// STrace.Assert(0 <= row, "unexpected row number");
|
||||
|
||||
// if (0 <= row)
|
||||
// {
|
||||
// string memberName = this.gridRoleMembership.GetCellInfo(row, colMembershipRoleMembers).CellData.ToString();
|
||||
// RoleMembership membership = (RoleMembership) this.roleMembers[memberName];
|
||||
|
||||
// if (membership.initiallyAMember)
|
||||
// {
|
||||
// membership.currentlyAMember = false;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// this.roleMembers.Remove(memberName);
|
||||
// }
|
||||
|
||||
// this.gridRoleMembership.DeleteRow(row);
|
||||
// }
|
||||
// }
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
212
src/Microsoft.SqlTools.ServiceLayer/Security/NetStandardUtils.cs
Normal file
212
src/Microsoft.SqlTools.ServiceLayer/Security/NetStandardUtils.cs
Normal file
@@ -0,0 +1,212 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
#nullable disable
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using SMO = Microsoft.SqlServer.Management.Smo;
|
||||
using Microsoft.SqlServer.Management.Common;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.Security
|
||||
{
|
||||
/// <summary>
|
||||
/// NetStandard compatible helpers
|
||||
/// </summary>
|
||||
#if NETCOREAPP2_0
|
||||
public class Utils
|
||||
#else
|
||||
internal partial class Utils
|
||||
#endif
|
||||
{
|
||||
private Utils() { }
|
||||
|
||||
public static bool IsKatmaiOrLater(int version)
|
||||
{
|
||||
return (10 <= version);
|
||||
}
|
||||
|
||||
public static bool IsKjOrLater(ServerVersion version)
|
||||
{
|
||||
return (version.Major > 10
|
||||
|| (version.Major == 10 && version.Minor >= 50));
|
||||
}
|
||||
|
||||
public static bool IsSql11OrLater(ServerVersion version)
|
||||
{
|
||||
return IsSql11OrLater(version.Major);
|
||||
}
|
||||
|
||||
public static bool IsSql11OrLater(int versionMajor)
|
||||
{
|
||||
return (versionMajor >= 11);
|
||||
}
|
||||
|
||||
public static bool IsSql12OrLater(ServerVersion version)
|
||||
{
|
||||
return IsSql12OrLater(version.Major);
|
||||
}
|
||||
|
||||
public static bool IsSql12OrLater(int versionMajor)
|
||||
{
|
||||
return (versionMajor >= 12);
|
||||
}
|
||||
|
||||
public static bool IsSql13OrLater(ServerVersion version)
|
||||
{
|
||||
return IsSql13OrLater(version.Major);
|
||||
}
|
||||
|
||||
public static bool IsSql13OrLater(int versionMajor)
|
||||
{
|
||||
return (versionMajor >= 13);
|
||||
}
|
||||
|
||||
public static bool IsSql14OrLater(ServerVersion version)
|
||||
{
|
||||
return IsSql14OrLater(version.Major);
|
||||
}
|
||||
|
||||
public static bool IsSql14OrLater(int versionMajor)
|
||||
{
|
||||
return (versionMajor >= 14);
|
||||
}
|
||||
|
||||
public static bool IsSql15OrLater(ServerVersion version)
|
||||
{
|
||||
return IsSql15OrLater(version.Major);
|
||||
}
|
||||
|
||||
public static bool IsSql15OrLater(int versionMajor)
|
||||
{
|
||||
return (versionMajor >= 15);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Check if the version is SQL 2019 CU4 or later.
|
||||
/// </summary>
|
||||
/// <param name="version"></param>
|
||||
/// <returns></returns>
|
||||
/// <remarks>
|
||||
/// SQL2019 CU3 is going to be 4023; CU4 is going to be 4033
|
||||
/// SQL2019 CU4 (before the snap to the release branch) is 4028.
|
||||
/// </remarks>
|
||||
public static bool IsSql15OCU4OrLater(Version version)
|
||||
{
|
||||
return(version >= new Version(15, 0, 4028));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if the version is SQL 2016 SP1 or later.
|
||||
/// </summary>
|
||||
/// <param name="version"></param>
|
||||
/// <returns>true if the version is SQL 2016 SP1 or later, false otherwise</returns>
|
||||
public static bool IsSql13SP1OrLater(Version version)
|
||||
{
|
||||
return (version >= new Version(13, 0, 3510));
|
||||
}
|
||||
|
||||
public static bool IsXTPSupportedOnServer(SMO.Server server)
|
||||
{
|
||||
if(server.DatabaseEngineEdition == DatabaseEngineEdition.SqlOnDemand)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool isXTPSupported = false;
|
||||
|
||||
if (server.ConnectionContext.ExecuteScalar("SELECT SERVERPROPERTY('IsXTPSupported')") != DBNull.Value)
|
||||
{
|
||||
isXTPSupported = server.IsXTPSupported;
|
||||
}
|
||||
|
||||
return isXTPSupported;
|
||||
}
|
||||
|
||||
public static bool IsPolybasedInstalledOnServer(SMO.Server server)
|
||||
{
|
||||
bool isPolybaseInstalled = false;
|
||||
|
||||
if (server.IsSupportedProperty("IsPolyBaseInstalled"))
|
||||
{
|
||||
isPolybaseInstalled = server.IsPolyBaseInstalled;
|
||||
}
|
||||
|
||||
return isPolybaseInstalled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if current user has given permission on given server.
|
||||
/// </summary>
|
||||
/// <param name="server"></param>
|
||||
/// <param name="permissionName"></param>
|
||||
/// <returns></returns>
|
||||
public static bool HasPermissionOnServer(SMO.Server server, string permissionName)
|
||||
{
|
||||
return Convert.ToBoolean(server.ConnectionContext.ExecuteScalar(
|
||||
string.Format(CultureInfo.InvariantCulture,
|
||||
"SELECT HAS_PERMS_BY_NAME(null, null, '{0}');",
|
||||
permissionName)));
|
||||
}
|
||||
|
||||
public static bool FilestreamEnabled(SMO.Server svr)
|
||||
{
|
||||
bool result = false;
|
||||
if (svr != null)
|
||||
{
|
||||
if (IsKatmaiOrLater(svr.Information.Version.Major)
|
||||
&& svr.ServerType != DatabaseEngineType.SqlAzureDatabase) //Azure doesn't support filestream
|
||||
{
|
||||
if (svr.Configuration.FilestreamAccessLevel.RunValue != 0)
|
||||
{
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static bool IsYukonOrAbove(SMO.Server server)
|
||||
{
|
||||
return server.Version.Major >= 9;
|
||||
}
|
||||
|
||||
public static bool IsBelowYukon(SMO.Server server)
|
||||
{
|
||||
return server.Version.Major < 9;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Some calendars, such as the UmAlQuraCalendar, support an upper date range that is earlier than MaxValue.
|
||||
/// In these cases, trying to access MaxValue in variable assignments or formatting and parsing operations can throw
|
||||
/// an ArgumentOutOfRangeException. Rather than retrieving the value of DateTime.MaxValue, you can retrieve the value
|
||||
/// of the specified culture's latest valid date value from the
|
||||
/// System.Globalization.CultureInfo.DateTimeFormat.Calendar.MaxSupportedDateTime property.
|
||||
/// http://msdn.microsoft.com/en-us/library/system.datetime.maxvalue(v=VS.90).aspx
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static DateTime GetMaxCultureDateTime()
|
||||
{
|
||||
CultureInfo currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
|
||||
return currentCulture.DateTimeFormat.Calendar.MaxSupportedDateTime;
|
||||
}
|
||||
|
||||
public static string MakeSqlBracket(string s)
|
||||
{
|
||||
return "[" + s.Replace("]", "]]") + "]";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns whether the server is in AS Azure
|
||||
/// </summary>
|
||||
/// <param name="serverName"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsASAzure(string serverName)
|
||||
{
|
||||
return !string.IsNullOrEmpty(serverName) && serverName.StartsWith("asazure://", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
}
|
||||
10876
src/Microsoft.SqlTools.ServiceLayer/Security/PermissionsData.cs
Normal file
10876
src/Microsoft.SqlTools.ServiceLayer/Security/PermissionsData.cs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,50 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
#nullable disable
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Microsoft.SqlServer.Management.Common;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.Security
|
||||
{
|
||||
internal static class PermissionsDataExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Whether this SecurableType is a valid Schema-Scoped Securable for the given server version, engine edition and engine type
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="serverVersion"></param>
|
||||
/// <param name="databaseEngineEdition"></param>
|
||||
/// <param name="databaseEngineType"></param>
|
||||
/// <returns></returns>
|
||||
public static bool IsValidSchemaBoundSecurable(this SecurableType type, ServerVersion serverVersion, DatabaseEngineEdition databaseEngineEdition, DatabaseEngineType databaseEngineType)
|
||||
{
|
||||
return
|
||||
type.GetType().GetField(type.ToString())
|
||||
.GetCustomAttributes(typeof (SchemaScopedSecurableAttribute), true)
|
||||
.Cast<SchemaScopedSecurableAttribute>()
|
||||
.Any(attr => attr.IsValid(serverVersion, databaseEngineType, databaseEngineEdition));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the Schema-Scoped URN for this SecurableType
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="schema"></param>
|
||||
/// <param name="databaseName"></param>
|
||||
/// <returns></returns>
|
||||
public static string GetSchemaScopedUrn(this SecurableType type, string schema, string databaseName)
|
||||
{
|
||||
SchemaScopedSecurableAttribute attr =
|
||||
type.GetType().GetField(type.ToString())
|
||||
.GetCustomAttributes(typeof (SchemaScopedSecurableAttribute), true)
|
||||
.Cast<SchemaScopedSecurableAttribute>()
|
||||
.FirstOrDefault() ?? throw new InvalidOperationException("Type {0} did not define a SchemaScopedSecurableUrn attribute");
|
||||
return attr.GetUrn(schema, databaseName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
//
|
||||
// Copyright (c) Microsoft. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
//
|
||||
|
||||
#nullable disable
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Microsoft.SqlServer.Management.Common;
|
||||
using Microsoft.SqlServer.Management.Sdk.Sfc;
|
||||
using Microsoft.SqlServer.Management.Smo;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.Security
|
||||
{
|
||||
/// <summary>
|
||||
/// An attribute for sqlmgmt\src\permissionsdata.cs!SecurableType that maps it to the corresponding SMO
|
||||
/// type. This allows us to use that type to decide whether that securable is valid for a given server
|
||||
/// version/engine edition/engine type combo and to get the URN suffix value for that type using SMO
|
||||
/// instead of duplicating it in SqlMgmt.
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Field)]
|
||||
internal class SchemaScopedSecurableAttribute : Attribute
|
||||
{
|
||||
private readonly Type _smoType;
|
||||
private readonly string _urnSuffix;
|
||||
private readonly string _additionalParam;
|
||||
|
||||
/// <summary>
|
||||
/// Basic public constructor
|
||||
/// </summary>
|
||||
/// <param name="smoType">The SMO Type this Securable is mapped to</param>
|
||||
/// <param name="additionalParamName">(Optional) The name of an additional param</param>
|
||||
/// <param name="additionalParamValue">(Optional) The value of an additional param</param>
|
||||
public SchemaScopedSecurableAttribute(Type smoType, string additionalParamName = "", object additionalParamValue = null )
|
||||
{
|
||||
_smoType = smoType;
|
||||
//The additional param is optional - just ignore if we don't have a valid name
|
||||
_additionalParam = string.IsNullOrEmpty(additionalParamName)
|
||||
? String.Empty
|
||||
: string.Format("@{0}='{1}'", additionalParamName, Urn.EscapeString(additionalParamValue.ToString()));
|
||||
PropertyInfo urnSuffixProperty = _smoType.GetProperty("UrnSuffix", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) ?? throw new InvalidArgumentException(string.Format("Type {0} did not have expected UrnSuffix property defined", smoType.Name));
|
||||
_urnSuffix = urnSuffixProperty.GetValue(null, null).ToString();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The SMO Type that this securable is mapped to
|
||||
/// </summary>
|
||||
public Type SmoType
|
||||
{
|
||||
get { return _smoType; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Whether this Securable is valid for the given server version/engine type/engine edition combo.
|
||||
/// </summary>
|
||||
/// <param name="serverVersion"></param>
|
||||
/// <param name="databaseEngineType"></param>
|
||||
/// <param name="databaseEngineEdition"></param>
|
||||
/// <returns></returns>
|
||||
public bool IsValid(ServerVersion serverVersion, DatabaseEngineType databaseEngineType, DatabaseEngineEdition databaseEngineEdition)
|
||||
{
|
||||
return SmoUtility.IsSupportedObject(_smoType, serverVersion, databaseEngineType, databaseEngineEdition);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Builds the URN for this Securable using the specified schema name (with optional database name for db-scoped securables)
|
||||
/// </summary>
|
||||
/// <param name="schemaName"></param>
|
||||
/// <param name="databaseName"></param>
|
||||
/// <returns></returns>
|
||||
public string GetUrn(string schemaName, string databaseName = "")
|
||||
{
|
||||
StringBuilder urn = new StringBuilder("Server");
|
||||
if (!string.IsNullOrEmpty(databaseName))
|
||||
{
|
||||
urn.AppendFormat("/Database[@Name='{0}']", Urn.EscapeString(databaseName));
|
||||
}
|
||||
urn.AppendFormat("/{0}[{1}{2}@Schema='{3}']",
|
||||
_urnSuffix,
|
||||
_additionalParam,
|
||||
string.IsNullOrEmpty(_additionalParam) ? string.Empty : " and ",
|
||||
Urn.EscapeString(schemaName));
|
||||
return urn.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
2328
src/Microsoft.SqlTools.ServiceLayer/Security/SqlObjectSearchData.cs
Normal file
2328
src/Microsoft.SqlTools.ServiceLayer/Security/SqlObjectSearchData.cs
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user