Jak znaleźć domyślne ograniczenie za pomocą schematu informacyjnego?
Próbuję sprawdzić, czy dane ograniczenie domyślne istnieje. Nie chcę używać tabeli sysobjects, ale bardziej standardowej INFORMATION_SCHEMA.
Używałem tego do sprawdzania tabel i podstawowych ograniczeń klucza, ale nigdzie nie widzę domyślnych ograniczeń.
Nie ma ich tam? (Używam MS SQL Server 2000).
EDIT: Szukam nazwy ograniczenia.
13 answers
Jak rozumiem, domyślne ograniczenia wartości nie są częścią standardu ISO, więc nie pojawiają się w INFORMATION_SCHEMA. INFORMATION_SCHEMA wydaje się najlepszym wyborem dla tego rodzaju zadań, ponieważ jest wieloplatformowy, ale jeśli informacje nie są dostępne, należy użyć widoku katalogu obiektów (sys.* ) zamiast systemowych widoków tabel, które są przestarzałe w SQL Server 2005 i nowszych.
Poniżej jest prawie taka sama jak odpowiedź @user186476. Zwraca nazwę domyślnej ograniczenie wartości dla danej kolumny. (Dla użytkowników innych niż SQL Server, potrzebujesz nazwy domyślnej, aby ją usunąć, a jeśli nie podasz nazwy domyślnego ograniczenia, SQL Server tworzy jakąś szaloną nazwę, taką jak "DF_TableN_Colum_95AFE4B5". Aby ułatwić zmianę schematu w przyszłości, zawsze wyraźnie nazwij swoje ograniczenia!)
-- 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'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 12:56:40
Możesz użyć poniższej opcji, aby jeszcze bardziej zawęzić wyniki, podając nazwę tabeli i nazwę kolumny, z którą powiązane jest domyślne ograniczenie:
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'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-04 13:20:15
W widokach Information_Schema
nie ma domyślnych nazw ograniczeń.
Użyj SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name
aby znaleźć domyślne ograniczenie po nazwie
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-09 20:11:10
Poniższy skrypt wyświetla wszystkie domyślne ograniczenia oraz domyślne wartości tabel użytkownika w bazie danych, w której jest uruchamiany:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-13 09:36:06
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 08:25:37
Jeśli chcesz uzyskać ograniczenie według nazw kolumn lub tabel lub chcesz uzyskać wszystkie ograniczenia w bazie danych, poszukaj innych odpowiedzi. Jeśli jednak szukasz dokładnie tego, co pytanie zadaje, a mianowicie, aby "sprawdzić, czy dane ograniczenie domyślne istnieje ... przez nazwę ograniczenia " , wtedy jest o wiele łatwiejszy sposób.
Oto przyszłościowa odpowiedź, która w ogóle nie używa tabel sysobjects
ani innych sys
:
IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
-- constraint exists, work with it.
END
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-24 19:00:35
Jest kolumną COLUMN_DEFAULT INFORMATION_SCHEMA.Kolumny czego szukasz?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 20:38:17
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 01:28:44
Nie wydaje mi się, aby było to w INFORMATION_SCHEMA - prawdopodobnie będziesz musiał użyć sysobjects lub powiązanych przestarzałych tabel/widoków.
Można by pomyśleć, że w INFORMATION_SCHEMA będzie taki typ.TABLE_CONSTRAINTS, ale nie widzę żadnego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 21:26:54
Prawdopodobnie dlatego, że w niektórych innych bazach danych SQL "domyślne ograniczenie" nie jest tak naprawdę ograniczeniem, nie znajdziesz jego nazwy w " INFORMATION_SCHEMA.TABLE_CONSTRAINTS", więc najlepszym rozwiązaniem jest " INFORMATION_SCHEMA.Felietony " jak już wspominali inni.
(SQLServer-tutaj)
Jedynym powodem, dla którego przychodzi mi na myśl, kiedy musisz znać nazwę "domyślnego ograniczenia", jest to, że SQLServer nie obsługuje komendy "ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT..."
. Ale wtedy jesteś już w niestandardowej strefie I ty musisz użyć specyficznych dla produktu sposobów, aby uzyskać to, czego potrzebujesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-27 00:03:53
Jak o użyciu kombinacji CHECK_CONSTRAINTS i CONSTRAINT_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
Używam folllowing script do odzyskiwania wszystkich domyślnych (sp_binddefaults) i wszystkich domyślnych ograniczeń za pomocą następujących skryptów:
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 = ''
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 09:22:15
Widok katalogu obiektów : sys . default_constraints
Widoki schematów informacyjnych INFORMATION_SCHEMA
są zgodne z ANSI, ale domyślne ograniczenia nie są częścią standardu ISO. Microsoft SQL Server udostępnia widoki katalogów systemu do uzyskiwania informacji o metadanych obiektów SQL Server.
sys.default_constraints
widok katalogu systemu używany do uzyskiwania informacji o domyślnych ograniczeniach.
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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 11:00:50