1

我有一个有 5 列的表:

  • username( varchar)
  • password( int)
  • access( bit)
  • information( varchar)
  • image( varchar)

我想阻止用户插入 2 列informationimageif access = true

无论如何使用插入触发器来做到这一点?任何帮助都会很棒。

4

2 回答 2

0

使用INSTEAD OF INSERT触发器,您可以轻松地“过滤掉”不需要的信息,例如,您可以插入一个空字符串(或其他内容)以防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

将导致将两行保存到您的数据库表中,但插入的第二行将有空informationimage列...

于 2013-10-13T08:45:22.397 回答
0

如果您在插入或更新时需要此行为,一个简单的 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
于 2013-10-13T08:37:40.473 回答