如何使用插入触发器禁用某些列?

时间:2013-10-13 07:43:36

标签: sql sql-server triggers

我有一个包含5列的表格:

  • usernamevarchar
  • passwordint
  • accessbit
  • informationvarchar
  • imagevarchar

如果information,我想阻止用户插入2列imageaccess = true

无论如何使用插入触发器来执行此操作?任何帮助都会很棒。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用INSTEAD OF INSERT trigger,您可以轻松“过滤掉”不需要的信息,例如如果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行,则informationimage列将被“清除”,而是存储空字符串。

在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列...