[SQL] 어떻게 SQL Server의 특정 테이블을 참조하는 모든 외래 키를 나열 할 수 있습니다?
SQL어떻게 SQL Server의 특정 테이블을 참조하는 모든 외래 키를 나열 할 수 있습니다?
나는 SQL Server 데이터베이스에 매우 참조 테이블을 제거해야합니다. 어떻게 내가 테이블을 삭제하기 위해 제거해야합니다 모든 외래 키 제약 조건의 목록을 얻을 수 있나요?
(SQL은 관리 스튜디오의 GUI에 대한 바람직 이상의 클릭에 응답합니다.)
해결법
-
==============================
1.확실하지 아무도 제안하지하지만 주어진 테이블에 대한 쿼리 외래 키에 sp_fkeys를 사용하는 이유 :
확실하지 아무도 제안하지하지만 주어진 테이블에 대한 쿼리 외래 키에 sp_fkeys를 사용하는 이유 :
EXEC sp_fkeys 'TableName'
또한 스키마를 지정할 수 있습니다 :
EXEC sp_fkeys @pktable_name = 'TableName', @pktable_owner = 'dbo'
스키마를 지정하지 않고, 워드 프로세서는 다음을 진술 :
-
==============================
2.이 SQL Server 2008의 나를 위해 일한 (2005이없는) - I SQL Server Management Studio의 데이터베이스 다이어그램 기능을 사용하려고하지만 그 밖으로 지배하기 때문이다.
이 SQL Server 2008의 나를 위해 일한 (2005이없는) - I SQL Server Management Studio의 데이터베이스 다이어그램 기능을 사용하려고하지만 그 밖으로 지배하기 때문이다.
테이블 및 열 이름을 참조 목록을 얻으려면 ...
select t.name as TableWithForeignKey, fk.constraint_column_id as FK_PartNo, c. name as ForeignKeyColumn from sys.foreign_key_columns as fk inner join sys.tables as t on fk.parent_object_id = t.object_id inner join sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id where fk.referenced_object_id = (select object_id from sys.tables where name = 'TableOthersForeignKeyInto') order by TableWithForeignKey, FK_PartNo
외래 키 제약 조건의 이름을 얻으려면
select distinct name from sys.objects where object_id in ( select fk.constraint_object_id from sys.foreign_key_columns as fk where fk.referenced_object_id = (select object_id from sys.tables where name = 'TableOthersForeignKeyInto') )
-
==============================
3.이것은 당신을 제공합니다 :
이것은 당신을 제공합니다 :
코드 아래 :
SELECT obj.name AS FK_NAME, sch.name AS [schema_name], tab1.name AS [table], col1.name AS [column], tab2.name AS [referenced_table], col2.name AS [referenced_column] FROM sys.foreign_key_columns fkc INNER JOIN sys.objects obj ON obj.object_id = fkc.constraint_object_id INNER JOIN sys.tables tab1 ON tab1.object_id = fkc.parent_object_id INNER JOIN sys.schemas sch ON tab1.schema_id = sch.schema_id INNER JOIN sys.columns col1 ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id INNER JOIN sys.tables tab2 ON tab2.object_id = fkc.referenced_object_id INNER JOIN sys.columns col2 ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
-
==============================
4.이 시도 :
이 시도 :
sp_help 'TableName'
-
==============================
5.또한 다른 개체에 대한 참조를 염두해야한다.
또한 다른 개체에 대한 참조를 염두해야한다.
테이블이 매우 그것은 아마도 매우 같은 뷰, 저장 프로 시저, 함수 등과 같은 다른 개체가 참조하는 것보다 다른 테이블에 의해 참조 된 경우.
당신은 단지 SQL을 함께하고 싶어 오류가 경향이있을 수있는 다른 개체의 종속성을 검색하기 때문에 정말 같은 '종속성보기'SSMS 대화 또는 이것에 대한 ApexSQL 검색 등의 무료 도구로 GUI 도구를 권 해드립니다.
SQL이 유일한 옵션 인 경우에는 다음과 같이 그 일을 시도 할 수 있습니다.
select O.name as [Object_Name], C.text as [Object_Definition] from sys.syscomments C inner join sys.all_objects O ON C.id = O.object_id where C.text like '%table_name%'
-
==============================
6.원래 질문은 테이블을 제거 할 수 있도록 고도의 참조 된 테이블에 모든 외부 키의 목록을 얻으려면 물었다.
원래 질문은 테이블을 제거 할 수 있도록 고도의 참조 된 테이블에 모든 외부 키의 목록을 얻으려면 물었다.
이 작은 쿼리 반환 모든 특정 테이블에 모든 외부 키를 삭제하는 데 필요한 명령 '외래 키를 드롭'
SELECT 'ALTER TABLE ['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' '[DropCommand]' FROM sys.foreign_key_columns fk JOIN sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id JOIN sys.schemas sch ON referencingTable.schema_id = sch.schema_id JOIN sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id JOIN sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id WHERE referencedTable.name = 'MyTableName'
출력 예 :
[DropCommand] ALTER TABLE [dbo].[OtherTable1] DROP CONSTRAINT [FK_OtherTable1_MyTable] ALTER TABLE [dbo].[OtherTable2] DROP CONSTRAINT [FK_OtherTable2_MyTable]
생락 WHERE 절은 현재 데이터베이스의 모든 외부 키의 드롭 명령을 얻을 수 있습니다.
-
==============================
7.여기 내가 사용하는 것이 SQL 코드입니다.
여기 내가 사용하는 것이 SQL 코드입니다.
SELECT f.name AS 'Name of Foreign Key', OBJECT_NAME(f.parent_object_id) AS 'Table name', COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Fieldname', OBJECT_NAME(t.object_id) AS 'References Table name', COL_NAME(t.object_id,fc.referenced_column_id) AS 'References fieldname', 'ALTER TABLE [' + OBJECT_NAME(f.parent_object_id) + '] DROP CONSTRAINT [' + f.name + ']' AS 'Delete foreign key', 'ALTER TABLE [' + OBJECT_NAME(f.parent_object_id) + '] WITH NOCHECK ADD CONSTRAINT [' + f.name + '] FOREIGN KEY([' + COL_NAME(fc.parent_object_id,fc.parent_column_id) + ']) REFERENCES ' + '[' + OBJECT_NAME(t.object_id) + '] ([' + COL_NAME(t.object_id,fc.referenced_column_id) + '])' AS 'Create foreign key' -- , delete_referential_action_desc AS 'UsesCascadeDelete' FROM sys.foreign_keys AS f, sys.foreign_key_columns AS fc, sys.tables t WHERE f.OBJECT_ID = fc.constraint_object_id AND t.OBJECT_ID = fc.referenced_object_id AND OBJECT_NAME(t.object_id) = 'Employees' -- Just show the FKs which reference a particular table ORDER BY 2
너무의 예를 살펴 보자하지 특히 명확 SQL입니다.
그래서 가정하면 나는 마이크로 소프트의 사랑하여 Northwind 데이터베이스의 Employees 테이블을 삭제하고 싶어하지만, SQL 서버는 하나 이상의 외부 키는이 일에서 저를 방지 있다고 내게 말했다.
SQL 명령은 위의 결과를 반환 ...
그것은 직원 테이블을 참조하는 3 외래 키 있다는 것을 나에게 보여줍니다. 즉, 나는이 세 가지 외래 키가 먼저 삭제 될 때까지이 표를 (드롭)을 삭제하도록 허용하지 않을 것입니다.
결과에서 첫 번째 행은 다음과 같은 외래 키 제약 조건이 결과에 표시 될 방법이다.
ALTER TABLE [dbo].[Employees] WITH NOCHECK ADD CONSTRAINT [FK_Employees_Employees] FOREIGN KEY([ReportsTo]) REFERENCES [dbo].[Employees] ([EmployeeID])
마지막 두 번째 열 쇼는 SQL 명령은 내가이 외래 키, 예를 들어 중 하나를 삭제하는 데 사용해야합니다 :
ALTER TABLE [Employees] DROP CONSTRAINT [FK_Employees_Employees]
... 그리고 오른쪽 열 쇼는 SQL 그것을 만들 수 ...
ALTER TABLE [Employees] WITH NOCHECK ADD CONSTRAINT [FK_Employees_Employees] FOREIGN KEY([ReportsTo]) REFERENCES [Employees] ([EmployeeID])
이러한 모든 명령으로, 당신은 모든 것을 가지고 당신은 나중에 다시 작성, 테이블을 삭제 할 수 있도록 관련 외부 키를 삭제해야합니다.
휴. 도움이 되었기를 바랍니다.
-
==============================
8.
SELECT PKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), PKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O1.SCHEMA_ID)), PKTABLE_NAME = CONVERT(SYSNAME,O1.NAME), PKCOLUMN_NAME = CONVERT(SYSNAME,C1.NAME), FKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), FKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O2.SCHEMA_ID)), FKTABLE_NAME = CONVERT(SYSNAME,O2.NAME), FKCOLUMN_NAME = CONVERT(SYSNAME,C2.NAME), -- Force the column to be non-nullable (see SQL BU 325751) --KEY_SEQ = isnull(convert(smallint,k.constraint_column_id), sysconv(smallint,0)), UPDATE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsUpdateCascade') WHEN 1 THEN 0 ELSE 1 END), DELETE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsDeleteCascade') WHEN 1 THEN 0 ELSE 1 END), FK_NAME = CONVERT(SYSNAME,OBJECT_NAME(F.OBJECT_ID)), PK_NAME = CONVERT(SYSNAME,I.NAME), DEFERRABILITY = CONVERT(SMALLINT,7) -- SQL_NOT_DEFERRABLE FROM SYS.ALL_OBJECTS O1, SYS.ALL_OBJECTS O2, SYS.ALL_COLUMNS C1, SYS.ALL_COLUMNS C2, SYS.FOREIGN_KEYS F INNER JOIN SYS.FOREIGN_KEY_COLUMNS K ON (K.CONSTRAINT_OBJECT_ID = F.OBJECT_ID) INNER JOIN SYS.INDEXES I ON (F.REFERENCED_OBJECT_ID = I.OBJECT_ID AND F.KEY_INDEX_ID = I.INDEX_ID) WHERE O1.OBJECT_ID = F.REFERENCED_OBJECT_ID AND O2.OBJECT_ID = F.PARENT_OBJECT_ID AND C1.OBJECT_ID = F.REFERENCED_OBJECT_ID AND C2.OBJECT_ID = F.PARENT_OBJECT_ID AND C1.COLUMN_ID = K.REFERENCED_COLUMN_ID AND C2.COLUMN_ID = K.PARENT_COLUMN_ID
-
==============================
9.가장 간단한 하나는 SQL에서 sys.foreign_keys_columns을 사용하는 것입니다. 다음 표는 참조 된 열 ID 참조 된 테이블 ID뿐만 아니라 참조하는 열 및 테이블 WRT 모든 외래 키의 개체 ID를 포함합니다. 이드의 유골 상수로서 그 결과는 스키마뿐만 아니라 테이블의 추가 수정을위한 신뢰할 수있는 것입니다.
가장 간단한 하나는 SQL에서 sys.foreign_keys_columns을 사용하는 것입니다. 다음 표는 참조 된 열 ID 참조 된 테이블 ID뿐만 아니라 참조하는 열 및 테이블 WRT 모든 외래 키의 개체 ID를 포함합니다. 이드의 유골 상수로서 그 결과는 스키마뿐만 아니라 테이블의 추가 수정을위한 신뢰할 수있는 것입니다.
질문:
SELECT OBJECT_NAME(fkeys.constraint_object_id) foreign_key_name ,OBJECT_NAME(fkeys.parent_object_id) referencing_table_name ,COL_NAME(fkeys.parent_object_id, fkeys.parent_column_id) referencing_column_name ,OBJECT_SCHEMA_NAME(fkeys.parent_object_id) referencing_schema_name ,OBJECT_NAME (fkeys.referenced_object_id) referenced_table_name ,COL_NAME(fkeys.referenced_object_id, fkeys.referenced_column_id) referenced_column_name ,OBJECT_SCHEMA_NAME(fkeys.referenced_object_id) referenced_schema_name FROM sys.foreign_key_columns AS fkeys
우리는 또한 '어디'를 사용하여 필터를 추가 할 수 있습니다
WHERE OBJECT_NAME(fkeys.parent_object_id) = 'table_name' AND OBJECT_SCHEMA_NAME(fkeys.parent_object_id) = 'schema_name'
-
==============================
10.
SELECT object_name(parent_object_id), object_name(referenced_object_id), name FROM sys.foreign_keys WHERE parent_object_id = object_id('Table Name')
-
==============================
11.나는 외래 키에 관련된 모든 세부 정보를 찾기 위해이 스크립트를 사용하고 있습니다. 나는 INFORMATION.SCHEMA을 사용하고 있습니다. 다음은 SQL 스크립트는 다음과 같습니다
나는 외래 키에 관련된 모든 세부 정보를 찾기 위해이 스크립트를 사용하고 있습니다. 나는 INFORMATION.SCHEMA을 사용하고 있습니다. 다음은 SQL 스크립트는 다음과 같습니다
SELECT ccu.table_name AS SourceTable ,ccu.constraint_name AS SourceConstraint ,ccu.column_name AS SourceColumn ,kcu.table_name AS TargetTable ,kcu.column_name AS TargetColumn FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc ON ccu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON kcu.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME ORDER BY ccu.table_name
-
==============================
12.먼저
먼저
EXEC sp_fkeys 'Table', 'Schema'
그런 다음 결과를 재생 NimbleText를 사용
-
==============================
13.좋은 답변을 위. 그러나 나는 하나 개의 쿼리로 대답을하는 것을 선호합니다. 이 코드 조각은 sys.sp_helpconstraint에서 가져온 것입니다 (SYS PROC)
좋은 답변을 위. 그러나 나는 하나 개의 쿼리로 대답을하는 것을 선호합니다. 이 코드 조각은 sys.sp_helpconstraint에서 가져온 것입니다 (SYS PROC)
즉, TBL에 관련된 외래 키가있는 경우 마이크로 소프트가 보이는 방법이다.
--setup variables. Just change 'Customer' to tbl you want declare @objid int, @objname nvarchar(776) select @objname = 'Customer' select @objid = object_id(@objname) if exists (select * from sys.foreign_keys where referenced_object_id = @objid) select 'Table is referenced by foreign key' = db_name() + '.' + rtrim(schema_name(ObjectProperty(parent_object_id,'schemaid'))) + '.' + object_name(parent_object_id) + ': ' + object_name(object_id) from sys.foreign_keys where referenced_object_id = @objid order by 1
test_db_name.dbo.Account : 대답은 다음과 같이 표시됩니다 FK_Account_Customer을
-
==============================
14.
SELECT OBJECT_NAME(parent_object_id) 'Parent table', c.NAME 'Parent column name', OBJECT_NAME(referenced_object_id) 'Referenced table', cref.NAME 'Referenced column name' FROM sys.foreign_key_columns fkc INNER JOIN sys.columns c ON fkc.parent_column_id = c.column_id AND fkc.parent_object_id = c.object_id INNER JOIN sys.columns cref ON fkc.referenced_column_id = cref.column_id AND fkc.referenced_object_id = cref.object_id where OBJECT_NAME(parent_object_id) = 'tablename'
당신은 모두의 외래 키 관계를 얻고 싶다면 테이블은 절 다른 TABLENAME의 당신의 TABLENAME를 대신 쓸 곳을 제외
-
==============================
15.
SELECT OBJECT_NAME(fk.parent_object_id) as ReferencingTable, OBJECT_NAME(fk.constraint_object_id) as [FKContraint] FROM sys.foreign_key_columns as fk WHERE fk.referenced_object_id = OBJECT_ID('ReferencedTable', 'U')
(가) 외래 키 제약 조건이있는 경우에만 관계를 보여줍니다. 내 데이터베이스 분명히 참조 무결성을 적용 할 FK constraint.Some 테이블 사용 트리거를 선행하고, 때로는 아무것도하지만 (전혀없이 참조 무결성)의 관계를 표시하기 위해 비슷한 이름의 열이 없습니다.
내가 참조 테이블을 찾을 수 있어요 다행히, 우리는 일관된 명명 장면을해야합니까 그리고 전망이 좋아 :
SELECT OBJECT_NAME(object_id) from sys.columns where name like 'client_id'
나는 이것이 스크립트를 생성하기위한 기초로 선택 사용하는 I가해야 할 일을하지 관련 테이블.
-
==============================
16.@Gishu 내가 2005 서버를 생산하고 SQL에서 다음 SQL을 사용 할 수 있었다 무슨 짓을했는지의 오프 근무
@Gishu 내가 2005 서버를 생산하고 SQL에서 다음 SQL을 사용 할 수 있었다 무슨 짓을했는지의 오프 근무
SELECT t.name AS TableWithForeignKey, fk.constraint_column_id AS FK_PartNo, c.name AS ForeignKeyColumn, o.name AS FK_Name FROM sys.foreign_key_columns AS fk INNER JOIN sys.tables AS t ON fk.parent_object_id = t.object_id INNER JOIN sys.columns AS c ON fk.parent_object_id = c.object_id AND fk.parent_column_id = c.column_id INNER JOIN sys.objects AS o ON fk.constraint_object_id = o.object_id WHERE fk.referenced_object_id = (SELECT object_id FROM sys.tables WHERE name = 'TableOthersForeignKeyInto') ORDER BY TableWithForeignKey, FK_PartNo;
어떤 표시 테이블, 열 및 외래 키 이름은 모두 1 개 쿼리를.
-
==============================
17.데이터베이스의 모든 테이블에 대한 기본 키 및 고유 키를 결정 ...
데이터베이스의 모든 테이블에 대한 기본 키 및 고유 키를 결정 ...
이것은 모든 제약 조건을 나열해야하고 마지막에 당신은 당신의 필터를 넣을 수 있습니다
/* CAST IS DONE , SO THAT OUTPUT INTEXT FILE REMAINS WITH SCREEN LIMIT*/ WITH ALL_KEYS_IN_TABLE (CONSTRAINT_NAME,CONSTRAINT_TYPE,PARENT_TABLE_NAME,PARENT_COL_NAME,PARENT_COL_NAME_DATA_TYPE,REFERENCE_TABLE_NAME,REFERENCE_COL_NAME) AS ( SELECT CONSTRAINT_NAME= CAST (PKnUKEY.name AS VARCHAR(30)) , CONSTRAINT_TYPE=CAST (PKnUKEY.type_desc AS VARCHAR(30)) , PARENT_TABLE_NAME=CAST (PKnUTable.name AS VARCHAR(30)) , PARENT_COL_NAME=CAST ( PKnUKEYCol.name AS VARCHAR(30)) , PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE, REFERENCE_TABLE_NAME='' , REFERENCE_COL_NAME='' FROM sys.key_constraints as PKnUKEY INNER JOIN sys.tables as PKnUTable ON PKnUTable.object_id = PKnUKEY.parent_object_id INNER JOIN sys.index_columns as PKnUColIdx ON PKnUColIdx.object_id = PKnUTable.object_id AND PKnUColIdx.index_id = PKnUKEY.unique_index_id INNER JOIN sys.columns as PKnUKEYCol ON PKnUKEYCol.object_id = PKnUTable.object_id AND PKnUKEYCol.column_id = PKnUColIdx.column_id INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl ON oParentColDtl.TABLE_NAME=PKnUTable.name AND oParentColDtl.COLUMN_NAME=PKnUKEYCol.name UNION ALL SELECT CONSTRAINT_NAME= CAST (oConstraint.name AS VARCHAR(30)) , CONSTRAINT_TYPE='FK', PARENT_TABLE_NAME=CAST (oParent.name AS VARCHAR(30)) , PARENT_COL_NAME=CAST ( oParentCol.name AS VARCHAR(30)) , PARENT_COL_NAME_DATA_TYPE= oParentColDtl.DATA_TYPE, REFERENCE_TABLE_NAME=CAST ( oReference.name AS VARCHAR(30)) , REFERENCE_COL_NAME=CAST (oReferenceCol.name AS VARCHAR(30)) FROM sys.foreign_key_columns FKC INNER JOIN sys.sysobjects oConstraint ON FKC.constraint_object_id=oConstraint.id INNER JOIN sys.sysobjects oParent ON FKC.parent_object_id=oParent.id INNER JOIN sys.all_columns oParentCol ON FKC.parent_object_id=oParentCol.object_id /* ID of the object to which this column belongs.*/ AND FKC.parent_column_id=oParentCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/ INNER JOIN sys.sysobjects oReference ON FKC.referenced_object_id=oReference.id INNER JOIN INFORMATION_SCHEMA.COLUMNS oParentColDtl ON oParentColDtl.TABLE_NAME=oParent.name AND oParentColDtl.COLUMN_NAME=oParentCol.name INNER JOIN sys.all_columns oReferenceCol ON FKC.referenced_object_id=oReferenceCol.object_id /* ID of the object to which this column belongs.*/ AND FKC.referenced_column_id=oReferenceCol.column_id/* ID of the column. Is unique within the object.Column IDs might not be sequential.*/ ) select * from ALL_KEYS_IN_TABLE where PARENT_TABLE_NAME in ('YOUR_TABLE_NAME') or REFERENCE_TABLE_NAME in ('YOUR_TABLE_NAME') ORDER BY PARENT_TABLE_NAME,CONSTRAINT_NAME;
http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx - 참고 통해 읽어 주시기 바랍니다
-
==============================
18.나는 2008 년까지에서이를 사용하고있다. 그것은 다른 목록에 솔루션을하지만, 필드 이름이 적절한 핸들의 경우 특정 (LatBin) 데이터 정렬을 맡았다되는 유사합니다. 또한, 당신은 그것을 하나의 테이블 이름을 공급하고 테이블 바로 정보를 검색 할 수 있습니다.
나는 2008 년까지에서이를 사용하고있다. 그것은 다른 목록에 솔루션을하지만, 필드 이름이 적절한 핸들의 경우 특정 (LatBin) 데이터 정렬을 맡았다되는 유사합니다. 또한, 당신은 그것을 하나의 테이블 이름을 공급하고 테이블 바로 정보를 검색 할 수 있습니다.
-->>SPECIFY THE DESIRED DB USE ??? GO /********************************************************************************************* LIST OUT ALL PRIMARY AND FOREIGN KEY CONSTRAINTS IN A DB OR FOR A SPECIFIED TABLE *********************************************************************************************/ DECLARE @tblName VARCHAR(255) /*******************/ SET @tblName = NULL-->NULL will return all PK/FK constraints for every table in the database /*******************/ SELECT PKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), PKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O1.schema_id)), PKTABLE_NAME = CONVERT(SYSNAME,O1.name), PKCOLUMN_NAME = CONVERT(SYSNAME,C1.name), FKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), FKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O2.schema_id)), FKTABLE_NAME = CONVERT(SYSNAME,O2.name), FKCOLUMN_NAME = CONVERT(SYSNAME,C2.name), -- Force the column to be non-nullable (see SQL BU 325751) KEY_SEQ = isnull(convert(smallint,K.constraint_column_id),0), UPDATE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.object_id,'CnstIsUpdateCascade') WHEN 1 THEN 0 ELSE 1 END), DELETE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.object_id,'CnstIsDeleteCascade') WHEN 1 THEN 0 ELSE 1 END), FK_NAME = CONVERT(SYSNAME,OBJECT_NAME(F.object_id)), PK_NAME = CONVERT(SYSNAME,I.name), DEFERRABILITY = CONVERT(SMALLINT,7) -- SQL_NOT_DEFERRABLE FROM sys.all_objects O1, sys.all_objects O2, sys.all_columns C1, sys.all_columns C2, sys.foreign_keys F INNER JOIN sys.foreign_key_columns K ON (K.constraint_object_id = F.object_id) INNER JOIN sys.indexes I ON (F.referenced_object_id = I.object_id AND F.key_index_id = I.index_id) WHERE O1.object_id = F.referenced_object_id AND O2.object_id = F.parent_object_id AND C1.object_id = F.referenced_object_id AND C2.object_id = F.parent_object_id AND C1.column_id = K.referenced_column_id AND C2.column_id = K.parent_column_id AND ( O1.name = @tblName OR O2.name = @tblName OR @tblName IS null) ORDER BY PKTABLE_NAME,FKTABLE_NAME
-
==============================
19.선택한 아이디에 대한 모든 책임의 수를 얻는 방법이있다. 그냥 변경 @dbTableName 값 @dbRowId 값과 그 유형 (당신이 라인에서 '제거해야 INT 경우에는 82 (..SET @SQL = ..)).하지 즐겨.
선택한 아이디에 대한 모든 책임의 수를 얻는 방법이있다. 그냥 변경 @dbTableName 값 @dbRowId 값과 그 유형 (당신이 라인에서 '제거해야 INT 경우에는 82 (..SET @SQL = ..)).하지 즐겨.
DECLARE @dbTableName varchar(max) = 'User' DECLARE @dbRowId uniqueidentifier = '21d34ecd-c1fd-11e2-8545-002219a42e1c' DECLARE @FK_ROWCOUNT int DECLARE @SQL nvarchar(max) DECLARE @PKTABLE_QUALIFIER sysname DECLARE @PKTABLE_OWNER sysname DECLARE @PKTABLE_NAME sysname DECLARE @PKCOLUMN_NAME sysname DECLARE @FKTABLE_QUALIFIER sysname DECLARE @FKTABLE_OWNER sysname DECLARE @FKTABLE_NAME sysname DECLARE @FKCOLUMN_NAME sysname DECLARE @UPDATE_RULE smallint DECLARE @DELETE_RULE smallint DECLARE @FK_NAME sysname DECLARE @PK_NAME sysname DECLARE @DEFERRABILITY sysname IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL DROP TABLE #Temp1; CREATE TABLE #Temp1 ( PKTABLE_QUALIFIER sysname, PKTABLE_OWNER sysname, PKTABLE_NAME sysname, PKCOLUMN_NAME sysname, FKTABLE_QUALIFIER sysname, FKTABLE_OWNER sysname, FKTABLE_NAME sysname, FKCOLUMN_NAME sysname, UPDATE_RULE smallint, DELETE_RULE smallint, FK_NAME sysname, PK_NAME sysname, DEFERRABILITY sysname, FK_ROWCOUNT int ); DECLARE FK_Counter_Cursor CURSOR FOR SELECT PKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), PKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O1.SCHEMA_ID)), PKTABLE_NAME = CONVERT(SYSNAME,O1.NAME), PKCOLUMN_NAME = CONVERT(SYSNAME,C1.NAME), FKTABLE_QUALIFIER = CONVERT(SYSNAME,DB_NAME()), FKTABLE_OWNER = CONVERT(SYSNAME,SCHEMA_NAME(O2.SCHEMA_ID)), FKTABLE_NAME = CONVERT(SYSNAME,O2.NAME), FKCOLUMN_NAME = CONVERT(SYSNAME,C2.NAME), -- Force the column to be non-nullable (see SQL BU 325751) --KEY_SEQ = isnull(convert(smallint,k.constraint_column_id), sysconv(smallint,0)), UPDATE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsUpdateCascade') WHEN 1 THEN 0 ELSE 1 END), DELETE_RULE = CONVERT(SMALLINT,CASE OBJECTPROPERTY(F.OBJECT_ID,'CnstIsDeleteCascade') WHEN 1 THEN 0 ELSE 1 END), FK_NAME = CONVERT(SYSNAME,OBJECT_NAME(F.OBJECT_ID)), PK_NAME = CONVERT(SYSNAME,I.NAME), DEFERRABILITY = CONVERT(SMALLINT,7) -- SQL_NOT_DEFERRABLE FROM SYS.ALL_OBJECTS O1, SYS.ALL_OBJECTS O2, SYS.ALL_COLUMNS C1, SYS.ALL_COLUMNS C2, SYS.FOREIGN_KEYS F INNER JOIN SYS.FOREIGN_KEY_COLUMNS K ON (K.CONSTRAINT_OBJECT_ID = F.OBJECT_ID) INNER JOIN SYS.INDEXES I ON (F.REFERENCED_OBJECT_ID = I.OBJECT_ID AND F.KEY_INDEX_ID = I.INDEX_ID) WHERE O1.OBJECT_ID = F.REFERENCED_OBJECT_ID AND O2.OBJECT_ID = F.PARENT_OBJECT_ID AND C1.OBJECT_ID = F.REFERENCED_OBJECT_ID AND C2.OBJECT_ID = F.PARENT_OBJECT_ID AND C1.COLUMN_ID = K.REFERENCED_COLUMN_ID AND C2.COLUMN_ID = K.PARENT_COLUMN_ID AND O1.NAME = @dbTableName OPEN FK_Counter_Cursor; FETCH NEXT FROM FK_Counter_Cursor INTO @PKTABLE_QUALIFIER, @PKTABLE_OWNER, @PKTABLE_NAME, @PKCOLUMN_NAME, @FKTABLE_QUALIFIER, @FKTABLE_OWNER, @FKTABLE_NAME, @FKCOLUMN_NAME, @UPDATE_RULE, @DELETE_RULE, @FK_NAME, @PK_NAME, @DEFERRABILITY; WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = 'SELECT @dbCountOut = COUNT(*) FROM [' + @FKTABLE_NAME + '] WHERE [' + @FKCOLUMN_NAME + '] = ''' + CAST(@dbRowId AS varchar(max)) + ''''; EXECUTE sp_executesql @SQL, N'@dbCountOut int OUTPUT', @dbCountOut = @FK_ROWCOUNT OUTPUT; INSERT INTO #Temp1 (PKTABLE_QUALIFIER, PKTABLE_OWNER, PKTABLE_NAME, PKCOLUMN_NAME, FKTABLE_QUALIFIER, FKTABLE_OWNER, FKTABLE_NAME, FKCOLUMN_NAME, UPDATE_RULE, DELETE_RULE, FK_NAME, PK_NAME, DEFERRABILITY, FK_ROWCOUNT) VALUES (@FKTABLE_QUALIFIER, @PKTABLE_OWNER, @PKTABLE_NAME, @PKCOLUMN_NAME, @FKTABLE_QUALIFIER, @FKTABLE_OWNER, @FKTABLE_NAME, @FKCOLUMN_NAME, @UPDATE_RULE, @DELETE_RULE, @FK_NAME, @PK_NAME, @DEFERRABILITY, @FK_ROWCOUNT) FETCH NEXT FROM FK_Counter_Cursor INTO @PKTABLE_QUALIFIER, @PKTABLE_OWNER, @PKTABLE_NAME, @PKCOLUMN_NAME, @FKTABLE_QUALIFIER, @FKTABLE_OWNER, @FKTABLE_NAME, @FKCOLUMN_NAME, @UPDATE_RULE, @DELETE_RULE, @FK_NAME, @PK_NAME, @DEFERRABILITY; END; CLOSE FK_Counter_Cursor; DEALLOCATE FK_Counter_Cursor; GO SELECT * FROM #Temp1 GO
-
==============================
20.MySQL의 서버는 테이블 이름 또는 참조 된 테이블의 이름을 필터링 할 수 있습니다, 참고 information_schema.REFERENTIAL_CONSTRAINTS 테이블이 있습니다.
MySQL의 서버는 테이블 이름 또는 참조 된 테이블의 이름을 필터링 할 수 있습니다, 참고 information_schema.REFERENTIAL_CONSTRAINTS 테이블이 있습니다.
-
==============================
21.SQL Server의 특정 테이블을 참조하는 모든 외래 키 목록 :
SQL Server의 특정 테이블을 참조하는 모든 외래 키 목록 :
당신은 쿼리를 다음을 통해 참조하는 테이블 이름과 열 이름을 얻을 수 있습니다 ...
SELECT OBJECT_NAME(f.parent_object_id) TableName, COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName FROM sys.foreign_keys AS f INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id INNER JOIN sys.tables t ON t.OBJECT_ID = fc.referenced_object_id WHERE OBJECT_NAME (f.referenced_object_id) = 'TableName'
그리고 당신의 이해 스크린 샷 다음 ...
-
==============================
22.이것은 선택된 테이블을 포함 외국 키를 가져옵니다. *는 _FIRSTABLENAME_SECONDTABLENAME 형식을 가정합니다.
이것은 선택된 테이블을 포함 외국 키를 가져옵니다. *는 _FIRSTABLENAME_SECONDTABLENAME 형식을 가정합니다.
declare @tablename as varchar(MAX) SET @tablename = 'yourtablename' SELECT name FROM YOURDATABASE.sys.objects WHERE type_desc = 'FOREIGN_KEY_CONSTRAINT' and (name LIKE '%_' + @tablename + 'empdb_%' or name LIKE '%_' + @tablename )
이것은보다 일반적인 형태이다 :
SELECT name FROM YOURDATABASE_PROD.sys.objects WHERE type_desc = 'FOREIGN_KEY_CONSTRAINT' and name LIKE '%' + @tablename + '%' and name NOT LIKE '[a-zA-Z0-9]' + @tablename + '%' and name NOT LIKE '%' + @tablename + '[a-zA-Z0-9]'
-
==============================
23.나를 위해 다음과 같은 솔루션 작업 :
나를 위해 다음과 같은 솔루션 작업 :
--Eliminar las llaves foraneas declare @query varchar(8000) declare cursorRecorrerTabla cursor for SELECT 'ALTER TABLE [PoaComFinH].['+sch.name+'].['+referencingTable.Name+'] DROP CONSTRAINT ['+foreignKey.name+']' 'query' FROM PoaComFinH.sys.foreign_key_columns fk JOIN PoaComFinH.sys.tables referencingTable ON fk.parent_object_id = referencingTable.object_id JOIN PoaComFinH.sys.schemas sch ON referencingTable.schema_id = sch.schema_id JOIN PoaComFinH.sys.objects foreignKey ON foreignKey.object_id = fk.constraint_object_id JOIN PoaComFinH.sys.tables referencedTable ON fk.referenced_object_id = referencedTable.object_id --3ro. abrir el cursor. open cursorRecorrerTabla fetch next from cursorRecorrerTabla into @query while @@fetch_status = 0 begin --inicio cuerpo del cursor print @query exec(@query) --fin cuerpo del cursor fetch next from cursorRecorrerTabla into @query end --cerrar cursor close cursorRecorrerTabla deallocate cursorRecorrerTabla
-
==============================
24.당신은 쿼리 아래를 통해 찾을 수 있습니다 :
당신은 쿼리 아래를 통해 찾을 수 있습니다 :
SELECT OBJECT_NAME (FK.referenced_object_id) 'Referenced Table', OBJECT_NAME(FK.parent_object_id) 'Referring Table', FK.name 'Foreign Key', COL_NAME(FK.referenced_object_id, FKC.referenced_column_id) 'Referenced Column', COL_NAME(FK.parent_object_id,FKC.parent_column_id) 'Referring Column' FROM sys.foreign_keys AS FK INNER JOIN sys.foreign_key_columns AS FKC ON FKC.constraint_object_id = FK.OBJECT_ID WHERE OBJECT_NAME (FK.referenced_object_id) = 'YourTableName' AND COL_NAME(FK.referenced_object_id, FKC.referenced_column_id) = 'YourColumnName' order by OBJECT_NAME(FK.parent_object_id)
-
==============================
25.또한보십시오.
또한보십시오.
EXEC sp_fkeys 'tableName', 'schemaName'
sp_fkeys 당신은뿐만 아니라 PK 테이블 이름과 스키마에 의해뿐만 아니라 FK 테이블 이름과 스키마 결과를 필터링 할 수 있습니다. 링크
-
==============================
26.@BankZ의 가장 바람직한 대답
@BankZ의 가장 바람직한 대답
sp_help 'TableName'
또한 다른 스키마
sp_help 'schemaName.TableName'
from https://stackoverflow.com/questions/483193/how-can-i-list-all-foreign-keys-referencing-a-given-table-in-sql-server by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은, 하나 개의 쿼리에 여러 테이블을 갱신 (0) | 2020.03.12 |
---|---|
[SQL] SQL은 조인 : 일대 다 관계의 마지막 기록을 선택 (0) | 2020.03.12 |
[SQL] SQL 서버 2008 관리 스튜디오 내 쿼리의 구문을 확인하지 (0) | 2020.03.12 |
[SQL] 날짜를 삽입하는 동안 문자열에서 날짜 및 / 또는 시간을 변환 할 때 변환 실패 (0) | 2020.03.12 |
[SQL] 단순히 PostgreSQL의 테이블 이름을 사용할 수 없습니다 ( "관계가 존재하지 않습니다") (7) | 2020.03.12 |