Use case
In some cases we might want to allow access to certain columns for a role only if a particular condition is met
while allowing access to other columns based on a different condition
i.e. have different column permissions based on different row permissions.
Currently it is not possible to define multiple column + row permission rules for the same role.
We can work around this limitation by using views.
Example
Let’s say we have a table called user_info with columns (id, name, city, email, phone, address).
We want the role user to be able to access:
- the 
email, phone and address columns only if the id column is the requesting user’s id i.e. the current
user is the owner of the row. 
- the 
id, name and city columns for all rows. 
We can achieve this via the following steps:
 
Step 1: Create a view
Create a view called user_private with columns (user_id, email, phone, address):
CREATE VIEW user_private AS
  SELECT id AS user_id, email, phone, address
    FROM user_info;
 
 
 
Step 4: Query with appropriate access control
Now we can fetch the required data with the appropriate access control by using the relationship.
If the X-Hasura-Role and the X-Hasura-User-Id session variables are set to user and 2 respectively, we’ll get the following result:
query {
  user_info {
    id
    name
    city
    private_info {
      email
      phone
      address
    }
  }
}
 
 
query {
  user_info {
    id
    name
    city
    private_info {
      email
      phone
      address
    }
  }
}
{
  "data": {
    "user_info": [
      {
        "id": 1,
        "name": "Julie",
        "city": "Boston",
        "private_info": null
      },
      {
          "id": 2,
          "name": "Josh",
          "city": "Bangalore",
          "private_info": {
            "email": "
[email protected]",
            "phone": "+91-9787675678",
            "address": "#141, 7th Main Road, Koramangala 3rd Block",
          }
        },
        {
          "id": 3,
          "name": "John",
          "city": "Berlin",
          "private_info": null
        }
    ]
  }
}
 
Observe that the private_info field is returned as null for all rows without the appropriate access.