SQL Academy · Lektion

Behörigheter på kolumnnivå

Dölj känsliga kolumner.

Lektion 3 av 413 steg

Behörigheter på kolumnnivå är en gratis lektion i SQL Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för SQL Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i SQL Academy innehåller totalt 4 lektioner.

Varför kolumnbehörigheter är viktiga

Alla användare bör inte kunna se alla kolumner i en tabell. En kolumn för salary, en för password_hash eller en för credit_card_number kan finnas i samma tabell som helt offentliga data, till exempel ett användarnamn eller en e-postadress.

Kolumnbehörigheter gör det möjligt att ge åtkomst till specifika kolumner i stället för till hela tabellen, så att känsliga data hålls dolda för användare som saknar berättigad anledning att se dem.

GRANT på en hel tabell

Som standard ger GRANT SELECT ON table en roll möjlighet att läsa alla kolumner. Det fungerar bra för offentliga data, men blir problematiskt när tabellen innehåller både känsliga och icke-känsliga kolumner.

Frågan nedan ger rollen analyst full läsåtkomst till tabellen employees — inklusive salary och SSN.

GRANT SELECT ON employees TO analyst;

Syntax för GRANT på kolumnnivå

PostgreSQL (och standard-SQL) gör det möjligt att ange specifika kolumnnamn i en GRANT-sats. Syntaxen är:

GRANT privilege (col1, col2) ON table TO role;

Exemplet nedan ger rollen analyst behörighet att läsa endast id, name och department — men NOT salary eller ssn.

GRANT SELECT (id, name, department) ON employees TO analyst;

Verifiera kolumnbehörigheter

Ni kan granska kolumnbehörigheter i PostgreSQL genom att fråga vyn information_schema.column_privileges. Den visar vilken roll som har vilken behörighet för vilken kolumn.

SELECT grantee, table_name, column_name, privilege_type
FROM information_schema.column_privileges
WHERE table_name = 'employees'
ORDER BY grantee, column_name;

Vad händer utan rätt kolumner

Om en roll försöker läsa en kolumn som den inte har fått åtkomst till returnerar databasen ett permission denied-fel. Endast referenser till tillåtna kolumner fungerar.

Om analyst endast har fått behörighet till id, name och department misslyckas den första frågan nedan; den andra lyckas.

-- This will fail for analyst (no permission on salary):
-- SELECT id, name, salary FROM employees;

-- This succeeds:
SELECT id, name, department FROM employees;

UPDATE-behörighet på kolumnnivå

Begränsningar på kolumnnivå gäller även för UPDATE. Ni kan tillåta en roll att uppdatera endast specifika kolumner — till exempel låta en helpdeskroll uppdatera en användares status utan att kunna ändra dennes email eller password_hash.

GRANT UPDATE (status) ON users TO helpdesk;

-- helpdesk can now run:
UPDATE users SET status = 'suspended' WHERE id = 42;

Dölja kolumner med vyer

En annan vanlig metod är att skapa en vy som endast exponerar säkra kolumner och sedan ge åtkomst till vyn i stället för till bastabellen. Detta fungerar i alla databaser, inte bara i sådana som stöder GRANT på kolumnnivå.

CREATE VIEW public_employees AS
SELECT id, name, department, hire_date
FROM employees;

GRANT SELECT ON public_employees TO analyst;

Återkalla åtkomst på kolumnnivå

Precis som med GRANT kan Ni använda REVOKE tillsammans med en kolumnlista för att ta bort åtkomst till specifika kolumner. Om en roll hade bred åtkomst på tabellnivå kan Ni behöva återkalla den helt innan Ni ger begränsad åtkomst på kolumnnivå.

-- Remove all SELECT on the table first
REVOKE SELECT ON employees FROM analyst;

-- Then grant only safe columns
GRANT SELECT (id, name, department) ON employees TO analyst;

Kolumnbehörigheter och Row-Level Security tillsammans

Kolumnbehörigheter och Row-Level Security (RLS) kompletterar varandra. RLS styr vilka rader en användare kan se, medan kolumnbehörigheter styr vilka kolumner i dessa rader som är synliga.

Tillsammans bildar de en kraftfull tvådimensionell åtkomstkontroll: begränsa mängden rader OCH dölj känsliga fält i varje rad.

-- RLS policy: employees can see only their own row
CREATE POLICY own_row ON employees
  FOR SELECT
  USING (user_id = current_user_id());

-- Column grant: hide salary even for own row
GRANT SELECT (id, name, department) ON employees TO employee_role;

Använda SECURITY DEFINER-funktioner

När Ni behöver mer finfördelad logik än enkla kolumnlistor kan en SECURITY DEFINER-funktion fungera som en brygga. Funktionen körs med ägarens privilegier (ägaren har full åtkomst till kolumnerna) och returnerar endast det som den väljer att exponera, oavsett vem som anropar den.

CREATE OR REPLACE FUNCTION get_employee_summary(emp_id INT)
RETURNS TABLE(id INT, name TEXT, department TEXT)
SECURITY DEFINER
LANGUAGE sql AS
$$
  SELECT id, name, department
  FROM employees
  WHERE id = emp_id;
$$;

GRANT EXECUTE ON FUNCTION get_employee_summary(INT) TO analyst;

Praktisk design: skiktad kolumnsäkerhet

Ett robust produktionsmönster kombinerar tre lager:

  1. Tabellägarskap — endast applikationens servicekonto äger bastabellen.
  2. Vyer eller GRANT på kolumner — läsroller får endast åtkomst till icke-känsliga kolumner.
  3. Granskningskolumner — logga vilken användare som berörde känsliga data samt tidpunkten, via triggers.

Detta säkerställer att de övriga lagren fortfarande skyddar data även om en roll av misstag får för många privilegier i ett lager.

-- Layer 1: revoke public access
REVOKE ALL ON employees FROM PUBLIC;

-- Layer 2: expose safe columns via view
CREATE VIEW employee_public AS
SELECT id, name, department, hire_date FROM employees;

GRANT SELECT ON employee_public TO reporting_role;

-- Layer 3: audit trigger logs sensitive field reads (pseudocode)
-- CREATE TRIGGER audit_salary AFTER SELECT ON employees ...

Snabbkontroll

Vilken SQL-sats ger korrekt rollen hr_viewer behörighet att endast läsa kolumnerna name och department i tabellen employees?

Sammanfattning: kolumnbehörigheter

Kolumnbehörigheter gör det möjligt att begränsa åtkomsten till enskilda fält i stället för till hela tabeller, så att känsliga data som löner, SSN-uppgifter och lösenordshashar hålls dolda för roller utan behörighet.

Viktiga punkter:

  • Använd GRANT SELECT (col1, col2) ON table TO role för att begränsa vilka kolumner som får läsas.
  • Använd REVOKE med en kolumnlista för att ta bort åtkomst till specifika kolumner.
  • Vyer är ett portabelt alternativ som fungerar i alla databaser.
  • Kombinera kolumnbehörigheter med RLS för tvådimensionell åtkomstkontroll.
  • SECURITY DEFINER-funktioner ger programmatisk filtrering på kolumnnivå med extra logik.

När kolumnsäkerhet tillämpas konsekvent är den ett av de enklaste och mest effektiva sätten att upprätthålla principen om minsta privilegium på datalagret.

Gratis att börja

Lär dig SQL med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
46
Lektioner
183

Vanliga frågor

Är lektionen ”Behörigheter på kolumnnivå” gratis?

Ja – hela texten till ”Behörigheter på kolumnnivå” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i SQL Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i SQL Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Behörigheter på kolumnnivå”?

Dölj känsliga kolumner. Ni övar på SQL Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig SQL Academy?

Du behöver inga förkunskaper. Utbildningen i SQL Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Behörigheter på kolumnnivå”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här SQL Academy-lektionen?

Ja. Varje SQL Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Roller och privilegier
  2. Säkerhetspolicyer på radnivå
  3. Behörigheter på kolumnnivå
  4. Granska åtkomst
← Tillbaka till SQL Academy