INFORMATION_SCHEMAを使用してデフォルトの制約を見つけるにはどうすればよいですか?
-
02-07-2019 - |
質問
既定の制約が存在するかどうかをテストしようとしています。 sysobjectsテーブルは使用しませんが、より標準的なINFORMATION_SCHEMAを使用します。
これを使用して以前にテーブルと主キー制約を確認しましたが、デフォルトの制約はどこにも表示されません。
彼らはそこにいないのですか? (私はMS SQL Server 2000を使用しています)。
編集:制約の名前を取得しようとしています。
解決
私が理解しているように、デフォルト値の制約はISO標準の一部ではないため、INFORMATION_SCHEMAには表示されません。 INFORMATION_SCHEMAはクロスプラットフォームであるため、この種のタスクに最適な選択肢のようですが、情報が利用できない場合は、SQL Serverで非推奨となったシステムテーブルビューの代わりにオブジェクトカタログビュー(sys。*)を使用する必要があります2005以降。
以下は@ user186476の答えとほとんど同じです。指定された列のデフォルト値制約の名前を返します。 (SQL Server以外のユーザーの場合、デフォルトの名前を削除する必要があります。デフォルトの制約に自分で名前を付けないと、SQL Serverは" DF_TableN_Colum_95AFE4B5"のようなおかしな名前を作成します。将来スキーマを変更し、常に明示的に制約に名前を付けてください!)
-- 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'
他のヒント
以下を使用して、デフォルト制約が相関するテーブル名と列名を指定することにより、結果をさらに絞り込むことができます。
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'
Information_Schema
ビューにはデフォルトの制約名がないようです。
SELECT * FROM sysobjects WHERE xtype = 'D' AND name = @name
を使用します
名前でデフォルトの制約を見つける
以下のスクリプトは、実行されているデータベース内のユーザーテーブルのすべてのデフォルトの制約とデフォルト値をリストします。
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
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
列またはテーブル名で制約を取得する場合、またはデータベース内のすべての制約を取得する場合は、他の回答を参照してください。ただし、質問がまさに求めるものを探している場合、つまり、"既定の制約が存在するかどうかをテストする...制約の名前" によって、はるかに簡単です方法。
これは、 sysobjects
やその他の sys
テーブルをまったく使用しない、将来性のある回答です。
IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN
-- constraint exists, work with it.
END
INFORMATION_SCHEMA.COLUMNSのCOLUMN_DEFAULT列は探しているものですか?
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
INFORMATION_SCHEMAにあるとは思わない-おそらくsysobjectsまたは関連する非推奨のテーブル/ビューを使用する必要があるでしょう。
これにはINFORMATION_SCHEMA.TABLE_CONSTRAINTSにタイプがあると思われますが、表示されません。
おそらく、他のSQL DBMSの一部では、「デフォルトの制約」がは実際には制約ではないので、その名前は&quot; INFORMATION_SCHEMA.TABLE_CONSTRAINTS&quot;にはないので、最善の策は&quot; INFORMATION_SCHEMA.COLUMNS&quot;です。他の人がすでに言及したように。
(SQLServer-ignoramus here)
&quot; default constraint&quot;の名前を知る必要があるときに考えられる唯一の理由は、SQLServerが&quot; ALTER TABLE xxx ALTER COLUMN yyy SET DEFAULT ...&quot;をサポートしていない場合です。
コマンド。ただし、すでに非標準ゾーンにいるため、必要なものを入手するには製品固有の方法を使用する必要があります。
CHECK_CONSTRAINTSと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
次のスクリプトを使用して、すべてのデフォルト(sp_bindefault)およびすべてのデフォルトの制約を次のスクリプトで取得しています。
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 = ''
オブジェクトカタログビュー:sys.default_constraints
情報スキーマビュー INFORMATION_SCHEMA
はANSI準拠ですが、デフォルトの制約はISO標準の一部ではありません。 Microsoft SQL Serverは、SQL Serverオブジェクトのメタデータに関する情報を取得するためのシステムカタログビューを提供します。
sys.default_constraints
デフォルトの制約に関する情報を取得するために使用されるシステムカタログビュー。
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;