0

私はこれらのテーブルを持っています:

user
id

permission
id
user_id

old_permission
user_id
value

値:

user
id
1
2
3

permission
id    user_id
1     1     
2     2


old_permission
user_id    value
1          f
2          f
3          t

テーブル名が示すように、私は従来の権限システムから移行しています。私がやりたいことは次のとおりです。

old_permission.value が 't' の場合、ユーザーの許可で一致する行を削除したい。したがって、ユーザー 3 が権限テーブルにエントリを持っていた場合、その old_permission.value = 't' の場合、そのエントリは削除されます。

関連する old_permission.value = 'f' の場合、権限テーブルにも行を作成したい

このような制約を作成するにはどうすればよいですか?

4

3 に答える 3

1

Old_Permissionテーブルに基づいてPermissionテーブルを更新するストアドプロシージャを作成します。

CREATE PROCEDURE RefreshPermissions()
AS
BEGIN
    DELETE
        Permission
    WHERE
        EXISTS
        (SELECT
            NULL
        FROM
            Old_Permission
        WHERE
            Permission.user_id = Old_Permission.user_id
        AND Old_Permission.Value = 't');

    INSERT INTO
        Permission (user_id)
    SELECT
        Old_Permission.user_id
    FROM
        Old_Permission
        LEFT JOIN Permission ON Old_Permission.user_id = Permission.user_id
    WHERE
        Old_Permission.Value = 'f'
    AND Permission.user_Id IS NULL;

END;    

次に、Old_Permissionテーブルでトリガーを使用して、必要に応じてPermissionテーブルを変更することをお勧めします。このようなもの:

CREATE TRIGGER 
    TR_Old_Permission
AFTER INSERT OR UPDATE OR DELETE ON 
    Old_Permission
EXECUTE PROCEDURE
    RefreshPermissions();
于 2013-02-07T16:25:47.653 に答える
-1

PL/SQL は Oracle の一部です。また、制約は PL/SQL ではなく SQL の一部です。このような制約を作成することはできません。ロジックに従って削除および挿入するプロシージャやトリガーなど、いくつかのコードを記述する必要があります。基本的に、移行中に、移行するために正確に何をどのように行っているのかわかりませんが、レコードをループしてから、条件/フィルターに従ってレコードを削除および挿入します。あなたのケースで正確に何をどのように行うかを決定するために詳細が必要なので、これ以上提案することは困難です.

于 2013-02-07T15:55:00.007 に答える
-1

私はあなたの問題を正確に理解することができません.SQLの制約の定義と型を含む概念を理解してもらうことを考えました。

制約は、テーブルに入力できるデータの種類を制限するために使用されます。

制約は、テーブルの作成時 (CREATE TABLE ステートメントを使用) またはテーブルの作成後 (ALTER TABLE ステートメントを使用) に指定できます。

制約の種類:

•NOT NULL

•個性的

•主キー

•外部キー

•小切手

•デフォルト

それぞれの小さな例を含む制約の種類の説明:-

SQL NOT NULL 制約

•NOT NULL 制約は、列が NULL 値を受け入れないように強制します。

•NOT NULL 制約は、フィールドが常に値を含むように強制します。つまり、このフィールドに値を追加しないと、新しいレコードを挿入したり、レコードを更新したりできません。

次の SQL は、「P_Id」列と「LastName」列が NULL 値を受け入れないように強制します。

•テーブル作成者

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

シティ varchar(255)

)

SQL UNIQUE 制約

UNIQUE 制約は、データベース テーブル内の各レコードを一意に識別します。

CREATE TABLE の SQL UNIQUE 制約

次の SQL は、「Persons」テーブルが「P_Id」列に UNIQUE 制約を作成します

創造された:

MySQL:

CREATE TABLE 人

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

都市 varchar(255),

ユニーク (P_Id)

)

SQL サーバー/オラクル/MS アクセス:

CREATE TABLE 人

(

P_Id int NOT NULL 一意、

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

シティ varchar(255)

)

UNIQUE 制約の命名を許可し、複数の列で UNIQUE 制約を定義するには、次の SQL 構文を使用します。

MySQL / SQL サーバー / オラクル / MS アクセス:

CREATE TABLE 人

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

都市 varchar(255),

CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)

)


ALTER TABLE の SQL UNIQUE 制約

テーブルが既に作成されている場合に「P_Id」列に UNIQUE 制約を作成するには
、次の SQL を使用します。

MySQL / SQL サーバー / オラクル / MS アクセス:

ALTER TABLE の人物

一意の追加 (P_Id)

UNIQUE 制約の命名を許可し、複数の列で UNIQUE 制約を定義するには、次の SQL 構文を使用します。

MySQL / SQL サーバー / オラクル / MS アクセス:

ALTER TABLE の人物

ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)


UNIQUE 制約を削除するには

UNIQUE 制約を削除するには、次の SQL を使用します。

MySQL:

ALTER TABLE の人物

ドロップ インデックス uc_PersonID

SQL サーバー/オラクル/MS アクセス:

ALTER TABLE の人物

DROP CONSTRAINT uc_PersonID


SQL PRIMARY KEY 制約

PRIMARY KEY 制約は、データベース テーブル内の各レコードを一意に識別します。

主キーには一意の値が含まれている必要があります。

主キー列に NULL 値を含めることはできません。

各テーブルには主キーが必要であり、各テーブルには主キーを 1 つだけ含めることができます。


CREATE TABLE の SQL PRIMARY KEY 制約

次の SQL は、「Persons」テーブルが

作成した:

MySQL:

CREATE TABLE 人

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

都市 varchar(255),

主キー (P_Id)

)

SQL サーバー/オラクル/MS アクセス:

CREATE TABLE 人

(

P_Id int NOT NULL PRIMARY KEY,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

シティ varchar(255)

)

PRIMARY KEY 制約の命名を許可し、複数の列で PRIMARY KEY 制約を定義するには、次の SQL 構文を使用します。

MySQL / SQL サーバー / オラクル / MS アクセス:

CREATE TABLE 人

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

都市 varchar(255),

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

)


CREATE TABLE の SQL FOREIGN KEY 制約

次の SQL は、"Orders" テーブルが作成されるときに "P_Id" 列に FOREIGN KEY を作成します: MySQL:

CREATE TABLE オーダー

(

O_Id int NOT NULL,

OrderNo int NOT NULL,

P_ID 整数、

主キー (O_Id)、

FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)

)

SQL サーバー/オラクル/MS アクセス:

CREATE TABLE オーダー

(

O_Id int NOT NULL PRIMARY KEY,

OrderNo int NOT NULL,

P_Id int FOREIGN KEY REFERENCES 人物(P_Id)

)

FOREIGN KEY 制約の命名を許可し、複数の列で FOREIGN KEY 制約を定義するには、次の SQL 構文を使用します: MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE オーダー

(

O_Id int NOT NULL,

OrderNo int NOT NULL,

P_ID 整数、

主キー (O_Id)、

CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)

REFERENCES 人物(P_Id)

)


CREATE TABLE の SQL CHECK 制約

次の SQL は、"Persons" テーブルの作成時に "P_Id" 列に CHECK 制約を作成します。CHECK 制約は、列「P_Id」に 0 より大きい整数のみを含める必要があることを指定します。

MySQL:

CREATE TABLE 人

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

都市 varchar(255),

チェック (P_Id>0)

)


SQL DEFAULT 制約

DEFAULT 制約は、デフォルト値を列に挿入するために使用されます。

CREATE TABLE の SQL DEFAULT 制約

次の SQL は、"Persons" テーブルの作成時に "City" 列に DEFAULT 制約を作成します。

私の SQL / SQL Server / Oracle / MS Access:

CREATE TABLE 人

(

P_Id int NOT NULL,

LastName varchar(255) NOT NULL,

名 varchar(255),

アドレス varchar(255),

City varchar(255) DEFAULT 'Sandnes'

)

GETDATE() などの関数を使用して、DEFAULT 制約を使用してシステム値を挿入することもできます。

CREATE TABLE オーダー

(

O_Id int NOT NULL,

OrderNo int NOT NULL,

P_ID 整数、

OrderDate 日付 DEFAULT GETDATE()

)

上記の説明は、制約を使用する一般的な形式です。問題を解決するのに役立つことを願っています。

于 2013-02-07T16:20:31.243 に答える