[SQL] 어떻게 INFORMATION_SCHEMA를 사용하여 기본 제약 조건을 찾을 수 있습니까?
SQL어떻게 INFORMATION_SCHEMA를 사용하여 기본 제약 조건을 찾을 수 있습니까?
나는 주어진 기본 제약 조건이 존재하는지 테스트하기 위해 노력하고있어. 나는을 sysobjects 테이블,하지만 더 많은 표준 INFORMATION_SCHEMA를 사용하지 않습니다.
내가 전에 테이블과 기본 키 제약 조건을 확인하려면이 옵션을 사용했지만, 난 아무데도 기본 제약 조건이 표시되지 않습니다.
그들은 거기 있습니까? (I는 MS SQL 서버 2000을 사용하고 있습니다).
편집 : 제약 조건의 이름을 얻을 찾고 있어요.
해결법
-
==============================
1.내가 알고있는 것처럼 그들이 INFORMATION_SCHEMA에 표시되지 않도록 기본 값 제약 조건은 ISO 표준의 일부가 아닙니다. INFORMATION_SCHEMA 대신 SQL 서버에서 사용되지 않습니다 시스템 테이블 뷰의이 크로스 플랫폼이기 때문에,하지만 정보가 개체 카탈로그 뷰 사용해야 가능 아닌 경우 (SYS가. *) 작업의 이런 종류의 최선의 선택처럼 보인다 2005 이상.
내가 알고있는 것처럼 그들이 INFORMATION_SCHEMA에 표시되지 않도록 기본 값 제약 조건은 ISO 표준의 일부가 아닙니다. INFORMATION_SCHEMA 대신 SQL 서버에서 사용되지 않습니다 시스템 테이블 뷰의이 크로스 플랫폼이기 때문에,하지만 정보가 개체 카탈로그 뷰 사용해야 가능 아닌 경우 (SYS가. *) 작업의 이런 종류의 최선의 선택처럼 보인다 2005 이상.
다음은 거의 user186476의 대답 @ 동일합니다. 그것은 주어진 열의 기본값 제약의 이름을 반환합니다. 드롭하기 위해 (비 SQL 서버 사용자의 경우, 디폴트의 이름이 필요합니다, 당신은 기본 제약 자신의 이름을하지 않는 경우, SQL 서버 "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'
-
==============================
2.당신은 기본 제약의 상관 관계에있는 테이블 이름과 열 이름을 지정하여 더 많은 결과를 좁힐를 사용할 수 있습니다 :
당신은 기본 제약의 상관 관계에있는 테이블 이름과 열 이름을 지정하여 더 많은 결과를 좁힐를 사용할 수 있습니다 :
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'
-
==============================
3.INFORMATION_SCHEMA 뷰에는 기본 제약 조건 이름은없는 것 같다.
INFORMATION_SCHEMA 뷰에는 기본 제약 조건 이름은없는 것 같다.
사용 SELECT * sysobjects의 FROM WHERE 위해 xtype = 'D'AND 이름 = @name 이름으로 기본 제약 조건을 찾을 수
-
==============================
4.목록 모든 기본 제약과 실행되고있는 데이터베이스의 사용자 테이블에 대한 기본 값 아래 스크립트 :
목록 모든 기본 제약과 실행되고있는 데이터베이스의 사용자 테이블에 대한 기본 값 아래 스크립트 :
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
-
==============================
5.당신은 열 또는 테이블 이름으로 제약을 얻고 싶은, 또는 당신은 데이터베이스의 모든 제약, 다른 답변을보고 싶어합니다. 그러나, 당신은 "주어진 기본 제약 조건이있는 경우 시험 ... 제약의 이름으로"질문에, 즉, 요청 정확히 후 훨씬 쉽게 방법이 찾고있는 경우.
당신은 열 또는 테이블 이름으로 제약을 얻고 싶은, 또는 당신은 데이터베이스의 모든 제약, 다른 답변을보고 싶어합니다. 그러나, 당신은 "주어진 기본 제약 조건이있는 경우 시험 ... 제약의 이름으로"질문에, 즉, 요청 정확히 후 훨씬 쉽게 방법이 찾고있는 경우.
여기에 모든에서 sysobjects의 다른 SYS 테이블을 사용하지 않는 미래 지향적 대답입니다 :
IF object_id('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN -- constraint exists, work with it. END
-
==============================
6.
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
-
==============================
7.당신이 찾고있는 무엇을 INFORMATION_SCHEMA.COLUMNS의 COLUMN_DEFAULT 열인가?
당신이 찾고있는 무엇을 INFORMATION_SCHEMA.COLUMNS의 COLUMN_DEFAULT 열인가?
-
==============================
8.
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
-
==============================
9.Necromancing. 당신은 단지 기본-제약 조건이 존재하는지 확인해야하는 경우 (기본적으로 제약 조건 (들)을 제대로 관리 DB를 다른 이름을 가질 수 있습니다) 사용 INFORMATION_SCHEMA.COLUMNS (column_default) :
Necromancing. 당신은 단지 기본-제약 조건이 존재하는지 확인해야하는 경우 (기본적으로 제약 조건 (들)을 제대로 관리 DB를 다른 이름을 가질 수 있습니다) 사용 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
당신은 단지 제약 조건 이름을 확인하려면 :
-- Alternative way: IF OBJECT_ID('DF_CONSTRAINT_NAME', 'D') IS NOT NULL BEGIN -- constraint exists, deal with it. END
그리고 마지막으로, 당신은 단지보기라는 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' */
-
==============================
10.나는 그것이 INFORMATION_SCHEMA에서 생각하지 않습니다 - 당신은 아마 sysobjects의 또는 관련되지 않는 테이블 / 뷰를 사용해야합니다.
나는 그것이 INFORMATION_SCHEMA에서 생각하지 않습니다 - 당신은 아마 sysobjects의 또는 관련되지 않는 테이블 / 뷰를 사용해야합니다.
당신은 INFORMATION_SCHEMA.TABLE_CONSTRAINTS이의 유형이있을 것입니다 생각,하지만 난 하나를 볼 수 없습니다.
-
==============================
11.아마 다른 SQL DBMS를 "기본 제약 조건"중 일부는 정말 제한되지 않습니다에 있기 때문에, 당신은 다른 사람이 이미 언급 한 바와 같이 가장 좋은 건 "INFORMATION_SCHEMA.COLUMNS"그래서, "INFORMATION_SCHEMA.TABLE_CONSTRAINTS"에서 이름을 찾을 수 있습니다.
아마 다른 SQL DBMS를 "기본 제약 조건"중 일부는 정말 제한되지 않습니다에 있기 때문에, 당신은 다른 사람이 이미 언급 한 바와 같이 가장 좋은 건 "INFORMATION_SCHEMA.COLUMNS"그래서, "INFORMATION_SCHEMA.TABLE_CONSTRAINTS"에서 이름을 찾을 수 있습니다.
(여기 SQLServer에-무지한)
난 당신이있을 때 생각할 수있는 유일한 이유는 SQLServer를 지원하지 않는 경우의 이름은 "기본 제약 조건을"알고 명령 "ALTER TABLE은 ALTER COLUMN의 YYY의 기본값 설정을 ... xxx는". 하지만 당신은 표준이 아닌 영역에 이미 당신은 당신이 필요로하는 것을 얻기 위해 제품 별 방법을 사용해야합니다.
-
==============================
12.어떻게 CHECK_CONSTRAINTS 및 CONSTRAINT_COLUMN_USAGE의 조합을 사용하는 방법에 대한 :
어떻게 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
-
==============================
13.나는 모든 기본값 (sp_bindefault)와 다음 스크립트와 모든 기본 제약 조건을 검색하기 위해 다음 스크립트를 사용하고 있습니다 :
나는 모든 기본값 (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 = ''
-
==============================
14.개체 카탈로그보기 : sys.default_constraints
개체 카탈로그보기 : 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;
from https://stackoverflow.com/questions/141682/how-do-i-find-a-default-constraint-using-information-schema by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 오라클 SQL을 사용하여 현재 연도를받을 수 있나요? (0) | 2020.06.23 |
---|---|
[SQL] SQL 서버 커서에서 여러 값을 가져옵니다 (0) | 2020.06.22 |
[SQL] 어떻게 말끔를 사용하여 효율적으로 집계 개체를 선택합니까? (0) | 2020.06.22 |
[SQL] 협회를 통해 쿼리는 가장 최근의 기록으로 제한 난간? (0) | 2020.06.22 |
[SQL] 각 행에 대해 MySQL을 자동 저장 날짜 (0) | 2020.06.22 |