This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 4abf015  Add SQLServer GRANT Statement (#15804)
4abf015 is described below

commit 4abf01539d0759c12de9f028c2dbc3ad90014c24
Author: Thanoshan MV <[email protected]>
AuthorDate: Sat Mar 5 15:03:35 2022 +0530

    Add SQLServer GRANT Statement (#15804)
    
    * add initial grammar of SQLServer GRANT statement
    
    * add SQLServer GRANT statement
---
 .../main/antlr4/imports/sqlserver/DCLStatement.g4  | 187 ++++++++++++++++-----
 .../antlr4/imports/sqlserver/SQLServerKeyword.g4   |  20 +++
 .../impl/SQLServerDCLStatementSQLVisitor.java      |  57 ++++++-
 .../sqlserver/dcl/SQLServerGrantStatement.java     |   8 +
 .../asserts/segment/column/ColumnAssert.java       |  21 +++
 .../statement/dcl/impl/GrantStatementAssert.java   |   4 +
 .../SQLServerGrantStatementAssert.java}            |  27 +--
 .../statement/dcl/GrantStatementTestCase.java      |   4 +
 .../src/main/resources/case/dcl/grant.xml          |  54 ++++++
 .../resources/sql/supported/dcl/grant-user.xml     |  31 +++-
 10 files changed, 352 insertions(+), 61 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
index 0d25858..2ebb27a52f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
@@ -20,7 +20,39 @@ grammar DCLStatement;
 import BaseRule;
 
 grant
-    : GRANT (classPrivilegesClause | classTypePrivilegesClause | roleClause)
+    : GRANT (grantClassPrivilegesClause | grantClassTypePrivilegesClause)
+    ;
+
+grantClassPrivilegesClause
+    : grantClassPrivileges (ON grantOnClassClause)? TO principal (COMMA_ 
principal)* (WITH GRANT OPTION)? (AS principal)?
+    ;
+
+grantClassTypePrivilegesClause
+    : grantClassTypePrivileges (ON grantOnClassTypeClause)? TO principal 
(COMMA_ principal)* (WITH GRANT OPTION)?
+    ;
+
+grantClassPrivileges
+    : privilegeType columnNames? (COMMA_ privilegeType columnNames?)*
+    ;
+
+grantOnClassClause
+    : (classItem COLON_ COLON_)? securable
+    ;
+
+grantClassTypePrivileges
+    : privilegeType (COMMA_ privilegeType)*
+    ;
+
+grantOnClassTypeClause
+    : (grantClassType COLON_ COLON_)? securable
+    ;
+
+securable
+    : (owner DOT_)? name
+    ;
+
+principal
+    : userName
     ;
 
 revoke
@@ -61,95 +93,151 @@ onClassTypeClause
 
 privilegeType
     : ALL PRIVILEGES?
-    | basicPermission | objectPermission
+    | assemblyPermission | asymmetricKeyPermission
+    | availabilityGroupPermission | certificatePermission
+    | objectPermission
+    | databasePermission | databasePrincipalPermission
+    | databaseScopedCredentialPermission | endpointPermission
+    | fullTextPermission
+    | schemaPermission | searchPropertyListPermission
     | serverPermission | serverPrincipalPermission
-    | databasePermission | databasePrincipalPermission | schemaPermission
-    | serviceBrokerPermission | endpointPermission
-    | certificatePermission | symmetricKeyPermission | asymmetricKeyPermission
-    | assemblyPermission | availabilityGroupPermission | fullTextPermission
-    ;
-
-basicPermission
-    : CONTROL SERVER? | TAKE OWNERSHIP | ALTER | VIEW ANY? DEFINITION | 
REFERENCES
-    | SELECT | INSERT | UPDATE | DELETE | EXECUTE | RECEIVE
+    | serviceBrokerPermission | symmetricKeyPermission
+    | typePermission | xmlSchemaCollectionPermission
     ;
 
 objectPermission
-    : VIEW CHANGE TRACKING
+    : ALTER | CONTROL | DELETE | EXECUTE | INSERT | RECEIVE | REFERENCES | 
SELECT | TAKE OWNERSHIP | UPDATE
+    | VIEW CHANGE TRACKING | VIEW DEFINITION
     ;
 
 serverPermission
-    : ALTER (RESOURCES | SETTINGS | TRACE | SERVER STATE)
+    : ADMINISTER BULK OPERATIONS | ALTER (RESOURCES | SETTINGS | TRACE | 
SERVER STATE)
     | ALTER ANY (AVAILABILITY GROUP | CONNECTION | CREDENTIAL | DATABASE | 
ENDPOINT | EVENT NOTIFICATION | EVENT SESSION | LINKED SERVER | LOGIN | SERVER 
AUDIT | SERVER ROLE)
+    | AUTHENTICATE SERVER | CONNECT ANY DATABASE | CONNECT SQL | CONTROL 
SERVER | CREATE ANY DATABASE
     | CREATE (AVAILABILITY GROUP | DDL EVENT NOTIFICATION | ENDPOINT | SERVER 
ROLE | TRACE EVENT NOTIFICATION)
-    | CREATE ANY DATABASE
-    | VIEW SERVER STATE
-    | VIEW ANY (DATABASE | DEFINITION)
-    | CONNECT ANY DATABASE | CONNECT SQL
-    | IMPERSONATE ANY LOGIN
-    | SELECT ALL USER SECURABLES | AUTHENTICATE SERVER | EXTERNAL ACCESS 
ASSEMBLY | ADMINISTER BULK OPERATIONS | UNSAFE ASSEMBLY
-    | SHUTDOWN
+    | EXTERNAL ACCESS ASSEMBLY | IMPERSONATE ANY LOGIN | SELECT ALL USER 
SECURABLES | SHUTDOWN | UNSAFE ASSEMBLY
+    | VIEW ANY (DATABASE | DEFINITION) | VIEW SERVER STATE
     ;
 
 serverPrincipalPermission
-    : IMPERSONATE | ALTER ANY (LOGIN | SERVER ROLE)
+    : CONTROL SERVER? | IMPERSONATE | VIEW ANY? DEFINITION | ALTER | ALTER ANY 
(LOGIN | SERVER ROLE)
     ;
 
 databasePermission
-    : ALTER TRACE
-    | ALTER ANY (DATABASE (AUDIT | DDL TRIGGER | EVENT NOTIFICATION | EVENT 
SESSION | SCOPED CONFIGURATION)? | DATASPACE | SCHEMA
-      | SERVICE AUDIT?| USER | APPLICATION? ROLE | CERTIFICATE | CONTRACT | 
ASSEMBLY | CONNECTION
-      | (SYMMETRIC | ASYMMETRIC | COLUMN ENCRYPTION) KEY | COLUMN MASTER KEY 
DEFINITION
-      | EXTERNAL (DATA SOURCE | FILE FORMAT | LIBRARY)
-      | FULLTEXT CATALOG | MASK | MESSAGE TYPE | REMOTE SERVICE BINDING | 
ROUTE | EVENT SESSION | SECURITY POLICY)
-    | CREATE (DATABASE | DATABASE DDL EVENT NOTIFICATION | SCHEMA | TABLE | 
VIEW | SERVICE | TYPE | DEFAULT | AGGREGATE | ASSEMBLY | (SYMMETRIC | 
ASYMMETRIC) KEY 
-      | CERTIFICATE | CONTRACT | FULLTEXT CATALOG | FUNCTION | MESSAGE TYPE | 
PROCEDURE | QUEUE | REMOTE SERVICE BINDING | ROLE | ROUTE | RULE | SYNONYM | 
XML SCHEMA COLLECTION)
+    : ADMINISTER DATABASE BULK OPERATIONS | ALTER | ALTER TRACE
+    | ALTER ANY (APPLICATION ROLE | ASSEMBLY | (SYMMETRIC | ASYMMETRIC | 
COLUMN ENCRYPTION) KEY | CERTIFICATE
+    | CONNECTION | COLUMN MASTER KEY DEFINITION | CONTRACT
+    | DATABASE (AUDIT | DDL TRIGGER | EVENT NOTIFICATION | EVENT SESSION | 
SCOPED CONFIGURATION)?
+    | DATASPACE | EVENT (NOTIFICATION | SESSION) | EXTERNAL (DATA SOURCE | 
FILE FORMAT | LIBRARY) | FULLTEXT CATALOG | MASK | MESSAGE TYPE
+    | REMOTE SERVICE BINDING | ROLE | ROUTE | SERVER AUDIT | SCHEMA | SECURITY 
POLICY | SERVICE | USER)
+    | AUTHENTICATE SERVER? | BACKUP (DATABASE | LOG) | CHECKPOINT | CONNECT | 
CONNECT REPLICATION? | CONTROL SERVER?
+    | CREATE (AGGREGATE | ASSEMBLY | (SYMMETRIC | ASYMMETRIC) KEY | 
CERTIFICATE | CONTRACT | DATABASE | DATABASE? DDL EVENT NOTIFICATION
+    | DEFAULT | FULLTEXT CATALOG | FUNCTION | MESSAGE TYPE | PROCEDURE | QUEUE 
| REMOTE SERVICE BINDING | ROLE | ROUTE | RULE | SCHEMA
+    | SERVICE | SYNONYM | TABLE | TYPE | VIEW | XML SCHEMA COLLECTION)
+    | DELETE | EXECUTE | EXECUTE ANY? EXTERNAL SCRIPT | INSERT | KILL DATABASE 
CONNECTION | REFERENCES | SELECT | SHOWPLAN | SUBSCRIBE QUERY NOTIFICATIONS
+    | TAKE OWNERSHIP | UNMASK | UPDATE
+    | VIEW ANY COLUMN (MASTER | ENCRYPTION) KEY DEFINITION
     | CREATE ANY (DATABASE | EXTERNAL LIBRARY)
-    | VIEW ((DATABASE | SERVER) STATE | DDL EVENT NOTIFICATION)
-    | VIEW ANY (COLUMN (MASTER | ENCRYPTION) KEY DEFINITION | DEFINITION)
-    | EXECUTE ANY EXTERNAL SCRIPT | CONNECT REPLICATION? | KILL DATABASE 
CONNECTION
-    | BACKUP (DATABASE | LOG) 
-    | AUTHENTICATE SERVER? | SHOWPLAN | SUBSCRIBE QUERY NOTIFICATIONS | UNMASK 
| CHECKPOINT | ADMINISTER DATABASE BULK OPERATIONS
+    | VIEW (DATABASE | SERVER) STATE | VIEW ANY? DEFINITION
+    | 
     ;
 
 databasePrincipalPermission
-    : IMPERSONATE | ALTER ANY (USER | APPLICATION? ROLE)
+    : databaseUserPermission | databaseRolePermission | 
applicationRolePermission
+    ;
+
+databaseUserPermission
+    : CONTROL | IMPERSONATE | ALTER | VIEW DEFINITION | ALTER ANY USER
+    ;
+
+databaseRolePermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | VIEW DEFINITION | ALTER ANY ROLE
+    ;
+
+applicationRolePermission
+    : CONTROL | ALTER | VIEW DEFINITION | ALTER ANY APPLICATION ROLE
+    ;
+
+databaseScopedCredentialPermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION
     ;
 
 schemaPermission
-    : ALTER ANY SCHEMA | CREATE SEQUENCE | VIEW CHANGE TRACKING
+    : ALTER | CONTROL | CREATE SEQUENCE | DELETE | EXECUTE | INSERT | 
REFERENCES | SELECT | TAKE OWNERSHIP
+    | UPDATE | VIEW CHANGE TRACKING | VIEW DEFINITION | ALTER ANY SCHEMA
+    ;
+
+searchPropertyListPermission
+    : ALTER | CONTROL | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION | ALTER 
ANY FULLTEXT CATALOG
     ;
 
 serviceBrokerPermission
-    : ALTER ANY (CONTRACT | MESSAGE TYPE | REMOTE SERVICE BINDING | ROUTE | 
SERVICE)
+    : serviceBrokerContractsPermission | serviceBrokerMessageTypesPermission | 
serviceBrokerRemoteServiceBindingsPermission
+    | serviceBrokerRoutesPermission | serviceBrokerServicesPermission
+    ;
+
+serviceBrokerContractsPermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER 
ANY CONTRACT
+    ;
+
+serviceBrokerMessageTypesPermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER 
ANY MESSAGE TYPE
+    ;
+
+serviceBrokerRemoteServiceBindingsPermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | VIEW DEFINITION | ALTER ANY REMOTE 
SERVICE BINDING
+    ;
+
+serviceBrokerRoutesPermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | VIEW DEFINITION | ALTER ANY ROUTE
+    ;
+
+serviceBrokerServicesPermission
+    : CONTROL | TAKE OWNERSHIP | SEND | ALTER | VIEW DEFINITION | ALTER ANY 
SERVICE
     ;
 
 endpointPermission
-    : ALTER ANY ENDPOINT
+    : ALTER | CONNECT | CONTROL SERVER? | TAKE OWNERSHIP | VIEW ANY? 
DEFINITION | ALTER ANY ENDPOINT
     ;
 
 certificatePermission
-    : ALTER ANY CERTIFICATE
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER 
ANY CERTIFICATE
     ;
 
 symmetricKeyPermission
-    : ALTER ANY SYMMETRIC KEY
+    : ALTER | CONTROL | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION | ALTER 
ANY SYMMETRIC KEY
     ;
 
 asymmetricKeyPermission
-    : ALTER ANY ASYMMETRIC KEY
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER 
ANY ASYMMETRIC KEY
     ;
 
 assemblyPermission
-    : ALTER ANY ASSEMBLY
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER 
ANY ASSEMBLY
     ;
 
 availabilityGroupPermission
-    : ALTER ANY AVAILABILITY GROUP | CONNECT
+    : ALTER | CONNECT | CONTROL SERVER? | TAKE OWNERSHIP | VIEW ANY? 
DEFINITION | ALTER ANY AVAILABILITY GROUP
     ;
 
 fullTextPermission
-    : ALTER ANY FULLTEXT CATALOG
+    : fullTextCatalogPermission | fullTextStoplistPermission
+    ;
+
+fullTextCatalogPermission
+    : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER 
ANY FULLTEXT CATALOG
+    ;
+
+fullTextStoplistPermission
+    : ALTER | CONTROL | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION | ALTER 
ANY FULLTEXT CATALOG
+    ;
+
+typePermission
+    : CONTROL | EXECUTE | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION
+    ;
+
+xmlSchemaCollectionPermission
+    : ALTER | CONTROL | EXECUTE | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION
     ;
 
 class_
@@ -160,6 +248,17 @@ classType
     : (LOGIN | DATABASE | OBJECT | ROLE | SCHEMA | USER) COLON_ COLON_
     ;
 
+classItem
+    : ASSEMBLY | ASYMMETRIC KEY | AVAILABILITY GROUP | CERTIFICATE | USER | 
ROLE | APPLICATION ROLE
+    | DATABASE SCOPED CREDENTIAL | ENDPOINT | FULLTEXT (CATALOG | STOPLIST) | 
OBJECT | SCHEMA | SEARCH PROPERTY LIST
+    | LOGIN | SERVER ROLE | CONTRACT | MESSAGE TYPE | REMOTE SERVICE BINDING | 
ROUTE | SERVICE | SYMMETRIC KEY
+    | SELECT | EXECUTE | TYPE | XML SCHEMA COLLECTION
+    ;
+
+grantClassType
+    : LOGIN | DATABASE | OBJECT | ROLE | SCHEMA | USER
+    ;
+
 roleClause
     : ignoredIdentifiers
     ;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index 302e0b8..68c8a2e 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -1790,3 +1790,23 @@ UNCOMMITTED
 COMMITTED
     : C O M M I T T E D
     ;
+
+STOPLIST
+    : S T O P L I S T
+    ;
+
+SEARCH
+    : S E A R C H
+    ;
+
+PROPERTY
+    : P R O P E R T Y
+    ;
+
+LIST
+    : L I S T
+    ;
+
+SEND
+    : S E N D
+    ;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
index af433ed..7b5eb1f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Alt
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterUserContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ClassPrivilegesClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ClassTypePrivilegesClauseContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNamesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateLoginContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateRoleContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateUserContext;
@@ -35,12 +36,20 @@ import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Den
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropLoginContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropRoleContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropUserContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantClassPrivilegesClauseContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantClassTypePrivilegesClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.IgnoredNameIdentifierContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OwnerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.RevokeContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SecurableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SetUserContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.UserNameContext;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.StringLiteralValue;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
@@ -58,6 +67,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerRevokeStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerSetUserStatement;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Properties;
@@ -75,13 +85,18 @@ public final class SQLServerDCLStatementSQLVisitor extends 
SQLServerStatementSQL
     @Override
     public ASTNode visitGrant(final GrantContext ctx) {
         SQLServerGrantStatement result = new SQLServerGrantStatement();
-        if (null != ctx.classPrivilegesClause()) {
-            for (SimpleTableSegment each : 
getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
+        if (null != ctx.grantClassPrivilegesClause()) {
+            for (SimpleTableSegment each : 
getTableFromGrantPrivilegeClause(ctx.grantClassPrivilegesClause())) {
                 result.getTables().add(each);
             }
+            if (null != 
ctx.grantClassPrivilegesClause().grantClassPrivileges().columnNames()) {
+                for (ColumnNamesContext each : 
ctx.grantClassPrivilegesClause().grantClassPrivileges().columnNames()) {
+                    
result.getColumns().addAll(((CollectionValue<ColumnSegment>) 
visit(each)).getValue());
+                }
+            }
         }
-        if (null != ctx.classTypePrivilegesClause()) {
-            for (SimpleTableSegment each : 
getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
+        if (null != ctx.grantClassTypePrivilegesClause()) {
+            for (SimpleTableSegment each : 
getTableFromGrantPrivilegeClause(ctx.grantClassTypePrivilegesClause())) {
                 result.getTables().add(each);
             }
         }
@@ -104,6 +119,40 @@ public final class SQLServerDCLStatementSQLVisitor extends 
SQLServerStatementSQL
         return result;
     }
     
+    private Collection<SimpleTableSegment> 
getTableFromGrantPrivilegeClause(final GrantClassPrivilegesClauseContext ctx) {
+        Collection<SimpleTableSegment> result = new ArrayList<>();
+        if (null != ctx.grantOnClassClause()) {
+            if (null != ctx.grantOnClassClause().classItem() && null != 
ctx.grantOnClassClause().classItem().OBJECT()) {
+                result = Collections.singletonList((SimpleTableSegment) 
visit(ctx.grantOnClassClause().securable()));
+            }
+            if (null != 
ctx.grantClassPrivileges().privilegeType().get(0).objectPermission()) {
+                result = Collections.singletonList((SimpleTableSegment) 
visit(ctx.grantOnClassClause().securable()));
+            }
+            if (null != 
ctx.grantClassPrivileges().privilegeType().get(0).PRIVILEGES()) {
+                result = Collections.singletonList((SimpleTableSegment) 
visit(ctx.grantOnClassClause().securable()));
+            }
+        }
+        return result;
+    }
+    
+    private Collection<SimpleTableSegment> 
getTableFromGrantPrivilegeClause(final GrantClassTypePrivilegesClauseContext 
ctx) {
+        Collection<SimpleTableSegment> result = new ArrayList<>();
+        if (null != ctx.grantOnClassTypeClause() && null != 
ctx.grantOnClassTypeClause().grantClassType() && null != 
ctx.grantOnClassTypeClause().grantClassType().OBJECT()) {
+            result = Collections.singletonList((SimpleTableSegment) 
visit(ctx.grantOnClassTypeClause().securable()));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitSecurable(final SecurableContext ctx) {
+        SimpleTableSegment result = new SimpleTableSegment(new 
TableNameSegment(ctx.name().getStart().getStartIndex(), 
ctx.name().getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+        OwnerContext owner = ctx.owner();
+        if (null != owner) {
+            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+        }
+        return result;
+    }
+    
     private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final 
ClassPrivilegesClauseContext ctx) {
         return null == ctx.onClassClause().tableName() ? 
Collections.emptyList() : Collections.singletonList((SimpleTableSegment) 
visit(ctx.onClassClause().tableName()));
     }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
index 0a61436..d04e3da 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
@@ -17,13 +17,21 @@
 
 package 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl;
 
+import lombok.Getter;
 import lombok.ToString;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
 
+import java.util.LinkedList;
+import java.util.List;
+
 /**
  * SQLServer grant statement.
  */
 @ToString
+@Getter
 public final class SQLServerGrantStatement extends GrantStatement implements 
SQLServerStatement {
+    
+    private final List<ColumnSegment> columns = new LinkedList<>();
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
index 99c3fe0..f449253 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
@@ -26,7 +26,12 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.o
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.value.IdentifierValueAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
 
+import java.util.Collection;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -52,4 +57,20 @@ public final class ColumnAssert {
         }
         SQLSegmentAssert.assertIs(assertContext, actual, expected);
     }
+    
+    /**
+     * Assert actual column segments is correct with expected columns.
+     *
+     * @param assertContext assert context
+     * @param actual actual columns
+     * @param expected expected columns
+     */
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final Collection<ColumnSegment> actual, final List<ExpectedColumn> expected) {
+        assertThat(assertContext.getText("Columns size assertion error: "), 
actual.size(), is(expected.size()));
+        int count = 0;
+        for (ColumnSegment each : actual) {
+            assertIs(assertContext, each, expected.get(count));
+            count++;
+        }
+    }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
index 167ebdc..a7a0147 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
@@ -21,8 +21,10 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLGrantStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerGrantStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.mysql.MySQLGrantStatementAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.sqlserver.SQLServerGrantStatementAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl.GrantStatementTestCase;
 
 /**
@@ -41,6 +43,8 @@ public final class GrantStatementAssert {
     public static void assertIs(final SQLCaseAssertContext assertContext, 
final GrantStatement actual, final GrantStatementTestCase expected) {
         if (actual instanceof MySQLGrantStatement) {
             MySQLGrantStatementAssert.assertIs(assertContext, 
(MySQLGrantStatement) actual, expected);
+        } else if (actual instanceof SQLServerGrantStatement) {
+            SQLServerGrantStatementAssert.assertIs(assertContext, 
(SQLServerGrantStatement) actual, expected);
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/sqlserver/SQLServerGrantStatementAssert.java
similarity index 65%
copy from 
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
copy to 
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/sqlserver/SQLServerGrantStatementAssert.java
index 167ebdc..d43451a 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/sqlserver/SQLServerGrantStatementAssert.java
@@ -15,32 +15,35 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl;
+package 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.sqlserver;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLGrantStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerGrantStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
-import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.mysql.MySQLGrantStatementAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.column.ColumnAssert;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl.GrantStatementTestCase;
 
 /**
- * Grant statement assert.
+ * SQLServer Grant statement assert.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class GrantStatementAssert {
+public final class SQLServerGrantStatementAssert {
     
     /**
-     * Assert grant statement is correct with expected parser result.
-     * 
+     * Assert SQLServer grant statement is correct with expected parser result.
+     *
      * @param assertContext assert context
-     * @param actual actual grant statement
+     * @param actual actual SQLServer grant statement
      * @param expected expected grant statement test case
      */
-    public static void assertIs(final SQLCaseAssertContext assertContext, 
final GrantStatement actual, final GrantStatementTestCase expected) {
-        if (actual instanceof MySQLGrantStatement) {
-            MySQLGrantStatementAssert.assertIs(assertContext, 
(MySQLGrantStatement) actual, expected);
+    public static void assertIs(final SQLCaseAssertContext assertContext, 
final SQLServerGrantStatement actual, final GrantStatementTestCase expected) {
+        if (0 != expected.getTables().size()) {
+            TableAssert.assertIs(assertContext, actual.getTables(), 
expected.getTables());
+        }
+        if (0 != expected.getColumns().size()) {
+            ColumnAssert.assertIs(assertContext, actual.getColumns(), 
expected.getColumns());
         }
     }
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
index 1493854..732cc92 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
@@ -18,6 +18,7 @@
 package 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl;
 
 import lombok.Getter;
+import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.table.ExpectedSimpleTable;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
 
@@ -33,4 +34,7 @@ public final class GrantStatementTestCase extends 
SQLParserTestCase {
     
     @XmlElement(name = "table")
     private final List<ExpectedSimpleTable> tables = new LinkedList<>();
+    
+    @XmlElement(name = "column")
+    private final List<ExpectedColumn> columns = new LinkedList<>();
 }
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
index 93494f3..763ccb7 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
@@ -50,6 +50,7 @@
         <table name="t_order" start-index="27" stop-index="38">
             <owner name="ds_0" start-index="27" stop-index="30" />
         </table>
+        <column name="order_id" start-index="14" stop-index="21" />
     </grant>
     
     <grant sql-case-id="grant_select_to_local_user" />
@@ -199,6 +200,7 @@
     
     <grant sql-case-id="grant_select_to_users">
         <table name="t_order" start-index="27" stop-index="33" />
+        <column name="order_id" start-index="14" stop-index="21" />
     </grant>
     
     <grant sql-case-id="grant_select_on_table_for_postgresql">
@@ -217,4 +219,56 @@
         <!-- FIXME ds_0 is not table, should be schema -->
         <!--<table name="ds_0" start-index="24" stop-index="27" />-->
     </grant>
+    
+    <grant sql-case-id="grant_view_definition_on_availability_group" />
+    <grant sql-case-id="grant_take_ownership_on_availability_group" />
+    <grant sql-case-id="grant_control_on_availability_group" />
+    <grant sql-case-id="grant_create_table_to_user" />
+    <grant sql-case-id="grant_showplan_to_application_role" />
+    <grant sql-case-id="grant_create_view_to_user" />
+    <grant sql-case-id="grant_control_to_database_user" />
+    <grant sql-case-id="grant_control_to_user" />
+    <grant sql-case-id="grant_view_definition_on_role_to_user" />
+    <grant sql-case-id="grant_impersonate_to_application_role" />
+    <grant sql-case-id="grant_view_definition_endpoint_to_sqlserver_login" />
+    <grant sql-case-id="grant_take_ownership_endpoint_to_sqlserver_login" />
+    <grant sql-case-id="grant_control_on_fulltext_catalog" />
+    <grant sql-case-id="grant_view_definition_on_fulltext_stoplist" />
+
+    <grant sql-case-id="grant_select_on_object_table">
+        <table name="order_id" start-index="24" stop-index="33">
+            <owner name="t" start-index="24" stop-index="24" />
+        </table>
+    </grant>
+
+    <grant sql-case-id="grant_execute_on_object_stored_procedure">
+        <table name="sp1" start-index="25" stop-index="32">
+            <owner name="ds_0" start-index="25" stop-index="28" />
+        </table>
+    </grant>
+
+    <grant sql-case-id="grant_references_on_column">
+        <table name="order_id" start-index="39" stop-index="48">
+            <owner name="t" start-index="39" stop-index="39" />
+        </table>
+        <column name="order_id" start-index="18" stop-index="25" />
+    </grant>
+
+    <grant sql-case-id="grant_execute_on_stored_procedure">
+        <table name="sp1" start-index="17" stop-index="24">
+            <owner name="ds_0" start-index="17" stop-index="20" />
+        </table>
+    </grant>
+
+    <grant sql-case-id="grant_insert_on_schema" />
+    <grant sql-case-id="grant_insert_on_schema_with_grant_option" />
+    <grant sql-case-id="grant_view_definition_on_search_property_list" />
+    <grant sql-case-id="grant_control_server_to_sqlserver_login" />
+    <grant sql-case-id="grant_alter_any_event_notification_to_sqlserver_login" 
/>
+    <grant sql-case-id="grant_alter_any_database_to_role" />
+    <grant sql-case-id="grant_impersonate_on_login" />
+    <grant sql-case-id="grant_alter_on_symmetric_key" />
+    <grant sql-case-id="grant_view_server_state_to_sqlserver_login" />
+    <grant sql-case-id="grant_view_definition_on_type" />
+    <grant sql-case-id="grant_execute_on_xml_schema_collection" />
 </sql-parser-test-cases>
diff --git 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
index be0c8ce..b29e4f3 100644
--- 
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
+++ 
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
@@ -19,7 +19,7 @@
 <sql-cases>
     <sql-case id="grant_user_without_hostname" value="GRANT SELECT, UPDATE, 
INSERT, DELETE ON t_order to user_dev" 
db-types="Oracle,PostgreSQL,openGauss,SQLServer" />
     <sql-case id="grant_user_with_grant" value="GRANT SELECT, UPDATE, INSERT, 
DELETE ON t_order to user_dev with GRANT option" 
db-types="Oracle,PostgreSQL,openGauss,SQLServer"/>
-    <sql-case id="grant_role" value="GRANT role_dev to user_dev" 
db-types="Oracle,PostgreSQL,openGauss,SQLServer" />
+    <sql-case id="grant_role" value="GRANT role_dev to user_dev" 
db-types="Oracle,PostgreSQL,openGauss" />
     <sql-case id="grant_user_with_admin" value="GRANT ADVISOR, ALTER DATABASE 
to user_dev with admin option" db-types="Oracle" />
     <sql-case id="grant_user_on_db" value="GRANT ALL ON sharding_db.* TO 
'user_dev'@'localhost'" db-types="MySQL" />
     <sql-case id="grant_user_on_table" value="GRANT ALL ON t_order TO 
'user_dev'@'localhost'" db-types="MySQL" />
@@ -118,4 +118,33 @@
     <sql-case id="grant_all_on_table_with_owner_for_mysql" value="GRANT ALL 
PRIVILEGES ON ds_0.* TO user1" db-types="MySQL" />
     <sql-case id="grant_all_on_table_with_owner_for_postgresql" value="GRANT 
ALL PRIVILEGES ON ds_0.* TO user1" db-types="PostgreSQL,openGauss" />
     <!-- FIXME end of fixme -->
+    <sql-case id="grant_view_definition_on_availability_group" value="GRANT 
VIEW DEFINITION ON AVAILABILITY GROUP::group1 TO user1" db-types="SQLServer" />
+    <sql-case id="grant_take_ownership_on_availability_group" value="GRANT 
TAKE OWNERSHIP ON AVAILABILITY GROUP::group1 TO user1 WITH GRANT OPTION" 
db-types="SQLServer" />
+    <sql-case id="grant_control_on_availability_group" value="GRANT CONTROL ON 
AVAILABILITY GROUP::group1 TO user1" db-types="SQLServer" />
+    <sql-case id="grant_create_table_to_user" value="GRANT CREATE TABLE TO 
user1" db-types="SQLServer" />
+    <sql-case id="grant_showplan_to_application_role" value="GRANT SHOWPLAN TO 
role1" db-types="SQLServer" />
+    <sql-case id="grant_create_view_to_user" value="GRANT CREATE VIEW TO user1 
WITH GRANT OPTION" db-types="SQLServer" />
+    <sql-case id="grant_control_to_database_user" value="GRANT CONTROL ON 
DATABASE::database1 TO user1" db-types="SQLServer" />
+    <sql-case id="grant_control_to_user" value="GRANT CONTROL ON USER::user1 
TO user2" db-types="SQLServer" />
+    <sql-case id="grant_view_definition_on_role_to_user" value="GRANT VIEW 
DEFINITION ON ROLE::role1 TO user1 WITH GRANT OPTION" db-types="SQLServer" />
+    <sql-case id="grant_impersonate_to_application_role" value="GRANT 
IMPERSONATE ON USER::user1 TO role1" db-types="SQLServer" />
+    <sql-case id="grant_view_definition_endpoint_to_sqlserver_login" 
value="GRANT VIEW DEFINITION ON ENDPOINT::endpoint1 TO login1" 
db-types="SQLServer" />
+    <sql-case id="grant_take_ownership_endpoint_to_sqlserver_login" 
value="GRANT TAKE OWNERSHIP ON ENDPOINT::endpoint1 TO login1 WITH GRANT OPTION" 
db-types="SQLServer" />
+    <sql-case id="grant_control_on_fulltext_catalog" value="GRANT CONTROL ON 
FULLTEXT CATALOG :: catalog1 TO user1" db-types="SQLServer" />
+    <sql-case id="grant_view_definition_on_fulltext_stoplist" value="GRANT 
VIEW DEFINITION ON FULLTEXT STOPLIST :: stoplist1 TO user1" 
db-types="SQLServer" />
+    <sql-case id="grant_select_on_object_table" value="GRANT SELECT ON 
OBJECT::t.order_id TO user1" db-types="SQLServer" />
+    <sql-case id="grant_execute_on_object_stored_procedure" value="GRANT 
EXECUTE ON OBJECT::ds_0.sp1 TO role1" db-types="SQLServer" />
+    <sql-case id="grant_references_on_column" value="GRANT REFERENCES 
(order_id) ON OBJECT::t.order_id TO user1 WITH GRANT OPTION" 
db-types="SQLServer" />
+    <sql-case id="grant_execute_on_stored_procedure" value="GRANT EXECUTE ON 
ds_0.sp1 TO role1" db-types="SQLServer" />
+    <sql-case id="grant_insert_on_schema" value="GRANT INSERT ON SCHEMA :: 
schema1 TO user1" db-types="SQLServer" />
+    <sql-case id="grant_insert_on_schema_with_grant_option" value="GRANT 
SELECT ON SCHEMA :: schema1 TO user1 WITH GRANT OPTION" db-types="SQLServer" />
+    <sql-case id="grant_view_definition_on_search_property_list" value="GRANT 
VIEW DEFINITION ON SEARCH PROPERTY LIST :: list1 TO user1" db-types="SQLServer" 
/>
+    <sql-case id="grant_control_server_to_sqlserver_login" value="GRANT 
CONTROL SERVER TO login1" db-types="SQLServer" />
+    <sql-case id="grant_alter_any_event_notification_to_sqlserver_login" 
value="GRANT ALTER ANY EVENT NOTIFICATION TO login1 WITH GRANT OPTION" 
db-types="SQLServer" />
+    <sql-case id="grant_alter_any_database_to_role" value="GRANT ALTER ANY 
DATABASE TO role1" db-types="SQLServer" />
+    <sql-case id="grant_impersonate_on_login" value="GRANT IMPERSONATE ON 
LOGIN::login1 TO [windows\user]" db-types="SQLServer" />
+    <sql-case id="grant_alter_on_symmetric_key" value="GRANT ALTER ON 
SYMMETRIC KEY::key1 TO user1" db-types="SQLServer" />
+    <sql-case id="grant_view_server_state_to_sqlserver_login" value="GRANT 
VIEW SERVER STATE TO login1" db-types="SQLServer" />
+    <sql-case id="grant_view_definition_on_type" value="GRANT VIEW DEFINITION 
ON TYPE::schema1.type1 TO user1 WITH GRANT OPTION" db-types="SQLServer" />
+    <sql-case id="grant_execute_on_xml_schema_collection" value="GRANT EXECUTE 
ON XML SCHEMA COLLECTION::schema1.collection1 TO user1" db-types="SQLServer" />
 </sql-cases>

Reply via email to