Setting up the index validate process starts by creating a template of type Block.
Following is an example of a SQL Server template:
SELECT '{{index.name}} does not exist'
EXCEPT
SELECT '{{index.name}} does not exist'
FROM sys.indexes
WHERE name = N'{{ index.name }}'
AND object_id = object_id(N'{{ index.table.schema }}.{{ index.table.name }}')
Select the template in the Target Connection and make sure to check Enable Automatic Creation of Indexes option:
Select the index templates at the table level for existing tables, new tables pick these up automatically:
Next, an example of an index validate template for PostgreSQL:
{# -- TemplateVersion:001 MinVersion:21010 MaxVersion:* TargetType:Postgres ModelType:* TemplateType:Block -- #}
SELECT '{{index.name | lower}} does not exist'
EXCEPT
SELECT CONCAT(i.relname,' does not exist')
FROM
pg_catalog.pg_class t,
pg_catalog.pg_class i,
pg_catalog.pg_index ix
WHERE
t.oid = ix.indrelid
AND i.oid = ix.indexrelid
AND t.relkind = 'r'
AND t.relname = '{{ index.table.name | lower }}'
AND i.relname = '{{ index.name | lower }}'
;
{%- for col in index.columns %}
SELECT '{{ index.name | lower }} requires updating'
EXCEPT
SELECT CONCAT(i.relname,' requires updating')
FROM
pg_class t,
pg_class i,
pg_index ix,
pg_attribute a
WHERE
t.oid = ix.indrelid
AND i.oid = ix.indexrelid
AND a.attrelid = t.oid
AND a.attnum = ANY(ix.indkey)
AND t.relkind = 'r'
AND t.relname = '{{ index.table.name | lower }}'
AND i.relname = '{{ index.name | lower }}'
AND a.attname = '{{ col.name | lower }}'
;
{% endfor %}
- Validate Index block is executed during Procedure/Script Rebuild/Regenerate workflows
- If there is no configured Index Validate Block Template in a table object that an index is associated with, then the index validate fails.
- The SQL Block which is generated from the configured Index Validate Block Template can consist of zero of more Select queries that fetch a single column of type Varchar(256).
- Each Select query is separated by the SQL Block statement separator which is configured in Tools > Options (for example, <EOS>).
- Each Select query is executed in turn, in the order in the generated SQL Block.
- Any null values or empty strings are ignored from the result set.
- If there are any non-null non-empty strings returned, these indicate a validation failure.
- As soon as a query in the template returns any validation errors, the process halts (so subsequent queries of the generated SQL Block are not executed).
- If the index validate fails for any reason, then the drop and create index operations will be performed when the index is regenerated.


