sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man returnerar alla otillförlitliga utländska nyckelbegränsningar i SQL Server (T-SQL-exempel)

För att returnera en lista över alla opålitliga främmande nyckelbegränsningar i en SQL Server-databas kan du köra T-SQL-koden nedan.

En otillförlitlig främmande nyckel är en som har sin is_not_trusted flaggan inställd på 1 .

Exempel 1 – Returnera endast obetrodda utländska nyckelbegränsningar

Den här frågan returnerar endast de opålitliga begränsningarna för främmande nyckel i den aktuella databasen. För det här exemplet returnerar jag bara namnet på begränsningen, dess betrodda status, tillsammans med dess aktiverade/inaktiverade status.

SELECT 
  name AS 'Constraint',
  is_not_trusted,
  is_disabled
FROM sys.foreign_keys
WHERE is_not_trusted = 1;

Resultat:

+------------------------+------------------+---------------+
| Constraint             | is_not_trusted   | is_disabled   |
|------------------------+------------------+---------------|
| FK_BandMember_Band     | 1                | 1             |
| FK_BandMember_Musician | 1                | 0             |
+------------------------+------------------+---------------+

Detta frågar efter sys.foreign_keys systemvy. Vi vet att det bara returnerar opålitliga begränsningar eftersom WHERE sats anger endast rader som har is_not_trusted kolumn inställd på 1 .

Om du bara vill returnera betrodd begränsningar för främmande nyckel, ändra helt enkelt 1 till 0 .

Jag har också inkluderat is_disabled flagga, eftersom den visar oss om begränsningen för närvarande är aktiverad eller inte. Vi kan se att en av begränsningarna är aktiverad och den andra inte.

Detta visar det faktum att en begränsning kan vara obetrodd även när den är aktiverad. Detta beror på att när du aktiverar (eller skapar) en begränsning har du möjlighet att få den att kontrollera befintlig data innan den aktiveras. Om du väljer att inte kontrollera befintliga data förblir begränsningen opålitlig när den har aktiverats.

Här är samma fråga igen, men den här gången inkluderar jag tabellen och den refererade tabellen för varje begränsning:

SELECT 
  name AS 'Constraint',
  OBJECT_NAME(parent_object_id) AS 'Table',
  OBJECT_NAME(referenced_object_id) AS 'Referenced Table',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys
WHERE is_not_trusted = 1;

Resultat:

+------------------------+------------+--------------------+---------------+------------------+
| Constraint             | Table      | Referenced Table   | is_disabled   | is_not_trusted   |
|------------------------+------------+--------------------+---------------+------------------|
| FK_BandMember_Band     | BandMember | Band               | 1             | 1                |
| FK_BandMember_Musician | BandMember | Musician           | 0             | 1                |
+------------------------+------------+--------------------+---------------+------------------+

Exempel 2 – Returnera alla utländska nyckelbegränsningar

Följande fråga returnerar alla främmande nyckelbegränsningar för den aktuella databasen (inte bara de otillförlitliga):

SELECT 
  name AS 'Constraint',
  is_not_trusted,
  is_disabled
FROM sys.foreign_keys;

Resultat:

+--------------------------------+------------------+---------------+
| Constraint                     | is_not_trusted   | is_disabled   |
|--------------------------------+------------------+---------------|
| FK_BandMember_Band             | 1                | 1             |
| FK_BandMember_Musician         | 1                | 0             |
| FK_MembershipPeriod_BandMember | 0                | 0             |
+--------------------------------+------------------+---------------+

  1. Förbättrar Foreign Key frågeprestanda?

  2. Vad är det bästa sättet att avgöra vilken version av Oracle-klienten jag kör?

  3. Java JDBC-åtkomst nekad för användaren

  4. Finns det en prestandaskillnad mellan CTE , Sub-Query, Temporary tabell eller Tabellvariabel?