Back to rules

CCPA Deletion Propagation Completeness

completenesscritical

Validates that consumer deletion requests have been fully propagated to all downstream systems. When a consumer exercises their right to delete, the business must ensure deletion is carried out across all systems and service providers that hold the consumer's personal information.

v1.0.0by dqhub1,398 downloads4.8 (68)
ccpadeletionprivacycompliancecprapropagationconsumer-rights
Try This Rule

Parameters

column_namestringrequired

The column containing email addresses

thresholdfloatdefault: 0.99

Minimum fraction of valid emails (0.0 to 1.0)

Compliance Mapping

CCPACal. Civ. Code 1798.105 — Right to Deletion

VCDPAVa. Code 59.1-577(A)(3) — Right to Delete

CPRACal. Civ. Code 1798.105(c) — Service Provider Notification

CPAC.R.S. 6-1-1306(1)(a)(III) — Right to Delete

Install

soda
checks for {{table_name}}:
  - invalid_percent({{column_name}}) < {{(1 - threshold) * 100}}:
      valid regex: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
dbt
{% test valid_email(model, column_name) %}
select {{ column_name }}
from {{ model }}
where {{ column_name }} not regexp '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
{% endtest %}
sql
SELECT COUNT(*) as total,
  SUM(CASE WHEN {{column_name}} REGEXP
    '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'
    THEN 1 ELSE 0 END) as valid
FROM {{table_name}}
Great Expectations
{
  "expectation_type": "expect_column_values_to_match_regex",
  "kwargs": {
    "column": "{{column_name}}",
    "regex": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
    "mostly": {{threshold}}
  }
}
spark
from pyspark.sql.functions import col
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
invalid = df.filter(~col("{{column_name}}").rlike(pattern)).count()

Test Data

Passing Examples

idvalue
1alice@example.com
2bob.smith@company.co.uk
3charlie+tag@domain.org

Failing Examples

idvalue
1not-an-email
2@missing-local.com
3spaces in@email.com

CLI

Terminal
npx dqhub install ccpa-deletion-propagation-complete --format soda --table YOUR_TABLE
npx dqhub install ccpa-deletion-propagation-complete --format dbt --model YOUR_MODEL
npx dqhub install ccpa-deletion-propagation-complete --format sql --dialect snowflake