PIDM — The Number Behind Every Person
Every person in Banner has two names: the one you see, and the one the database uses. The one the database uses is a number you were never meant to know about. It is called PIDM, and it is the single most important column in every SQL query you will ever write against Banner.
Every person in Banner has two names: the one you see, and the one the database uses. The one you see is printed on pay stubs, class rosters, vendor checks — a readable string like "Smith, John A." or a visible 8-digit Banner ID like 00123456. The one the database uses is a number you were never meant to know about. It is an internal surrogate: NUMBER(8), system-generated, invisible to end users, and utterly non-negotiable. It is called PIDM — Personal ID Master — and it is the single most important column in every SQL query you will ever write against Banner.
When you sign up for a library card, the librarian types your name and address into the system and the computer assigns you patron number #54287. That number is meaningless to you. You carry a physical card with your name on it. The librarian greets you by name. The receipt prints your name. But internally, every book you have ever checked out, every fine you have ever paid, every inter-library loan you have ever requested, is recorded against patron #54287 — not against "Jane Smith."
Then you get married and change your name. The card gets re-issued with "Jane Cortez" on it. The address on file changes. Maybe the visible 16-digit barcode on the card even gets replaced when the library switches to a new card design. None of those changes touch your borrowing history. Patron #54287 is still patron #54287. The librarian re-types your current name into the system, the receipts now say "Cortez," but the loan records — every book you checked out before the name change and every book you will check out after — still join on the same patron number. Silently, invisibly, perfectly.
That patron number is PIDM. Your last name is SPRIDEN_LAST_NAME. Your visible library card barcode is SPRIDEN_ID. The librarian's re-typing your new name is an insert into SPRIDEN — the old name row gets flagged as historical (SPRIDEN_CHANGE_IND = 'N' for name change), the new name row is the current one (SPRIDEN_CHANGE_IND IS NULL). Banner uses PIDM because names change, visible IDs can be corrected or re-issued, and Social Security Numbers are things you actively try to avoid joining on. The invariant — the one thing that must never shift under you — has to be a number nobody else knows about.
PIDM is Banner's internal surrogate key for every person and non-person entity in the system. It is NUMBER(8), generated once by Banner when an entity is first inserted, and it never changes and is never reused for the life of that entity. A student, an employee, a vendor, an applicant — every entity gets exactly one PIDM, and that PIDM stays with it forever.
SPRIDEN is the translation table. It sits between the raw PIDM and the human-readable world. It stores one row per name version per entity — so a person who has changed names (marriage, divorce, legal name change) appears in SPRIDEN multiple times. All but the current row carry a SPRIDEN_CHANGE_IND value: 'N' for a name change, 'I' for an identification change (a typo correction in the visible ID, a merge). The current row — the one that represents the person's name right now — has SPRIDEN_CHANGE_IND IS NULL.
SPRIDEN_ENTITY_IND tells you what kind of entity the PIDM represents: 'P' for a person, 'C' for a company or corporation. Vendor records like FTVVEND use 'C' often, because the vendor might be a business rather than an individual. You filter on this column every time you join to SPRIDEN for people, or you risk mixing companies into your student roster.
The same PIDM is shared across roles. PIDM 38201 might be a student in SGBSTDN (the student base table), an employee in PEBEMPL (the HR employee table), AND a vendor in FTVVEND — all simultaneously. The student-worker who also sells handmade crafts to the bookstore is one person, one PIDM, three roles. Every table that records anything about a person joins back to SPRIDEN on PIDM — not on name, not on the visible Banner ID, not on SSN. The visible ID (SPRIDEN_ID) is for humans: registrars type it, Argos prompts ask for it, reports display it. PIDM is for joins: fast, stable, anonymous.
The ring diagram makes the relationship visible. SPRIDEN sits at the center — the one table that knows a PIDM's current name, current visible ID, and current entity type. Radiating outward are the role-specific tables: student records, HR records, finance records. Every arrow points inward, toward the same PIDM. The diagram says what a thousand words of documentation would say: to ask a question about a person in Banner, you start at the role table, join to SPRIDEN on PIDM, and filter by change indicator and entity type. The pattern repeats identically across the entire ERP.
The canonical PIDM resolution — from a raw PIDM to the current name — is three lines of SQL and two filters you must never omit:
-- Get the CURRENT name for a given PIDM.
-- The two WHERE filters are not optional: without change_ind you get
-- duplicates (one row per historical name version), without entity_ind
-- you may catch a company that shares the PIDM number space.
SELECT s.spriden_pidm,
s.spriden_id,
s.spriden_last_name || ', ' || s.spriden_first_name AS full_name
FROM spriden s
WHERE s.spriden_change_ind IS NULL
AND s.spriden_entity_ind = 'P';
Now use it in a real query — a course roster for a specific term. The student registration table (SFRSTCR) carries the PIDM; SPRIDEN provides the name:
-- Roster of students in a specific course-section in Spring 2026.
-- The fact table (sfrstcr) joins to spriden on PIDM, never on ID.
SELECT s.spriden_id AS student_id,
s.spriden_last_name AS last_name,
s.spriden_first_name AS first_name,
r.sfrstcr_crn AS course_ref_number,
r.sfrstcr_credit_hr AS credit_hours
FROM sfrstcr r
JOIN spriden s
ON s.spriden_pidm = r.sfrstcr_pidm
AND s.spriden_change_ind IS NULL
AND s.spriden_entity_ind = 'P'
WHERE r.sfrstcr_term_code = '202610';
The join is on PIDM — not on SPRIDEN_ID, not on SPRIDEN_LAST_NAME, not on any column a human types. The two filter conditions are inside the JOIN, not in a WHERE — they are part of the join contract, not an afterthought. When a query needs to resolve a second person — an advisor, a supervisor, a reporting manager — you join SPRIDEN a second time with a different alias. That pattern is covered in The Double SPRIDEN — Naming Two People in One Query.
Five lessons that every Banner SQL writer learns the hard way:
- Never join people by name. There are multiple "Smith, John" records in
any college database. Names have typos. Accents come and go across systems. Suffixes ("Jr.", "III") are inconsistent. A name is a label, not a key. PIDM is the key. Join on it every time.
- Never join people by SSN. SSNs are regulated PII — every copy of an SSN
in your query, your logs, your result set is an audit liability. Many Banner records have missing or placeholder SSNs (999-XX-XXXX patterns for international students, for example). PIDM exists specifically so you never have to touch SSN in a join. Use it.
- **
SPRIDEN_CHANGE_IND IS NULLis mandatory.** Without this filter, anyone
who has ever changed names — marriage, divorce, legal correction — returns duplicate rows in your result set. One row for every historical name version. A roster of 25 students silently becomes 31 rows, and the duplicates look identical except for the name column. The Banner Semantic Search SQL Explainer flags this missing filter as a warning. SPRIDEN Without CHANGE_IND — The Duplicate-Name Trap covers the full duplicate-name gotcha, with examples.
- A single PIDM wears multiple hats. A student who works part-time on
campus and also sells handmade goods to the bookstore is one person, one PIDM, and rows in SGBSTDN (student), PEBEMPL (employee), and FTVVEND (vendor) simultaneously. If you join all three tables naively on PIDM without filtering by role, you produce a Cartesian mess — every student row multiplied by every employee row multiplied by every vendor row. Join one role table at a time, or use EXISTS to check for role membership without multiplying rows.
- PIDM is not for display. Users see the 8-digit Banner ID
(SPRIDEN_ID). Your reports must translate PIDM back to SPRIDEN_ID before showing anything to a user. Never print a raw PIDM in a report, a dashboard, or an export. PIDM is an internal surrogate — it is not a student ID, not an employee ID, not a vendor number. Leaking it to the UI is a privacy concern, and it confuses users who expect to see the visible Banner ID they recognize. The join uses PIDM; the SELECT shows SPRIDEN_ID.
PIDM is Banner's internal person number. It never changes, it never repeats, and it is the only thing you should ever join on.