Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server触发器:限制记录插入_Sql Server - Fatal编程技术网

Sql server SQL Server触发器:限制记录插入

Sql server SQL Server触发器:限制记录插入,sql-server,Sql Server,我正在为一所大学的工作做一个数据库。在某些情况下,我们必须创建一个触发器/函数,以限制在我的SQL Server Management Studio 17上插入记录,同时考虑到不同的外键。例如,我们可以有100条记录,但对于同一外键,我们只能有50条记录 我们有这样的限制: CREATE TABLE [dbo].[DiaFerias] WITH CHECK ADD CONSTRAINT [Verificar22DiasFerias] CHECK (([dbo].[v

我正在为一所大学的工作做一个数据库。在某些情况下,我们必须创建一个触发器/函数,以限制在我的SQL Server Management Studio 17上插入记录,同时考虑到不同的外键。例如,我们可以有100条记录,但对于同一外键,我们只能有50条记录

我们有这样的限制:

CREATE TABLE [dbo].[DiaFerias] WITH CHECK 
    ADD CONSTRAINT [Verificar22DiasFerias] 
         CHECK (([dbo].[verificarDiasFerias]((22)) ='True')) 
借助此功能:

ALTER FUNCTION [dbo].[verificarDiasFerias] (@contagem INT) 
RETURNS VARCHAR(5) 
AS 
BEGIN 
    IF EXISTS (SELECT DISTINCT idFuncionario, idDiaFerias 
               FROM DiaFerias 
               GROUP BY idFuncionario, idDiaFerias 
               HAVING COUNT(*) <= @contagem) 
        RETURN 'True' 

    RETURN 'False' 
END

我会用扳机吗?很不情愿地,我想知道如何在没有触发器的情况下完成它,我从来没有推荐过这种方式。我会使用这个函数吗?没有

我将创建一个索引视图:

CREATE VIEW dbo.DiaFerias_Counts
WITH SCHEMABINDING
AS
    SELECT idFuncionario, idDiaFerias, COUNT_BIG(*) as Cnt
    FROM dbo.DiaFerias
    GROUP BY idFuncionario, idDiaFerias
GO
CREATE UNIQUE CLUSTERED INDEX PK_DiaFerias_Counts on
    dbo.DiaFerias_Counts (idFuncionario, idDiaFerias)
为什么要这样做?因此,SQL Server会自动为我们维护这些计数,因此我们不必在触发器中编写范围广泛的查询。我们现在可以编写触发器,类似于:

CREATE TRIGGER T_DiaFerias
ON dbo.DiaFerias
AFTER INSERT, UPDATE
AS
    SET NOCOUNT ON;

    IF EXISTS (
      SELECT
         *
      FROM dbo.DiaFerias_Counts dfc
      WHERE
        dfc.Cnt > 22
      AND
        (EXISTS (select * from inserted i
         where i.idFuncionario = dfc.idFuncionario AND i.idDiaFerias = dfc.idDiaFerias)
        OR EXISTS (select * from deleted d
         where d.idFuncionario = dfc.idFuncionario AND d.idDiaFerias = dfc.idDiaFerias)
      )
    )
    BEGIN
        RAISERROR('Constraint violation',16,1)
    END
希望您能看到它是如何工作的-我们只想查询可能受到触发原因影响的项目的计数-所以我们使用inserted和Delete来限制搜索


如果任何计数大于22,我们将拒绝更改,这与函数仅在每个计数大于22时才开始拒绝行不同。

我会在这里使用触发器吗?很不情愿地,我想知道如何在没有触发器的情况下完成它,我从来没有推荐过这种方式。我会使用这个函数吗?没有

我将创建一个索引视图:

CREATE VIEW dbo.DiaFerias_Counts
WITH SCHEMABINDING
AS
    SELECT idFuncionario, idDiaFerias, COUNT_BIG(*) as Cnt
    FROM dbo.DiaFerias
    GROUP BY idFuncionario, idDiaFerias
GO
CREATE UNIQUE CLUSTERED INDEX PK_DiaFerias_Counts on
    dbo.DiaFerias_Counts (idFuncionario, idDiaFerias)
为什么要这样做?因此,SQL Server会自动为我们维护这些计数,因此我们不必在触发器中编写范围广泛的查询。我们现在可以编写触发器,类似于:

CREATE TRIGGER T_DiaFerias
ON dbo.DiaFerias
AFTER INSERT, UPDATE
AS
    SET NOCOUNT ON;

    IF EXISTS (
      SELECT
         *
      FROM dbo.DiaFerias_Counts dfc
      WHERE
        dfc.Cnt > 22
      AND
        (EXISTS (select * from inserted i
         where i.idFuncionario = dfc.idFuncionario AND i.idDiaFerias = dfc.idDiaFerias)
        OR EXISTS (select * from deleted d
         where d.idFuncionario = dfc.idFuncionario AND d.idDiaFerias = dfc.idDiaFerias)
      )
    )
    BEGIN
        RAISERROR('Constraint violation',16,1)
    END
希望您能看到它是如何工作的-我们只想查询可能受到触发原因影响的项目的计数-所以我们使用inserted和Delete来限制搜索


如果任何计数大于22,我们将拒绝更改,这与函数仅在每个计数大于22时才开始拒绝行不同。

My bad。我已经更新了我的问题@DiadoI,我不确定这个函数的作用是什么,但我几乎可以肯定它做得不对。而且,在整个表中查询任何插入/更新都可能花费高昂的费用,这是一个糟糕的计划。提示-此函数当前表示,只要至少有一个IDBunconario、idDiaFerias组合的rowsMy bad少于23行,一切正常。我已经更新了我的问题@DiadoI,我不确定这个函数的作用是什么,但我几乎可以肯定它做得不对。而且,在整个表中查询任何插入/更新都可能花费高昂的费用,这是一个糟糕的计划。提示-此函数当前表示,只要至少有一个IdBunconario、idDiaFerias的组合少于23行,一切都很好。我将尝试使用@Damien_The_unsiver,感谢您的理解与宽容。致以最良好的祝愿。它允许为同一行添加第23行idFuncionario@Jo奥科斯塔-这是因为你的问题中的样本似乎想要考虑IdFunCialio和IdiaFaRias,并计算那些对极限的独特组合。如果你只是想限制其中一列,那么在明显的地方去掉另一列。我找到了另一个似乎有效的解决方案。不管怎样,谢谢你的帮助!我会试试不信者的Damien,谢谢你的理解和安抚。致以最良好的祝愿。它允许为同一行添加第23行idFuncionario@Jo奥科斯塔-这是因为你的问题中的样本似乎想要考虑IdFunCialio和IdiaFaRias,并计算那些对极限的独特组合。如果你只是想限制其中一列,那么在明显的地方去掉另一列。我找到了另一个似乎有效的解决方案。不管怎样,谢谢你的帮助!