5列のテーブルがあります:
username(varchar)password(int)access(bit)information(varchar)image(varchar)
informationユーザーが2列に挿入できないimageようにしたいaccess = true.
insert trigger を使用してこれを行う方法はありますか? どんな助けでも素晴らしいでしょう。
5列のテーブルがあります:
username( varchar)password( int)access( bit)information( varchar)image( varchar)informationユーザーが2列に挿入できないimageようにしたいaccess = true.
insert trigger を使用してこれを行う方法はありますか? どんな助けでも素晴らしいでしょう。
INSTEAD OF INSERTtriggerを使用すると、不要な情報を簡単に「除外」できます。たとえば、accessが に設定されている場合は、空の文字列 (またはその他のもの) を挿入でき1ます。
CREATE TRIGGER InsteadTrigger on dbo.YourTableNameHere
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO dbo.YourTableNameHere(username, password, access, information, image)
SELECT
username, password, access,
CASE access
WHEN 1 THEN '' ELSE i.information END,
CASE access
WHEN 1 THEN '' ELSE i.image END
FROM INSERTED i
END;
したがって、access = 0- で行を挿入すると、すべての列が表示どおりに保存されます。
したがって、access = 1- で行を挿入しようとすると、列informationがimage「消去」され、代わりに空の文字列が格納されます。
SQL Server 2008以降では、これをここに挿入します。
INSERT INTO dbo.YourTableNameHere(username, password,access,information, image)
VALUES ('test 1', 42, 0, 'testinfo 1', 'testimg 1'),
('test 2', 4711, 1, 'testinfo 2', 'testimg2')
SELECT * FROM dbo.YourTableNameHere
データベース テーブルに 2 つの行が保存されますが、挿入された 2 番目の行には空informationのimage列が含まれます...
insert または updateでこの動作が必要な場合は、単純な CHECK 制約で十分です。
ALTER TABLE MySchema.MyTable
ADD CONSTRAINT CK_MyTable_BlockInformationImageWhenAccessIsTrue
CHECK( access = 1 AND information IS NULL AND image IS NULL OR access = 0 );
挿入時にのみこの動作が必要な場合は、次のトリガーを使用できます。
CREATE TRIGGER trgI_MyTable_BlockInformationImageWhenAccessIsTrue
ON MySchema.MyTable
AFTER INSERT
AS
BEGIN
IF EXISTS
(
SELECT *
FROM inserted i
WHERE i.access = 1
AND (information IS NOT NULL OR image IS NOT NULL)
)
BEGIN
ROLLBACK TRANSACTION;
RAISERROR('Access denied', 16, 1);
END
END;
GO