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:
Hai Cao
2023-04-06 10:17:46 -07:00
committed by GitHub
parent 319af30665
commit 9b08993753
11 changed files with 17986 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -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>

View File

@@ -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

View File

@@ -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>

File diff suppressed because it is too large Load Diff

View File

@@ -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
}
}

View 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);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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);
}
}
}

View File

@@ -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();
}
}
}

File diff suppressed because it is too large Load Diff