外部キーの作成、変更、および削除

SQL Server 管理オブジェクト (SMO) では、外部キーは ForeignKey オブジェクトで表現します。

SMO に外部キーを作成するには、外部キーが ForeignKey オブジェクトのコンストラクターに定義されているテーブルを指定する必要があります。このテーブルから、外部キーになる列を少なくとも 1 つ選択する必要があります。選択するには、ForeignKeyColumn オブジェクト変数を作成し、外部キーの列の名前を指定します。次に、参照先のテーブルと列を指定します。列を Columns オブジェクト プロパティに追加するには、Add メソッドを使用します。

外部キーを表す列は、ForeignKey オブジェクトの一覧は Columns オブジェクト プロパティで表されます。外部キーが参照している主キーは、ReferencedTable プロパティで指定されたテーブルにある ReferencedKey プロパティで表現します。

提供されているコード例を使用するには、アプリケーションを作成するプログラミング環境、プログラミング テンプレート、およびプログラミング言語を選択する必要があります。詳細については、「Visual Studio .NET で Visual Basic SMO プロジェクトを作成する方法」または「Visual Studio .NET で Visual C# SMO プロジェクトを作成する方法」を参照してください。

Visual Basic での外部キーの作成、変更、および削除

このコード例では、あるテーブル内の 1 つまたは複数の列から、別のテーブル内の主キー列に対する外部キー リレーションシップを作成する方法を示します。

'Connect to the local, default instance of SQL Server.
Dim srv As Server
srv = New Server
'Reference the AdventureWorks2008R2 database.
Dim db As Database
db = srv.Databases("AdventureWorks2008R2")
'Declare a Table object variable and reference the Employee table.
Dim tbe As Table
tbe = db.Tables("Employee", "HumanResources")
'Declare another Table object variable and reference the EmployeeDepartmentHistory table.
Dim tbea As Table
tbea = db.Tables("EmployeeDepartmentHistory", "HumanResources")
'Define a Foreign Key object variable by supplying the EmployeeDepartmentHistory as the parent table and the foreign key name in the constructor.
Dim fk As ForeignKey
fk = New ForeignKey(tbea, "test_foreignkey")
'Add BusinessEntityID as the foreign key column.
Dim fkc As ForeignKeyColumn
fkc = New ForeignKeyColumn(fk, "BusinessEntityID", "BusinessEntityID")
fk.Columns.Add(fkc)
'Set the referenced table and schema.
fk.ReferencedTable = "Employee"
fk.ReferencedTableSchema = "HumanResources"
'Create the foreign key on the instance of SQL Server.
fk.Create()

Visual C# での外部キーの作成、変更、および削除

このコード例では、あるテーブル内の 1 つまたは複数の列から、別のテーブル内の主キー列に対する外部キー リレーションシップを作成する方法を示します。

{
            //Connect to the local, default instance of SQL Server. 
            Server srv;
            srv = new Server();
            //Reference the AdventureWorks2008R2 database. 
            Database db;
            db = srv.Databases["AdventureWorks2008R2"];
            //Declare another Table object variable and reference the EmployeeDepartmentHistory table. 
            Table tbea;
            tbea = db.Tables["EmployeeDepartmentHistory", "HumanResources"];
            //Define a Foreign Key object variable by supplying the EmployeeDepartmentHistory as the parent table and the foreign key name in the constructor. 
            ForeignKey fk;
            fk = new ForeignKey(tbea, "test_foreignkey");
            //Add BusinessEntityID as the foreign key column. 
            ForeignKeyColumn fkc;
            fkc = new ForeignKeyColumn(fk, "BusinessEntityID", "BusinessEntityID");
            fk.Columns.Add(fkc);
            //Set the referenced table and schema. 
            fk.ReferencedTable = "Employee";
            fk.ReferencedTableSchema = "HumanResources";
            //Create the foreign key on the instance of SQL Server. 
            fk.Create();
        }

PowerShell での外部キーの作成、変更、および削除

このコード例では、あるテーブル内の 1 つまたは複数の列から、別のテーブル内の主キー列に対する外部キー リレーションシップを作成する方法を示します。

# Set the path context to the local, default instance of SQL Server and to the
#database tables in Adventureworks2008R2
CD \sql\localhost\default\databases\AdventureWorks2008R2\Tables\

#Get reference to the FK table
$tbea = get-item HumanResources.EmployeeDepartmentHistory

# Define a Foreign Key object variable by supplying the EmployeeDepartmentHistory
# as the parent table and the foreign key name in the constructor. 
$fk = New-Object -TypeName Microsoft.SqlServer.Management.SMO.ForeignKey `
-argumentlist $tbea, "test_foreignkey"

#Add BusinessEntityID as the foreign key column. 
$fkc = New-Object -TypeName Microsoft.SqlServer.Management.SMO.ForeignKeyColumn `
-argumentlist $fk, "BusinessEntityID", "BusinessEntityID"
$fk.Columns.Add($fkc)

#Set the referenced table and schema. 
$fk.ReferencedTable = "Employee"
$fk.ReferencedTableSchema = "HumanResources"

#Create the foreign key on the instance of SQL Server. 
$fk.Create()

サンプル: 外部キー、主キー、および一意制約列

このサンプルでは、次のことを行います。

  • 既存のオブジェクトで外部キーを見つける。

  • 主キーの作成方法を示す。

  • 一意制約列の作成方法を示す。

このサンプルの C# バージョンを次に示します。

// compile with: 
// /r:Microsoft.SqlServer.Smo.dll 
// /r:microsoft.sqlserver.management.sdk.sfc.dll 
// /r:Microsoft.SqlServer.ConnectionInfo.dll
// /r:Microsoft.SqlServer.SqlEnum.dll

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Sdk.Sfc;
using Microsoft.SqlServer.Management.Common;
using System;

public class A {
   public static void Main() {
      Server svr = new Server();
      Database db = new Database(svr, "TESTDB");
      db.Create();

      // PK Table
      Table tab1 = new Table(db, "Table1");

      // Define Columns and add them to the table
      Column col1 = new Column(tab1, "Col1", DataType.Int);

      col1.Nullable = false;
      tab1.Columns.Add(col1);
      Column col2 = new Column(tab1, "Col2", DataType.NVarChar(50));
      tab1.Columns.Add(col2);
      Column col3 = new Column(tab1, "Col3", DataType.DateTime);
      tab1.Columns.Add(col3);

      // Create the ftable
      tab1.Create();

      // Define Index object on the table by supplying the Table1 as the parent table and the primary key name in the constructor.
      Index pk = new Index(tab1, "Table1_PK");
      pk.IndexKeyType = IndexKeyType.DriPrimaryKey;

      // Add Col1 as the Index Column
      IndexedColumn idxCol1 = new IndexedColumn(pk, "Col1");
      pk.IndexedColumns.Add(idxCol1);

      // Create the Primary Key
      pk.Create();

      // Create Unique Index on the table
      Index unique = new Index(tab1, "Table1_Unique");
      unique.IndexKeyType = IndexKeyType.DriUniqueKey;

      // Add Col1 as the Unique Index Column
      IndexedColumn idxCol2 = new IndexedColumn(unique, "Col2");
      unique.IndexedColumns.Add(idxCol2);

      // Create the Unique Index
      unique.Create();

      // Create Table2                  
      Table tab2 = new Table(db, "Table2");
      Column col21 = new Column(tab2, "Col21", DataType.NChar(20));
      tab2.Columns.Add(col21);
      Column col22 = new Column(tab2, "Col22", DataType.Int);
      tab2.Columns.Add(col22);
      tab2.Create();
                  
      // Define a Foreign Key object variable by supplying the Table2 as the parent table and the foreign key name in the constructor. 
      ForeignKey fk = new ForeignKey(tab2, "Table2_FK");

      // Add Col22 as the foreign key column. 
      ForeignKeyColumn fkc = new ForeignKeyColumn(fk, "Col22", "Col1");
      fk.Columns.Add(fkc);
      fk.ReferencedTable = "Table1";

      // Create the foreign key on the instance of SQL Server. 
      fk.Create();                  

      // Get list of Foreign Keys on Table2
      foreach (ForeignKey f in tab2.ForeignKeys) {
            Console.WriteLine(f.Name + " " + f.ReferencedTable + " " + f.ReferencedKey);
      }

      // Get list of Foreign Keys referencing table1
      foreach (Table tab in db.Tables) {
         if (tab == tab1)
            continue;
            foreach (ForeignKey f in tab.ForeignKeys) {
               if (f.ReferencedTable.Equals(tab1.Name))
                  Console.WriteLine(f.Name + " " + f.Parent.Name);
            }
      }
   }
}

このサンプルの Visual Basic バージョンを次に示します。

' compile with: 
' /r:Microsoft.SqlServer.Smo.dll 
' /r:microsoft.sqlserver.management.sdk.sfc.dll 
' /r:Microsoft.SqlServer.ConnectionInfo.dll
' /r:Microsoft.SqlServer.SqlEnum.dll

Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Sdk.Sfc
Imports Microsoft.SqlServer.Management.Common

Public Class A
   Public Shared Sub Main()
      Dim svr As New Server()
      Dim db As New Database(svr, "TESTDB")
      db.Create()

      ' PK Table
      Dim tab1 As New Table(db, "Table1")

      ' Define Columns and add them to the table
      Dim col1 As New Column(tab1, "Col1", DataType.Int)

      col1.Nullable = False
      tab1.Columns.Add(col1)
      Dim col2 As New Column(tab1, "Col2", DataType.NVarChar(50))
      tab1.Columns.Add(col2)
      Dim col3 As New Column(tab1, "Col3", DataType.DateTime)
      tab1.Columns.Add(col3)

      ' Create the ftable
      tab1.Create()

      ' Define Index object on the table by supplying the Table1 as the parent table and the primary key name in the constructor.
      Dim pk As New Index(tab1, "Table1_PK")
      pk.IndexKeyType = IndexKeyType.DriPrimaryKey

      ' Add Col1 as the Index Column
      Dim idxCol1 As New IndexedColumn(pk, "Col1")
      pk.IndexedColumns.Add(idxCol1)

      ' Create the Primary Key
      pk.Create()

      ' Create Unique Index on the table
      Dim unique As New Index(tab1, "Table1_Unique")
      unique.IndexKeyType = IndexKeyType.DriUniqueKey

      ' Add Col1 as the Unique Index Column
      Dim idxCol2 As New IndexedColumn(unique, "Col2")
      unique.IndexedColumns.Add(idxCol2)

      ' Create the Unique Index
      unique.Create()

      ' Create Table2                  
      Dim tab2 As New Table(db, "Table2")
      Dim col21 As New Column(tab2, "Col21", DataType.NChar(20))
      tab2.Columns.Add(col21)
      Dim col22 As New Column(tab2, "Col22", DataType.Int)
      tab2.Columns.Add(col22)
      tab2.Create()

      ' Define a Foreign Key object variable by supplying the Table2 as the parent table and the foreign key name in the constructor. 
      Dim fk As New ForeignKey(tab2, "Table2_FK")

      ' Add Col22 as the foreign key column. 
      Dim fkc As New ForeignKeyColumn(fk, "Col22", "Col1")
      fk.Columns.Add(fkc)
      fk.ReferencedTable = "Table1"

      ' Create the foreign key on the instance of SQL Server. 
      fk.Create()

      ' Get list of Foreign Keys on Table2
      For Each f As ForeignKey In tab2.ForeignKeys
         Console.WriteLine((f.Name + " " + f.ReferencedTable & " ") + f.ReferencedKey)
      Next

      ' Get list of Foreign Keys referencing table1
      For Each tab As Table In db.Tables
         If (tab.Name.Equals(tab1.Name)) Then
            Continue For
         End If
         For Each f As ForeignKey In tab.ForeignKeys
            If f.ReferencedTable.Equals(tab1.Name) Then
               Console.WriteLine(f.Name + " " + f.Parent.Name)
            End If
         Next
      Next
   End Sub
End Class