Protecting tables at row and column levels
Protect rows and columns by associating them with security objects by including clauses in the CREATE TABLE and ALTER TABLE statements.
After you have created the security objects required for your label-based access control (LBAC) implementation, you must apply them to the tables that you want to protect. The main actions to protect the data at this stage are:
- Attach a security policy to each table containing data to be protected by LBAC.
- Associate the necessary rows and columns with security labels.
Data in a table can only be protected by security labels that are part of the security policy protecting the table. Data protection, including attaching a security policy to a table, can be done when creating the table or later by altering the table.
Protected table with row-level granularity
A table can be marked as protected with row-level granularity during CREATE TABLE or ALTER TABLE by attaching a security policy and by specifying the security label column. The security label column must be of the IDSSECURITYLABEL data type.
If users attempt to access a row to which they do not have the required LBAC credentials, the system responds to the users as if the row did not exist.
Protected table with column-level granularity
A database table can be marked as protected with column-level granularity during CREATE TABLE or ALTER TABLE by attaching a security policy to such table and by attaching a security label to one or more columns of that table. When a column is associated with a security label, that column becomes a protected column. The security policy attached to the table affects what security label can be applied to the column.
If users attempt to access a column to which they do not have the required LBAC credentials, the system generates an error message.
Security label column (IDSSECURITYLABEL data type)
The column holding the label for row-level granularity must be of the IDSSECURITYLABEL data type. Only a user who holds the DBSECADM role can create, alter, or drop a column of this data type. ISDSECURITYLABEL is a built-in DISTINCT OF VARCHAR(128) data type. A table that has a security policy can have only one IDSSECURITYLABEL column.
The following constraints cannot be applied to a security label column:
- Referential constraints
- Check constraints
- Primary key or unique constraints if the security label column is the only column in constraint
- Column protection
- Encryption
For more information about the IDSSECURITYLABEL data type, see the HCL OneDB™ Guide to SQL: Reference and HCL OneDB Guide to SQL: Syntax.
Simultaneous row-level and column-level protection on a table
A protected table can be defined with both row and column-level granularities. If both row and column granularity are applied to a table, then LBAC enforces column-level before row-level access control.
You can apply row and column-level protection on a table in a single statement rather than issuing separate statements for the two granularities when you do the either of the following steps:
- When you create a new LBAC-protected table
- When you alter a table to add row-level protection in addition to the existing column-level protection
The following example shows a CREATE TABLE statement and an ALTER TABLE statement that set up two tables with both row and column-level protection.
CREATE TABLE T5
(C1 IDSSECURITYLABEL,
C2 int,
C3 char (10) COLUMN SECURED WITH label6)
SECURITY POLICY company;
ALTER TABLE T6
ADD (C1 IDSSECURITYLABEL),
MODIFY (C2 INT COLUMN SECURED WITH label7),
ADD SECURITY POLICY company;
For more information about how these statements work, see Applying row-level protection, Applying column-level protection, HCL OneDB Guide to SQL: Reference, and HCL OneDB Guide to SQL: Syntax.