bigquery/cloud-client/revokeTableOrViewAccess.js (58 lines of code) (raw):
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
'use strict';
async function main(
projectId,
datasetId,
tableId,
roleToRemove = null,
principalToRemove = null
) {
// [START bigquery_revoke_access_to_table_or_view]
/**
* TODO(developer): Update and un-comment below lines
*/
// const projectId = "YOUR_PROJECT_ID"
// const datasetId = "YOUR_DATASET_ID"
// const tableId = "YOUR_TABLE_ID"
// const roleToRemove = "YOUR_ROLE"
// const principalToRemove = "YOUR_PRINCIPAL_ID"
const {BigQuery} = require('@google-cloud/bigquery');
// Instantiate a client.
const client = new BigQuery();
async function revokeAccessToTableOrView() {
const dataset = client.dataset(datasetId);
const table = dataset.table(tableId);
// Get the IAM access policy for the table or view.
const [policy] = await table.getIamPolicy();
// Initialize bindings array.
if (!policy.bindings) {
policy.bindings = [];
}
// To revoke access to a table or view,
// remove bindings from the Table or View policy.
//
// Find more details about Policy objects here:
// https://cloud.google.com/security-command-center/docs/reference/rest/Shared.Types/Policy
if (principalToRemove) {
// Create a copy of bindings for modifications.
const bindings = [...policy.bindings];
// Filter out the principal from each binding.
for (const binding of bindings) {
if (binding.members) {
binding.members = binding.members.filter(
m => m !== principalToRemove
);
}
}
// Filter out bindings with empty members.
policy.bindings = bindings.filter(
binding => binding.members && binding.members.length > 0
);
}
if (roleToRemove) {
// Filter out all bindings with the roleToRemove
// and assign a new list back to the policy bindings.
policy.bindings = policy.bindings.filter(b => b.role !== roleToRemove);
}
// Set the IAM access policy with updated bindings.
await table.setIamPolicy(policy);
// Both role and principal are removed
if (roleToRemove !== null && principalToRemove !== null) {
console.log(
`Role '${roleToRemove}' revoked for principal '${principalToRemove}' on resource '${datasetId}.${tableId}'.`
);
}
// Only role is removed
if (roleToRemove !== null && principalToRemove === null) {
console.log(
`Role '${roleToRemove}' revoked for all principals on resource '${datasetId}.${tableId}'.`
);
}
// Only principal is removed
if (roleToRemove === null && principalToRemove !== null) {
console.log(
`Access revoked for principal '${principalToRemove}' on resource '${datasetId}.${tableId}'.`
);
}
// No changes were made
if (roleToRemove === null && principalToRemove === null) {
console.log(
`No changes made to access policy for '${datasetId}.${tableId}'.`
);
}
}
// [END bigquery_revoke_access_to_table_or_view]
await revokeAccessToTableOrView();
}
exports.revokeAccessToTableOrView = main;