通过asp.net

时间:2015-11-26 07:11:40

标签: c# asp.net sql-server triggers

我的数据库中有一个Employee表。值通过asp.net页面插入到此表中。我想在Employee insert上创建一个触发器,只有当用户具有" id = 1110"时才允许插入,必须拒绝所有其他用户插入。我不知道如何将userid作为参数传递给触发器。有人可以帮我吗???

2 个答案:

答案 0 :(得分:0)

创建触发器后,您可以在c#代码中调用下面的存储过程:

--table|start
CREATE TABLE dbo.z_Employee (ID INT IDENTITY(1, 1), Name VARCHAR(100), UserModify SMALLINT)
--table|end



--stored procedure for inserting new employee|start
CREATE PROC dbo.z_AddEmployee(@Name VARCHAR(100), @UserModify SMALLINT)
AS
--for debugging|start
--DECLARE @Name VARCHAR(100)
--  , @UserModify SMALLINT = 1112
--for debugging|end
INSERT dbo.z_Employee (Name, UserModify)
VALUES (@Name, @UserModify)

--for debugging|start
--SELECT e.*
--FROM dbo.z_Employee e WITH(NOLOCK)
--for debugging|end
--stored procedure for inserting new employee|end



--trigger for disallowing inserts|start
CREATE TRIGGER dbo.z_DoNotAllowOtherUser
ON dbo.z_Employee
FOR INSERT
AS

IF EXISTS
    (SELECT TOP 1 i.ID
    FROM INSERTED i
    WHERE i.UserModify <> 1110)
BEGIN
    DELETE e
    FROM dbo.z_Employee e WITH(NOLOCK)
        JOIN INSERTED i ON i.ID = e.ID
END
--trigger for disallowing inserts|end

答案 1 :(得分:0)

触发器无法传递参数 - 您必须在数据库操作中操作。因此,除非Employee表具有引用进行更改的用户的id的CreateBy或LastUpdateBy,否则您需要将INSERT包装到执行该检查之前执行该检查的存储过程。

如果您的Employee表有一个CreateBy包含执行更改的用户的id,那么下面的触发器应该有效:

CREATE TRIGGER tg_Employees_RegisterAdminOnly ON dbo.Employees
AFTER INSERT AS
BEGIN
    IF EXISTS (SELECT * FROM INSERTED WHERE CreateBy <> 1110) BEGIN
        RAISERROR('Unauthorized registration', 16, 1)
        ROLLBACK
        RETURN
    END
END
GO