Hoe vind ik een standaardbeperking met INFORMATION_SCHEMA?

Ik probeer te testen of een bepaalde standaardbeperking bestaat. Ik wil niet de sysobjects-tabel gebruiken, maar de meer standaard INFORMATION_SCHEMA.

Ik heb dit eerder gebruikt om te controleren op tabellen en primaire-sleutelbeperkingen, maar ik zie nergens standaardbeperkingen.

Zijn ze er niet? (Ik gebruik MS SQL Server 2000).

EDIT: ik ben op zoek naar de naam van de beperking.


Antwoord 1, autoriteit 100%

Voor zover ik het begrijp, maken standaardwaardebeperkingen geen deel uit van de ISO-standaard, dus verschijnen ze niet in INFORMATION_SCHEMA. INFORMATION_SCHEMA lijkt de beste keuze voor dit soort taken omdat het platformonafhankelijk is, maar als de informatie niet beschikbaar is, moet men de objectcatalogusweergaven (sys.*) gebruiken in plaats van systeemtabelweergaven, die in SQL Server zijn verouderd 2005 en later.

Hieronder is vrijwel hetzelfde als het antwoord van @user186476. Het retourneert de naam van de standaardwaardebeperking voor een bepaalde kolom. (Voor niet-SQL Server-gebruikers, je hebt de naam van de standaard nodig om deze te verwijderen, en als je de standaardbeperking niet zelf een naam geeft, maakt SQL Server een gekke naam zoals “DF_TableN_Colum_95AFE4B5”. Om het gemakkelijker te maken om te veranderen uw schema in de toekomst, benoem altijd expliciet uw beperkingen!)

-- returns name of a column's default value constraint 
SELECT
    default_constraints.name
FROM 
    sys.all_columns
        INNER JOIN
    sys.tables
        ON all_columns.object_id = tables.object_id
        INNER JOIN 
    sys.schemas
        ON tables.schema_id = schemas.schema_id
        INNER JOIN
    sys.default_constraints
        ON all_columns.default_object_id = default_constraints.object_id
WHERE 
        schemas.name = 'dbo'
    AND tables.name = 'tablename'
    AND all_columns.name = 'columnname'

Antwoord 2, autoriteit 34%

U kunt het volgende gebruiken om de resultaten nog verder te verfijnen door de tabelnaam en kolomnaam op te geven waarmee de standaardbeperking overeenkomt:

select * from sysobjects o 
inner join syscolumns c
on o.id = c.cdefault
inner join sysobjects t
on c.id = t.id
where o.xtype = 'D'
and c.name = 'Column_Name'
and t.name = 'Table_Name'

Antwoord 3, autoriteit 30%

Er lijken geen namen van standaardbeperkingen te zijn in de INFORMATION_SCHEMA-weergaven.

gebruik SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name
om een ​​standaardbeperking op naam te vinden


Antwoord 4, autoriteit 10%

Het onderstaande script vermeldt alle standaardbeperkingen en de standaardwaarden voor de gebruikerstabellen in de database waarin het wordt uitgevoerd:

SELECT  
        b.name AS TABLE_NAME,
        d.name AS COLUMN_NAME,
        a.name AS CONSTRAINT_NAME,
        c.text AS DEFAULT_VALUE
FROM sys.sysobjects a INNER JOIN
        (SELECT name, id
         FROM sys.sysobjects 
         WHERE xtype = 'U') b on (a.parent_obj = b.id)
                      INNER JOIN sys.syscomments c ON (a.id = c.id)
                      INNER JOIN sys.syscolumns d ON (d.cdefault = a.id)                                          
 WHERE a.xtype = 'D'        
 ORDER BY b.name, a.name

Antwoord 5, autoriteit 6%

Als je een beperking wilt krijgen op basis van de kolom- of tabelnamen, of als je alle beperkingen in de database wilt zien, kijk dan naar andere antwoorden. Als u echter precies zoekt naar wat de vraag vraagt, namelijk om “te testen of een bepaalde standaardbeperking bestaat … door de naam van de beperking”, dan is er een veel eenvoudigere manier .

Hier is een toekomstbestendig antwoord dat helemaal geen gebruik maakt van de sysobjectsof andere systabellen:

IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
   -- constraint exists, work with it.
END

Antwoord 6, autoriteit 2%

select c.name, col.name from sys.default_constraints c
    inner join sys.columns col on col.default_object_id = c.object_id
    inner join sys.objects o  on o.object_id = c.parent_object_id
    inner join sys.schemas s on s.schema_id = o.schema_id
where s.name = @SchemaName and o.name = @TableName and col.name = @ColumnName

Antwoord 7

Is de COLUMN_DEFAULT kolom van INFORMATION_SCHEMA.COLUMNS wat u zoekt?


Antwoord 8

Necromancing.
Als je hoeft alleen maar te controleren of een standaard-constraint bestaat
(Default-constraint (s) kunnen andere naam hebben in slecht-managed DBS),
gebruik INFORMATION_SCHEMA.COLUMNS (column_default):

IF NOT EXISTS(
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE (1=1) 
    AND TABLE_SCHEMA = 'dbo' 
    AND TABLE_NAME = 'T_VWS_PdfBibliothek' 
    AND COLUMN_NAME = 'PB_Text'
    AND COLUMN_DEFAULT IS NOT NULL  
)
BEGIN 
    EXECUTE('ALTER TABLE dbo.T_VWS_PdfBibliothek 
                ADD CONSTRAINT DF_T_VWS_PdfBibliothek_PB_Text DEFAULT (N''image'') FOR PB_Text; 
    '); 
END 

Als u wilt controleren door de beperking-naam alleen:

-- Alternative way: 
IF OBJECT_ID('DF_CONSTRAINT_NAME', 'D') IS NOT NULL 
BEGIN
    -- constraint exists, deal with it.
END 

En last but not least, kunt u gewoon een weergave met de naam
INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS:

CREATE VIEW INFORMATION_SCHEMA.DEFAULT_CONSTRAINTS 
AS 
SELECT 
     DB_NAME() AS CONSTRAINT_CATALOG 
    ,csch.name AS CONSTRAINT_SCHEMA
    ,dc.name AS CONSTRAINT_NAME 
    ,DB_NAME() AS TABLE_CATALOG 
    ,sch.name AS TABLE_SCHEMA 
    ,syst.name AS TABLE_NAME 
    ,sysc.name AS COLUMN_NAME 
    ,COLUMNPROPERTY(sysc.object_id, sysc.name, 'ordinal') AS ORDINAL_POSITION 
    ,dc.type_desc AS CONSTRAINT_TYPE 
    ,dc.definition AS COLUMN_DEFAULT 
    -- ,dc.create_date 
    -- ,dc.modify_date 
FROM sys.columns AS sysc -- 46918 / 3892 with inner joins + where 
-- FROM sys.all_columns AS sysc -- 55429 / 3892 with inner joins + where 
INNER JOIN sys.tables AS syst 
    ON syst.object_id = sysc.object_id 
INNER JOIN sys.schemas AS sch
    ON sch.schema_id = syst.schema_id 
INNER JOIN sys.default_constraints AS dc 
    ON sysc.default_object_id = dc.object_id
INNER JOIN sys.schemas AS csch
    ON csch.schema_id = dc.schema_id 
WHERE (1=1) 
AND dc.is_ms_shipped = 0 
/*
WHERE (1=1) 
AND sch.name = 'dbo'
AND syst.name = 'tablename'
AND sysc.name = 'columnname'
*/

Antwoord 9

WHILE EXISTS( 
    SELECT * FROM  sys.all_columns 
    INNER JOIN sys.tables ST  ON all_columns.object_id = ST.object_id
    INNER JOIN sys.schemas ON ST.schema_id = schemas.schema_id
    INNER JOIN sys.default_constraints ON all_columns.default_object_id = default_constraints.object_id
    WHERE 
    schemas.name = 'dbo'
    AND ST.name = 'MyTable'
)
BEGIN 
DECLARE @SQL NVARCHAR(MAX) = N'';
SET @SQL = (  SELECT TOP 1
     'ALTER TABLE ['+  schemas.name + '].[' + ST.name + '] DROP CONSTRAINT ' + default_constraints.name + ';'
   FROM 
      sys.all_columns
         INNER JOIN
      sys.tables ST
         ON all_columns.object_id = ST.object_id
         INNER JOIN 
      sys.schemas
         ON ST.schema_id = schemas.schema_id
         INNER JOIN
      sys.default_constraints
         ON all_columns.default_object_id = default_constraints.object_id
   WHERE 
         schemas.name = 'dbo'
      AND ST.name = 'MyTable'
      )
   PRINT @SQL
   EXECUTE sp_executesql @SQL 
   --End if Error 
   IF @@ERROR <> 0 
   BREAK
END 

Antwoord 10

Ik denk niet dat het in de INFORMATION_SCHEMA -. Zul je waarschijnlijk moeten sysobjects of gerelateerde deprecated tabellen / views gebruiken

Je zou denken dat er een type voor deze in INFORMATION_SCHEMA.TABLE_CONSTRAINTS zijn, maar ik denk niet te zien.


Antwoord 11

Waarschijnlijk omdat op sommige van de andere SQL DBMS’s de “standaardbeperking” niet echt een beperking is, zult u de naam niet vinden in “INFORMATION_SCHEMA.TABLE_CONSTRAINTS”, dus uw beste gok is “INFORMATION_SCHEMA.COLUMNS”, zoals anderen hebben gedaan al genoemd.

(SQLServer-ignoramus hier)

De enige reden die ik kan bedenken wanneer je de naam van de “default constraint” moet weten, is dat SQLServer "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."commando. Maar dan zit je al in een niet-standaard zone en moet je de productspecifieke manieren gebruiken om te krijgen wat je nodig hebt.


Antwoord 12

Wat dacht je van een combinatie van CHECK_CONSTRAINTS en CONSTRRAINT_COLUMN_USAGE:

   select columns.table_name,columns.column_name,columns.column_default,checks.constraint_name
          from information_schema.columns columns
             inner join information_schema.constraint_column_usage usage on 
                  columns.column_name = usage.column_name and columns.table_name = usage.table_name
             inner join information_schema.check_constraints checks on usage.constraint_name = checks.constraint_name
    where columns.column_default is not null

Antwoord 13

Ik gebruik het volgende script om alle standaardinstellingen (sp_binddefaults) en alle standaardbeperkingen op te halen met de volgende scripts:

SELECT 
    t.name AS TableName, c.name AS ColumnName, SC.COLUMN_DEFAULT AS DefaultValue, dc.name AS DefaultConstraintName
FROM  
    sys.all_columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    JOIN sys.schemas s ON t.schema_id = s.schema_id
    LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
    LEFT JOIN INFORMATION_SCHEMA.COLUMNS SC ON (SC.TABLE_NAME = t.name AND SC.COLUMN_NAME = c.name)
WHERE 
    SC.COLUMN_DEFAULT IS NOT NULL
    --WHERE t.name = '' and c.name = ''

Antwoord 14

Object Catalogusweergave: sys.default_constraints

De weergaven van het informatieschema INFORMATION_SCHEMAzijn ANSI-compatibel, maar de standaardbeperkingen maken geen deel uit van de ISO-standaard. Microsoft SQL Server biedt systeemcatalogusweergaven voor het verkrijgen van informatie over metagegevens van SQL Server-objecten.

sys.default_constraintssysteemcatalogusweergave die wordt gebruikt om de informatie over standaardbeperkingen te verkrijgen.

SELECT so.object_id TableName,
       ss.name AS TableSchema,
       cc.name AS Name,
       cc.object_id AS ObjectID,              
       sc.name AS ColumnName,
       cc.parent_column_id AS ColumnID,
       cc.definition AS Defination,
       CONVERT(BIT,
               CASE cc.is_system_named
                   WHEN 1
                   THEN 1
                   ELSE 0
               END) AS IsSystemNamed,
       cc.create_date AS CreationDate,
       cc.modify_date AS LastModifiednDate
FROM sys.default_constraints cc WITH (NOLOCK)
     INNER JOIN sys.objects so WITH (NOLOCK) ON so.object_id = cc.parent_object_id
     LEFT JOIN sys.schemas ss WITH (NOLOCK) ON ss.schema_id = so.schema_id
     LEFT JOIN sys.columns sc WITH (NOLOCK) ON sc.column_id = cc.parent_column_id
                                               AND sc.object_id = cc.parent_object_id
ORDER BY so.name,
         cc.name;

Antwoord 15

Een wat schonere manier om dit te doen:

SELECT DC.[name]
  FROM [sys].[default_constraints] AS DC
  WHERE DC.[parent_object_id] = OBJECT_ID('[Schema].[TableName]') 

Other episodes